diff --git a/res/layout-sw720dp/launcher.xml b/res/layout-sw720dp/launcher.xml
index 9ddb135..418469b 100644
--- a/res/layout-sw720dp/launcher.xml
+++ b/res/layout-sw720dp/launcher.xml
@@ -28,9 +28,9 @@
     <include
         android:id="@+id/dock_divider"
         layout="@layout/workspace_divider"
-        android:layout_width="@dimen/workspace_divider_width"
+        android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:layout_marginBottom="@dimen/button_bar_height"
+        android:layout_marginBottom="@dimen/button_bar_height_plus_padding"
         android:layout_gravity="bottom|center_horizontal" />
     <include
         android:id="@+id/paged_view_indicator"
@@ -38,7 +38,7 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_gravity="bottom"
-        android:layout_marginBottom="@dimen/button_bar_height" />
+        android:layout_marginBottom="@dimen/button_bar_height_plus_padding" />
 
     <!-- The workspace contains 5 screens of cells -->
     <com.android.launcher2.Workspace
diff --git a/res/values-sw600dp/config.xml b/res/values-sw600dp/config.xml
index bbb22c5..eab77f9 100644
--- a/res/values-sw600dp/config.xml
+++ b/res/values-sw600dp/config.xml
@@ -21,5 +21,5 @@
 
 <!-- Hotseat -->
     <!-- must be between 0 and 100 -->
-    <integer name="hotseat_item_scale_percentage">90</integer>
+    <integer name="hotseat_item_scale_percentage">80</integer>
 </resources>
diff --git a/res/values-sw720dp-port/dimens.xml b/res/values-sw720dp-port/dimens.xml
index 5528ae6..84ef395 100644
--- a/res/values-sw720dp-port/dimens.xml
+++ b/res/values-sw720dp-port/dimens.xml
@@ -43,8 +43,9 @@
     <integer name="apps_customize_cling_focused_x">2</integer>
     <integer name="apps_customize_cling_focused_y">2</integer>
 
-    <!-- Page width set to match a page of icons (96*k) -->
-    <dimen name="workspace_divider_width">768dp</dimen>
+    <!-- Divider width set to match the qsb width -->
+    <dimen name="workspace_divider_padding_left">112dp</dimen>
+    <dimen name="workspace_divider_padding_right">112dp</dimen>
 
 <!-- Hotseat -->
     <dimen name="hotseat_width_gap">16dp</dimen>
diff --git a/res/values-sw720dp/dimens.xml b/res/values-sw720dp/dimens.xml
index 54ac870..fe7083d 100644
--- a/res/values-sw720dp/dimens.xml
+++ b/res/values-sw720dp/dimens.xml
@@ -16,16 +16,17 @@
 
 <resources>
     <dimen name="app_icon_size">72dp</dimen>
+    <dimen name="app_icon_padding_top">0dp</dimen>
     <dimen name="reveal_radius">72dp</dimen>
 
 <!-- Hotseat -->
-    <dimen name="button_bar_height">96dp</dimen>
-    <dimen name="button_bar_height_top_padding">0dp</dimen>
-    <dimen name="button_bar_height_bottom_padding">0dp</dimen>
-    <dimen name="button_bar_width_left_padding">0dp</dimen>
-    <dimen name="button_bar_width_right_padding">0dp</dimen>
-    <dimen name="button_bar_height_plus_padding">96dp</dimen>
-    <dimen name="hotseat_width_gap">48dp</dimen>
+    <dimen name="button_bar_height">82dp</dimen>
+    <dimen name="button_bar_height_top_padding">12dp</dimen>
+    <dimen name="button_bar_height_bottom_padding">12dp</dimen>
+    <dimen name="button_bar_width_left_padding">12dp</dimen>
+    <dimen name="button_bar_width_right_padding">12dp</dimen>
+    <dimen name="button_bar_height_plus_padding">82dp</dimen>
+    <dimen name="hotseat_width_gap">50dp</dimen>
 
 <!-- QSB -->
     <dimen name="toolbar_button_vertical_padding">8dip</dimen>
@@ -58,14 +59,14 @@
     <dimen name="dragViewOffsetY">0dp</dimen>
 
 <!-- CellLayout padding land / port-->
-    <dimen name="cell_layout_left_padding_port">0dp</dimen>
-    <dimen name="cell_layout_left_padding_land">0dp</dimen>
-    <dimen name="cell_layout_right_padding_port">0dp</dimen>
-    <dimen name="cell_layout_right_padding_land">0dp</dimen>
-    <dimen name="cell_layout_top_padding_port">0dp</dimen>
-    <dimen name="cell_layout_top_padding_land">0dp</dimen>
-    <dimen name="cell_layout_bottom_padding_port">0dp</dimen>
-    <dimen name="cell_layout_bottom_padding_land">0dp</dimen>
+    <dimen name="cell_layout_left_padding_port">4dp</dimen>
+    <dimen name="cell_layout_left_padding_land">4dp</dimen>
+    <dimen name="cell_layout_right_padding_port">4dp</dimen>
+    <dimen name="cell_layout_right_padding_land">4dp</dimen>
+    <dimen name="cell_layout_top_padding_port">12dp</dimen>
+    <dimen name="cell_layout_top_padding_land">12dp</dimen>
+    <dimen name="cell_layout_bottom_padding_port">8dp</dimen>
+    <dimen name="cell_layout_bottom_padding_land">8dp</dimen>
 
 <!-- Folders -->
     <!-- The size of the image which sits behind the preview of the folder contents -->
@@ -84,15 +85,13 @@
 
     <dimen name="workspace_top_padding_port">@dimen/qsb_bar_height_inset</dimen>
     <dimen name="workspace_top_padding_land">@dimen/qsb_bar_height_inset</dimen>
-    <!-- XXX: This should be @dimen/button_bar_height + bottom padding, but because we are not using
-              the hotseat with the smaller icons, this is slightly larger than final dimensions. -->
-    <dimen name="workspace_bottom_padding_port">110dp</dimen>
-    <dimen name="workspace_bottom_padding_land">100dp</dimen>
+    <dimen name="workspace_bottom_padding_port">@dimen/button_bar_height_plus_padding</dimen>
+    <dimen name="workspace_bottom_padding_land">@dimen/button_bar_height_plus_padding</dimen>
 
-    <!-- Page width set to match a page of icons (96*k + 46*(k-1) - 2*12[icon padding]) -->
-    <dimen name="workspace_divider_width">1066dp</dimen>
-    <dimen name="workspace_divider_padding_left">0dp</dimen>
-    <dimen name="workspace_divider_padding_right">0dp</dimen>
+    <!-- Divider width set to match the qsb width -->
+    <dimen name="workspace_divider_width">0dp</dimen>
+    <dimen name="workspace_divider_padding_left">249dp</dimen>
+    <dimen name="workspace_divider_padding_right">249dp</dimen>
     <dimen name="workspace_divider_padding_top">0dp</dimen>
     <dimen name="workspace_divider_padding_bottom">0dp</dimen>
 
diff --git a/src/com/android/launcher2/DeferredHandler.java b/src/com/android/launcher2/DeferredHandler.java
index b7e48b1..cee27df 100644
--- a/src/com/android/launcher2/DeferredHandler.java
+++ b/src/com/android/launcher2/DeferredHandler.java
@@ -16,12 +16,13 @@
 
 package com.android.launcher2;
 
-import java.util.LinkedList;
-
 import android.os.Handler;
 import android.os.Looper;
 import android.os.Message;
 import android.os.MessageQueue;
+import android.util.Pair;
+import java.util.LinkedList;
+import java.util.ListIterator;
 
 /**
  * Queue of things to run on a looper thread.  Items posted with {@link #post} will not
@@ -31,18 +32,20 @@
  * This class is fifo.
  */
 public class DeferredHandler {
-    private LinkedList<Runnable> mQueue = new LinkedList<Runnable>();
+    private LinkedList<Pair<Runnable, Integer>> mQueue = new LinkedList<Pair<Runnable, Integer>>();
     private MessageQueue mMessageQueue = Looper.myQueue();
     private Impl mHandler = new Impl();
 
     private class Impl extends Handler implements MessageQueue.IdleHandler {
         public void handleMessage(Message msg) {
+            Pair<Runnable, Integer> p;
             Runnable r;
             synchronized (mQueue) {
                 if (mQueue.size() == 0) {
                     return;
                 }
-                r = mQueue.removeFirst();
+                p = mQueue.removeFirst();
+                r = p.first;
             }
             r.run();
             synchronized (mQueue) {
@@ -73,8 +76,11 @@
 
     /** Schedule runnable to run after everything that's on the queue right now. */
     public void post(Runnable runnable) {
+        post(runnable, 0);
+    }
+    public void post(Runnable runnable, int type) {
         synchronized (mQueue) {
-            mQueue.add(runnable);
+            mQueue.add(new Pair<Runnable, Integer>(runnable, type));
             if (mQueue.size() == 1) {
                 scheduleNextLocked();
             }
@@ -83,7 +89,10 @@
 
     /** Schedule runnable to run when the queue goes idle. */
     public void postIdle(final Runnable runnable) {
-        post(new IdleRunnable(runnable));
+        postIdle(runnable, 0);
+    }
+    public void postIdle(final Runnable runnable, int type) {
+        post(new IdleRunnable(runnable), type);
     }
 
     public void cancelRunnable(Runnable runnable) {
@@ -91,6 +100,18 @@
             while (mQueue.remove(runnable)) { }
         }
     }
+    public void cancelAllRunnablesOfType(int type) {
+        synchronized (mQueue) {
+            ListIterator<Pair<Runnable, Integer>> iter = mQueue.listIterator();
+            Pair<Runnable, Integer> p;
+            while (iter.hasNext()) {
+                p = iter.next();
+                if (p.second == type) {
+                    iter.remove();
+                }
+            }
+        }
+    }
 
     public void cancel() {
         synchronized (mQueue) {
@@ -100,19 +121,20 @@
 
     /** Runs all queued Runnables from the calling thread. */
     public void flush() {
-        LinkedList<Runnable> queue = new LinkedList<Runnable>();
+        LinkedList<Pair<Runnable, Integer>> queue = new LinkedList<Pair<Runnable, Integer>>();
         synchronized (mQueue) {
             queue.addAll(mQueue);
             mQueue.clear();
         }
-        for (Runnable r : queue) {
-            r.run();
+        for (Pair<Runnable, Integer> p : queue) {
+            p.first.run();
         }
     }
 
     void scheduleNextLocked() {
         if (mQueue.size() > 0) {
-            Runnable peek = mQueue.getFirst();
+            Pair<Runnable, Integer> p = mQueue.getFirst();
+            Runnable peek = p.first;
             if (peek instanceof IdleRunnable) {
                 mMessageQueue.addIdleHandler(mHandler);
             } else {
diff --git a/src/com/android/launcher2/Launcher.java b/src/com/android/launcher2/Launcher.java
index 1e138f7..2fcf869 100644
--- a/src/com/android/launcher2/Launcher.java
+++ b/src/com/android/launcher2/Launcher.java
@@ -1486,8 +1486,11 @@
 
         TextKeyListener.getInstance().release();
 
-
-        unbindWorkspaceAndHotseatItems();
+        // Disconnect any of the callbacks and drawables associated with ItemInfos on the workspace
+        // to prevent leaking Launcher activities on orientation change.
+        if (mModel != null) {
+            mModel.unbindItemInfosAndClearQueuedBindRunnables();
+        }
 
         getContentResolver().unregisterContentObserver(mWidgetObserver);
         unregisterReceiver(mCloseSystemDialogsReceiver);
@@ -1878,16 +1881,6 @@
     }
 
     /**
-     * Go through the and disconnect any of the callbacks in the drawables and the views or we
-     * leak the previous Home screen on orientation change.
-     */
-    private void unbindWorkspaceAndHotseatItems() {
-        if (mModel != null) {
-            mModel.unbindWorkspaceItems();
-        }
-    }
-
-    /**
      * Launches the intent referred by the clicked shortcut.
      *
      * @param v The view representing the clicked shortcut.
diff --git a/src/com/android/launcher2/LauncherModel.java b/src/com/android/launcher2/LauncherModel.java
index 7927593..269a0fd 100644
--- a/src/com/android/launcher2/LauncherModel.java
+++ b/src/com/android/launcher2/LauncherModel.java
@@ -82,6 +82,12 @@
     private LoaderTask mLoaderTask;
     private boolean mIsLoaderTaskRunning;
 
+    // Specific runnable types that are run on the main thread deferred handler, this allows us to
+    // clear all queued binding runnables when the Launcher activity is destroyed.
+    private static final int MAIN_THREAD_NORMAL_RUNNABLE = 0;
+    private static final int MAIN_THREAD_BINDING_RUNNABLE = 1;
+
+
     private static final HandlerThread sWorkerThread = new HandlerThread("launcher-loader");
     static {
         sWorkerThread.start();
@@ -177,6 +183,9 @@
     /** Runs the specified runnable immediately if called from the main thread, otherwise it is
      * posted on the main thread handler. */
     private void runOnMainThread(Runnable r) {
+        runOnMainThread(r, 0);
+    }
+    private void runOnMainThread(Runnable r, int type) {
         if (sWorkerThread.getThreadId() == Process.myTid()) {
             // If we are on the worker thread, post onto the main handler
             mHandler.post(r);
@@ -200,17 +209,22 @@
         return Bitmap.createBitmap(mDefaultIcon);
     }
 
-    public void unbindWorkspaceItems() {
-        sWorker.post(new Runnable() {
-            @Override
-            public void run() {
-                unbindWorkspaceItemsOnMainThread();
-            }
-        });
+    public void unbindItemInfosAndClearQueuedBindRunnables() {
+        if (sWorkerThread.getThreadId() == Process.myTid()) {
+            throw new RuntimeException("Expected unbindLauncherItemInfos() to be called from the " +
+                    "main thread");
+        }
+
+        // Clear any deferred bind runnables
+        mDeferredBindRunnables.clear();
+        // Remove any queued bind runnables
+        mHandler.cancelAllRunnablesOfType(MAIN_THREAD_BINDING_RUNNABLE);
+        // Unbind all the workspace items
+        unbindWorkspaceItemsOnMainThread();
     }
 
     /** Unbinds all the sBgWorkspaceItems and sBgAppWidgets on the main thread */
-    private void unbindWorkspaceItemsOnMainThread() {
+    void unbindWorkspaceItemsOnMainThread() {
         // Ensure that we don't use the same workspace items data structure on the main thread
         // by making a copy of workspace items first.
         final ArrayList<ItemInfo> tmpWorkspaceItems = new ArrayList<ItemInfo>();
@@ -880,7 +894,7 @@
         // Post the remaining side pages to be loaded
         if (!mDeferredBindRunnables.isEmpty()) {
             for (final Runnable r : mDeferredBindRunnables) {
-                mHandler.post(r);
+                mHandler.post(r, MAIN_THREAD_BINDING_RUNNABLE);
             }
             mDeferredBindRunnables.clear();
         }
@@ -1602,7 +1616,7 @@
                 if (postOnMainThread) {
                     deferredBindRunnables.add(r);
                 } else {
-                    runOnMainThread(r);
+                    runOnMainThread(r, MAIN_THREAD_BINDING_RUNNABLE);
                 }
             }
 
@@ -1619,7 +1633,7 @@
                 if (postOnMainThread) {
                     deferredBindRunnables.add(r);
                 } else {
-                    runOnMainThread(r);
+                    runOnMainThread(r, MAIN_THREAD_BINDING_RUNNABLE);
                 }
             }
 
@@ -1638,7 +1652,7 @@
                 if (postOnMainThread) {
                     deferredBindRunnables.add(r);
                 } else {
-                    runOnMainThread(r);
+                    runOnMainThread(r, MAIN_THREAD_BINDING_RUNNABLE);
                 }
             }
         }
@@ -1706,7 +1720,7 @@
                     }
                 }
             };
-            runOnMainThread(r);
+            runOnMainThread(r, MAIN_THREAD_BINDING_RUNNABLE);
 
             // Load items on the current page
             bindWorkspaceItems(oldCallbacks, currentWorkspaceItems, currentAppWidgets,
@@ -1720,7 +1734,7 @@
                         }
                     }
                 };
-                runOnMainThread(r);
+                runOnMainThread(r, MAIN_THREAD_BINDING_RUNNABLE);
             }
 
             // Load all the remaining pages (if we are loading synchronously, we want to defer this
@@ -1749,7 +1763,7 @@
             if (isLoadingSynchronously) {
                 mDeferredBindRunnables.add(r);
             } else {
-                runOnMainThread(r);
+                runOnMainThread(r, MAIN_THREAD_BINDING_RUNNABLE);
             }
         }
 
