diff --git a/res/drawable-hdpi/label_bg_holo_light.9.png b/res/drawable-hdpi/folder_bg_holo_light.9.png
similarity index 100%
rename from res/drawable-hdpi/label_bg_holo_light.9.png
rename to res/drawable-hdpi/folder_bg_holo_light.9.png
Binary files differ
diff --git a/res/drawable-mdpi/label_bg_holo_light.9.png b/res/drawable-mdpi/folder_bg_holo_light.9.png
similarity index 100%
rename from res/drawable-mdpi/label_bg_holo_light.9.png
rename to res/drawable-mdpi/folder_bg_holo_light.9.png
Binary files differ
diff --git a/res/drawable-sw600dp-hdpi/label_bg_holo_light.9.png b/res/drawable-sw600dp-hdpi/folder_bg_holo_light.9.png
similarity index 100%
rename from res/drawable-sw600dp-hdpi/label_bg_holo_light.9.png
rename to res/drawable-sw600dp-hdpi/folder_bg_holo_light.9.png
Binary files differ
diff --git a/res/drawable-sw600dp-mdpi/label_bg_holo_light.9.png b/res/drawable-sw600dp-mdpi/folder_bg_holo_light.9.png
similarity index 100%
rename from res/drawable-sw600dp-mdpi/label_bg_holo_light.9.png
rename to res/drawable-sw600dp-mdpi/folder_bg_holo_light.9.png
Binary files differ
diff --git a/res/drawable-sw600dp-xhdpi/label_bg_holo_light.9.png b/res/drawable-sw600dp-xhdpi/folder_bg_holo_light.9.png
similarity index 100%
rename from res/drawable-sw600dp-xhdpi/label_bg_holo_light.9.png
rename to res/drawable-sw600dp-xhdpi/folder_bg_holo_light.9.png
Binary files differ
diff --git a/res/drawable-xhdpi/label_bg_holo_light.9.png b/res/drawable-xhdpi/folder_bg_holo_light.9.png
similarity index 100%
rename from res/drawable-xhdpi/label_bg_holo_light.9.png
rename to res/drawable-xhdpi/folder_bg_holo_light.9.png
Binary files differ
diff --git a/res/layout/label_switch_spinner_dropdown_item.xml b/res/layout/folder_switch_spinner_dropdown_item.xml
similarity index 100%
rename from res/layout/label_switch_spinner_dropdown_item.xml
rename to res/layout/folder_switch_spinner_dropdown_item.xml
diff --git a/res/layout/two_pane_activity.xml b/res/layout/two_pane_activity.xml
index fa6e943..7b08f4a 100644
--- a/res/layout/two_pane_activity.xml
+++ b/res/layout/two_pane_activity.xml
@@ -25,9 +25,10 @@
   android:layout_height="match_parent" >
 
   <FrameLayout
-    android:id="@+id/labels_pane"
-    android:layout_width="@dimen/label_list_pane_width"
-    android:layout_height="match_parent"/>
+    android:id="@+id/folders_pane"
+    android:layout_width="@dimen/folder_list_pane_width"
+    android:layout_height="match_parent"
+    android:background="@drawable/folder_bg_holo_light"/>
 
   <RelativeLayout
         android:layout_width="wrap_content"
diff --git a/res/values/constants.xml b/res/values/constants.xml
index fddacc1..4229c70 100644
--- a/res/values/constants.xml
+++ b/res/values/constants.xml
@@ -36,7 +36,7 @@
          different views. For the default layout (phone), these values
          are equal. These are only used in TwoPaneLayout, so they need
          to be specified for sw600dp and sw720dp layouts. -->
-    <integer name="label_list_weight">1</integer>
+    <integer name="folder_list_weight">1</integer>
     <integer name="conversation_list_weight">1</integer>
     <integer name="conversation_view_weight">1</integer>
     <!-- Max unread count to show for a folder -->
diff --git a/res/values/two_pane_dimen.xml b/res/values/two_pane_dimen.xml
index 712c227..c55ac0c 100644
--- a/res/values/two_pane_dimen.xml
+++ b/res/values/two_pane_dimen.xml
@@ -17,9 +17,8 @@
 -->
 
 <resources>
-    <dimen name="label_list_pane_width">320dip</dimen>
-    <dimen name="label_list_minimum_height">48dip</dimen>
-    <dimen name="label_list_label_color_width">36dip</dimen>
+    <dimen name="folder_list_pane_width">320dip</dimen>
+    <dimen name="folder_list_label_color_width">36dip</dimen>
     <dimen name="new_message_notification_width">896dip</dimen>
     <dimen name="empty_view_top_padding">38dip</dimen>
 </resources>
diff --git a/src/com/android/mail/browse/ConversationItemView.java b/src/com/android/mail/browse/ConversationItemView.java
index 7ccc5a0..f982669 100644
--- a/src/com/android/mail/browse/ConversationItemView.java
+++ b/src/com/android/mail/browse/ConversationItemView.java
@@ -176,7 +176,7 @@
             IMPORTANT_TO_OTHERS = BitmapFactory.decodeResource(res,
                     R.drawable.ic_email_caret_none_important_unread);
             ATTACHMENT = BitmapFactory.decodeResource(res, R.drawable.ic_attachment_holo_light);
-            DATE_BACKGROUND = BitmapFactory.decodeResource(res, R.drawable.label_bg_holo_light);
+            DATE_BACKGROUND = BitmapFactory.decodeResource(res, R.drawable.folder_bg_holo_light);
 
             // Initialize colors.
             DEFAULT_TEXT_COLOR = res.getColor(R.color.default_text_color);
diff --git a/src/com/android/mail/ui/AbstractActivityController.java b/src/com/android/mail/ui/AbstractActivityController.java
index 6613dbe..6714d15 100644
--- a/src/com/android/mail/ui/AbstractActivityController.java
+++ b/src/com/android/mail/ui/AbstractActivityController.java
@@ -149,15 +149,13 @@
     }
 
     @Override
-    public String getCurrentAccount() {
-        // TODO(viki): Auto-generated method stub
-        return null;
+    public Account getCurrentAccount() {
+        return mAccount;
     }
 
     @Override
     public ConversationListContext getCurrentListContext() {
-        // TODO(viki): Auto-generated method stub
-        return null;
+        return mConvListContext;
     }
 
     @Override
@@ -381,8 +379,6 @@
 
     @Override
     public void onResume() {
-        // TODO(viki): Auto-generated method stub
-        //        mBatchConversations.addObserver(this);
         if (mActionBarView != null) {
             mActionBarView.onResume();
         }
@@ -405,31 +401,26 @@
     @Override
     public void onSearchRequested() {
         // TODO(viki): Auto-generated method stub
-
     }
 
     @Override
     public void onStartBulkOperation() {
         // TODO(viki): Auto-generated method stub
-
     }
 
     @Override
     public void onStartDragMode() {
         // TODO(viki): Auto-generated method stub
-
     }
 
     @Override
     public void onStop() {
         // TODO(viki): Auto-generated method stub
-
     }
 
     @Override
     public void onStopDragMode() {
         // TODO(viki): Auto-generated method stub
-
     }
 
     /**
@@ -445,7 +436,7 @@
         // reset the action bar icon based on the mode. Why don't the individual controllers do
         // this themselves?
 
-        // On conversation list mode, clean up the conversation.
+        // In conversation list mode, clean up the conversation.
         if (newMode == ViewMode.CONVERSATION_LIST) {
             // Clean up the conversation here.
         }
@@ -460,13 +451,11 @@
     @Override
     public void onWindowFocusChanged(boolean hasFocus) {
         // TODO(viki): Auto-generated method stub
-
     }
 
     @Override
     public void reloadSearch(String string) {
         // TODO(viki): Auto-generated method stub
-
     }
 
     /**
@@ -488,9 +477,6 @@
     protected void restoreState(Bundle savedState) {
         if (savedState != null) {
             restoreListContext(savedState);
-            // Restore the list context
-            restoreListContext(savedState);
-
             // Attach the menu handler here.
 
             // Restore the view mode
@@ -507,19 +493,16 @@
     @Override
     public void startActionBarStatusCursorLoader(String account) {
         // TODO(viki): Auto-generated method stub
-
     }
 
     @Override
     public void stopActionBarStatusCursorLoader(String account) {
         // TODO(viki): Auto-generated method stub
-
     }
 
     @Override
     public void toggleStar(boolean toggleOn, long conversationId, long maxMessageId) {
         // TODO(viki): Auto-generated method stub
-
     }
 
     @Override
@@ -588,7 +571,6 @@
         // onLoadFinished will be called and we will be fine.
     }
 
-
     @Override
     public void onTouchEvent(MotionEvent event) {
         if (event.getAction() == MotionEvent.ACTION_DOWN) {
diff --git a/src/com/android/mail/ui/MailActionBar.java b/src/com/android/mail/ui/MailActionBar.java
index 728cd13..af17028 100644
--- a/src/com/android/mail/ui/MailActionBar.java
+++ b/src/com/android/mail/ui/MailActionBar.java
@@ -68,7 +68,7 @@
         /**
          * Returns the current account.
          */
-        String getCurrentAccount();
+        Account getCurrentAccount();
 
         /**
          * Called when the TwoPaneActionBar wants to get the current conversation list context.
diff --git a/src/com/android/mail/ui/TwoPaneController.java b/src/com/android/mail/ui/TwoPaneController.java
index 3204e7a..c7b7c9a 100644
--- a/src/com/android/mail/ui/TwoPaneController.java
+++ b/src/com/android/mail/ui/TwoPaneController.java
@@ -52,6 +52,13 @@
         if (show) {
             mViewMode.enterConversationListMode();
         }
+        renderConversationList();
+    }
+
+    /**
+     * Render the conversation list in the correct pane.
+     */
+    private void renderConversationList() {
         FragmentTransaction fragmentTransaction = mActivity.getFragmentManager().beginTransaction();
         // Use cross fading animation.
         fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
@@ -61,6 +68,19 @@
         fragmentTransaction.commitAllowingStateLoss();
     }
 
+    /**
+     * Render the folder list in the correct pane.
+     */
+    private void renderFolderList() {
+        Fragment folderListFragment = FolderListFragment.newInstance(this, mAccount.folderListUri);
+        FragmentTransaction fragmentTransaction = mActivity.getFragmentManager().beginTransaction();
+        fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
+        fragmentTransaction.replace(R.id.folders_pane, folderListFragment);
+        fragmentTransaction.commitAllowingStateLoss();
+        // Since we are showing the folder list, we are at the start of the view stack.
+        resetActionBarIcon();
+    }
+
     @Override
     protected boolean isConversationListVisible() {
         // TODO(viki): Auto-generated method stub
@@ -70,17 +90,19 @@
     @Override
     public void showConversationList(ConversationListContext context) {
         initializeConversationListFragment(true);
+        renderFolderList();
     }
 
     @Override
     public void showFolderList() {
-        // TODO: auto-generated method stub.
+        // On two-pane layouts, showing the folder list takes you to the top level of the
+        // application, which is the same as pressing the Up button
+        onUpPressed();
     }
 
     @Override
     public boolean onCreate(Bundle savedState) {
         mActivity.setContentView(R.layout.two_pane_activity);
-
         mLayout = (TwoPaneLayout) mActivity.findViewById(R.id.two_pane_activity);
         mLayout.initializeLayout(mActivity.getApplicationContext());
 
@@ -90,11 +112,6 @@
         mLayout.setListener(this);
 
         final boolean isParentInitialized = super.onCreate(savedState);
-        if (isParentInitialized && savedState == null) {
-            // Show a Label list, in the real application
-            // renderLabelList();
-            // In our case, we show a conversation list for everything.
-        }
         return isParentInitialized;
     }
 
@@ -122,13 +139,32 @@
         mViewMode.enterConversationMode();
     }
 
-    @Override
-    public boolean onUpPressed() {
+    /**
+     * Show the conversation list if it can be shown in the current orientation.
+     * @return true if the conversation list was shown
+     */
+    private boolean unhideConversationList(){
+        // Find if the conversation list can be shown
+        final boolean isConversationListShowable =
+                (mViewMode.getMode() == ViewMode.CONVERSATION &&
+                mLayout.isConversationListCollapsible());
+        if (isConversationListShowable) {
+            return mLayout.uncollapseList();
+        }
         return false;
     }
 
     @Override
+    public boolean onUpPressed() {
+        return unhideConversationList();
+    }
+
+    @Override
     public boolean onBackPressed() {
-        return false;
+        if (!(mViewMode.getMode() == ViewMode.CONVERSATION)){
+            return mViewMode.enterConversationListMode();
+        }
+        mActivity.finish();
+        return true;
     }
 }
diff --git a/src/com/android/mail/ui/TwoPaneLayout.java b/src/com/android/mail/ui/TwoPaneLayout.java
index 0d132af..c96c9b0 100644
--- a/src/com/android/mail/ui/TwoPaneLayout.java
+++ b/src/com/android/mail/ui/TwoPaneLayout.java
@@ -58,14 +58,14 @@
  * according to the specific <i>modes</i> the {@link Activity} can be in.
  *
  * Currently, the layout differs in three dimensions: orientation, two aspects of view modes.
- * This results in essentially three states: One where the labels are on the left and conversation
+ * This results in essentially three states: One where the folders are on the left and conversation
  * list is on the right, and two states where the conversation list is on the left: one in which
  * it's collapsed and another where it is not.
  *
- * In Label or conversation list view, conversations are hidden and labels and conversation lists
+ * In folder or conversation list view, conversations are hidden and folders and conversation lists
  * are visible. This is the case in both portrait and landscape
  *
- * In Conversation List or Conversation View, labels are hidden, and conversation lists and
+ * In Conversation List or Conversation View, folders are hidden, and conversation lists and
  * conversation view is visible. This is the case in both portrait and landscape.
  *
  * In the Gmail source code, this was called TriStateSplitLayout
@@ -86,7 +86,7 @@
     private static int sAnimationSlideLeftDuration;
     private static int sAnimationSlideRightDuration;
     private static double sScaledConversationListWeight;
-    private static double sScaledLabelListWeight;
+    private static double sScaledFolderListWeight;
     /**
      * The current mode that the tablet layout is in. This is a constant integer that holds values
      * that are {@link ViewMode} constants like {@link ViewMode#CONVERSATION}.
@@ -106,8 +106,8 @@
     private View mConversationView;
     private View mConversationViewOverlay;
     /** Left position of each fragment. */
-    private int mLabelsLeft;
-    private View mLabelsView;
+    private int mFoldersLeft;
+    private View mFoldersView;
     private int mListAlpha;
 
     /** Captured bitmap of each fragment. */
@@ -197,7 +197,7 @@
         public void onAnimationStart(Animator animation) {
             switch (listener_type) {
                 case CONVERSATION_LIST:
-                    mLabelsView.setVisibility(View.VISIBLE);
+                    mFoldersView.setVisibility(View.VISIBLE);
             }
         }
     }
@@ -290,7 +290,7 @@
     private int computeConversationListWidth(int totalWidth) {
         switch (currentMode) {
             case ViewMode.CONVERSATION_LIST:
-                return totalWidth - computeLabelListWidth();
+                return totalWidth - computeFolderListWidth();
             case ViewMode.CONVERSATION:
                 return (int) (totalWidth * sScaledConversationListWeight);
         }
@@ -322,17 +322,10 @@
     }
 
     /**
-     * Computes the width of the label list in stable state of the current mode.
+     * Computes the width of the folder list in stable state of the current mode.
      */
-    private int computeLabelListWidth() {
-        return computeLabelListWidth(getMeasuredWidth());
-    }
-
-    /**
-     * Computes the width of the label list in stable state of the current mode.
-     */
-    private int computeLabelListWidth(int totalWidth) {
-        return (int) (totalWidth * sScaledLabelListWeight);
+    private int computeFolderListWidth() {
+        return (int) (getMeasuredWidth() * sScaledFolderListWeight);
     }
 
     /**
@@ -374,8 +367,8 @@
         }
 
         canvas.save();
-        canvas.translate(mLabelsLeft, 0);
-        mLabelsView.draw(canvas);
+        canvas.translate(mFoldersLeft, 0);
+        mFoldersView.draw(canvas);
         canvas.restore();
 
         // The bitmap can be null if the view hasn't been drawn by the time we capture the bitmap.
@@ -402,21 +395,21 @@
         // On the initial call, measurements may not have been done (i.e. this
         // Layout has never been rendered), so no animation will be done.
         if (getMeasuredWidth() == 0) {
-            mLabelsView.setVisibility(View.VISIBLE);
+            mFoldersView.setVisibility(View.VISIBLE);
             onFinishEnteringConversationListMode();
             return;
         }
 
-        // Slide labels in from the left.
-        setLabelListWidth(computeLabelListWidth());
+        // Slide folder list in from the left.
+        final int folderListWidth = computeFolderListWidth();
+        setFolderListWidth(folderListWidth);
 
         // Prepare animation.
         mAnimatingFade = true;
         captureListBitmaps();
         ArrayList<PropertyValuesHolder> values = Lists.newArrayList();
 
-        int labelsWidth = computeLabelListWidth();
-        values.add(PropertyValuesHolder.ofInt("labelsLeft", -labelsWidth, 0));
+        values.add(PropertyValuesHolder.ofInt("foldersLeft", -folderListWidth, 0));
 
         // Reset the relative left of the list view.
         setConversationListLeft(0);
@@ -430,8 +423,8 @@
         animator.setDuration((long) (sAnimationSlideRightDuration * SLIDE_DURATION_SCALE));
         animator.setInterpolator(sRightInterpolator);
 
-        values.add(PropertyValuesHolder.ofInt("listBitmapLeft", 0, labelsWidth));
-        values.add(PropertyValuesHolder.ofInt("listLeft", 0, labelsWidth));
+        values.add(PropertyValuesHolder.ofInt("listBitmapLeft", 0, folderListWidth));
+        values.add(PropertyValuesHolder.ofInt("listLeft", 0, folderListWidth));
         values.add(PropertyValuesHolder.ofInt("listAlpha", 0, 255));
 
         // Slide conversation out to the right.
@@ -465,9 +458,9 @@
         captureListBitmaps();
         ArrayList<PropertyValuesHolder> values = Lists.newArrayList();
 
-        // Slide labels out towards the left off screen.
-        int labelsWidth = mLabelsView.getMeasuredWidth();
-        values.add(PropertyValuesHolder.ofInt("labelsLeft", 0, -labelsWidth));
+        // Slide folders out towards the left off screen.
+        int foldersWidth = mFoldersView.getMeasuredWidth();
+        values.add(PropertyValuesHolder.ofInt("foldersLeft", 0, -foldersWidth));
 
         // Shrink the conversation list to make room for the conversation, and default
         // it to collapsed in case it is collapsible.
@@ -475,7 +468,7 @@
         int targetWidth = computeConversationListWidth();
         setConversationListWidth(targetWidth);
 
-        int currentListLeft = labelsWidth + getConversationListLeft();
+        int currentListLeft = foldersWidth + getConversationListLeft();
         int targetListLeft = computeConversationListLeft(targetWidth);
         setConversationListLeft(targetListLeft);
         if (currentListLeft != targetListLeft) {
@@ -516,7 +509,7 @@
         mContext = context;
 
         Resources res = getResources();
-        mLabelsView = findViewById(R.id.labels_pane);
+        mFoldersView = findViewById(R.id.folders_pane);
         mConversationListContainer = findViewById(R.id.conversation_column_container);
         mListView = findViewById(R.id.conversation_list);
         mConversationView = findViewById(R.id.conversation_pane_container);
@@ -527,14 +520,13 @@
         sAnimationSlideLeftDuration = res.getInteger(R.integer.activity_slide_left_duration);
         sAnimationSlideRightDuration = res.getInteger(R.integer.activity_slide_right_duration);
         sAnimationCollapseDuration = res.getInteger(R.integer.activity_collapse_duration);
-        final int sLabelListWeight = res.getInteger(R.integer.label_list_weight);
+        final int sFolderListWeight = res.getInteger(R.integer.folder_list_weight);
         final int sConversationListWeight = res.getInteger(R.integer.conversation_list_weight);
         final int sConversationViewWeight = res.getInteger(R.integer.conversation_view_weight);
-        sScaledLabelListWeight = (double) sLabelListWeight
-                / (sLabelListWeight + sConversationListWeight);
+        sScaledFolderListWeight = (double) sFolderListWeight
+                / (sFolderListWeight + sConversationListWeight);
         sScaledConversationListWeight = (double) sConversationListWeight
                 / (sConversationListWeight + sConversationViewWeight);
-
         mPaint = new Paint();
         mPaint.setAntiAlias(true);
         mPaint.setColor(android.R.color.white);
@@ -547,7 +539,7 @@
     }
 
     /**
-     * @return whether the conversation list can be collapsed or not.
+     * @return whether the conversation list can be collapsed or not. This depends on orientation.
      */
     public boolean isConversationListCollapsible() {
         return mContext.getResources().getInteger(R.integer.conversation_list_collapsible) != 0;
@@ -575,6 +567,7 @@
         mListCollapsed = false;
         mConversationView.setVisibility(View.GONE);
         mConversationViewOverlay.setVisibility(View.GONE);
+        mFoldersView.setVisibility(View.VISIBLE);
 
         // Once animations settle, the conversation list always takes up the
         // remaining space that is on the right, so avoid hard pixel values,
@@ -591,14 +584,11 @@
      * Finalizes state after animations settle when entering conversation mode.
      */
     private void onFinishEnteringConversationMode() {
-        mLabelsView.setVisibility(View.GONE);
-
+        mFoldersView.setVisibility(View.GONE);
         setConversationListWidth(computeConversationListWidth());
-
         if (isConversationListCollapsible()) {
             onCollapseList();
         }
-
         dispatchConversationVisibilityChanged(true);
     }
 
@@ -620,7 +610,7 @@
 
         switch (currentMode) {
             case ViewMode.CONVERSATION_LIST:
-                setLabelListWidth(computeLabelListWidth());
+                setFolderListWidth(computeFolderListWidth());
                 break;
 
             case ViewMode.CONVERSATION:
@@ -674,7 +664,6 @@
                 enterConversationListMode();
                 break;
             case ViewMode.FOLDER_LIST:
-                // Show Folder lists here
                 break;
             case ViewMode.SEARCH_RESULTS:
                 // Show search results here
@@ -718,12 +707,12 @@
     }
 
     /**
-     * Sets the width of the label list pane.
+     * Sets the width of the folder list pane.
      * Used internally and by animators. Not to be used externally.
      */
-    private void setLabelListWidth(int width) {
-        mLabelsView.getLayoutParams().width = width;
-        // Mindy points out that this is strange. Instead of requesting a layout for the labels
+    private void setFolderListWidth(int width) {
+        mFoldersView.getLayoutParams().width = width;
+        // Mindy points out that this is strange. Instead of requesting a layout for the folders
         // view, we should be requesting a layout for the entire view.
         // TODO(viki): Change to this.requestLayout() and see if there is any improvement or loss
         requestLayout();
@@ -732,12 +721,12 @@
     // TODO(viki): I think most of the next methods aren't being used. Rather than removing them,
     // I'm marking them private to remove once the application is complete.
     /**
-     * Sets the left position of the labels fragment. Used by animators. Not to
+     * Sets the left position of the folders fragment. Used by animators. Not to
      * be used externally.
      * @hide
      */
-    private void setLabelsLeft(int left) {
-        mLabelsLeft = left;
+    private void setFoldersLeft(int left) {
+        mFoldersLeft = left;
         invalidate();
     }
 
