diff --git a/Android.mk b/Android.mk
index 528e840..a9fa30a 100644
--- a/Android.mk
+++ b/Android.mk
@@ -22,7 +22,6 @@
 LOCAL_SRC_FILES := $(call all-subdir-java-files)
 
 LOCAL_PACKAGE_NAME := Launcher2
-LOCAL_CERTIFICATE := shared
 
 LOCAL_OVERRIDES_PACKAGES := Launcher
 
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index d2dae88..fce4230 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -20,8 +20,7 @@
 <manifest
     xmlns:android="http://schemas.android.com/apk/res/android"
     package="com.android.launcher2"
-    android:sharedUserId="android.uid.shared"
-    android:sharedUserLabel="@string/uid_name">
+    >
     
     <permission
         android:name="com.android.launcher.permission.INSTALL_SHORTCUT"
@@ -62,7 +61,6 @@
     
     <application
         android:name="LauncherApplication"
-        android:process="android.process.acore"
         android:label="@string/application_name"
         android:icon="@drawable/ic_launcher_home">
 
diff --git a/res/layout-land/launcher.xml b/res/layout-land/launcher.xml
index 4f2709f..5ec7c6c 100644
--- a/res/layout-land/launcher.xml
+++ b/res/layout-land/launcher.xml
@@ -39,12 +39,15 @@
         android:id="@+id/workspace"
         android:layout_width="fill_parent"
         android:layout_height="fill_parent"
-
-        launcher:defaultScreen="1">
+        android:scrollbars="horizontal"
+        android:fadeScrollbars="true"
+        launcher:defaultScreen="2">
 
         <include android:id="@+id/cell1" layout="@layout/workspace_screen" />
         <include android:id="@+id/cell2" layout="@layout/workspace_screen" />
         <include android:id="@+id/cell3" layout="@layout/workspace_screen" />
+        <include android:id="@+id/cell4" layout="@layout/workspace_screen" />
+        <include android:id="@+id/cell5" layout="@layout/workspace_screen" />
 
     </com.android.launcher2.Workspace>
 
diff --git a/res/layout-port/launcher.xml b/res/layout-port/launcher.xml
index 89b3b43..d3069a1 100644
--- a/res/layout-port/launcher.xml
+++ b/res/layout-port/launcher.xml
@@ -40,13 +40,16 @@
         android:id="@+id/workspace"
         android:layout_width="fill_parent"
         android:layout_height="fill_parent"
-
-        launcher:defaultScreen="1">
+        android:scrollbars="horizontal"
+        android:fadeScrollbars="true"
+        launcher:defaultScreen="2">
 
         <include android:id="@+id/cell1" layout="@layout/workspace_screen" />
         <include android:id="@+id/cell2" layout="@layout/workspace_screen" />
         <include android:id="@+id/cell3" layout="@layout/workspace_screen" />
-
+        <include android:id="@+id/cell4" layout="@layout/workspace_screen" />
+        <include android:id="@+id/cell5" layout="@layout/workspace_screen" />
+                
     </com.android.launcher2.Workspace>
 
     <com.android.launcher2.HandleView
diff --git a/res/xml/default_workspace.xml b/res/xml/default_workspace.xml
index 7937c3b..acb9ba9 100644
--- a/res/xml/default_workspace.xml
+++ b/res/xml/default_workspace.xml
@@ -17,49 +17,49 @@
 <favorites xmlns:launcher="http://schemas.android.com/apk/res/com.android.launcher2">
 
     <search
-        launcher:screen="1"
+        launcher:screen="2"
         launcher:x="0"
         launcher:y="0" />
 
     <favorite
         launcher:packageName="com.android.contacts"
         launcher:className="com.android.contacts.DialtactsActivity"
-        launcher:screen="1"
+        launcher:screen="2"
         launcher:x="0"
         launcher:y="3" />
 
     <favorite
         launcher:packageName="com.android.contacts"
         launcher:className="com.android.contacts.DialtactsContactsEntryActivity"
-        launcher:screen="1"
+        launcher:screen="2"
         launcher:x="1"
         launcher:y="3" />
 
     <favorite
         launcher:packageName="com.android.browser"
         launcher:className="com.android.browser.BrowserActivity"
-        launcher:screen="1"
+        launcher:screen="2"
         launcher:x="2"
         launcher:y="3" />
 
     <favorite
         launcher:packageName="com.google.android.apps.maps"
         launcher:className="com.google.android.maps.MapsActivity"
-        launcher:screen="1"
+        launcher:screen="2"
         launcher:x="3"
         launcher:y="3" />
 
     <favorite
         launcher:packageName="com.android.mms"
         launcher:className="com.android.mms.ui.ConversationList"
-        launcher:screen="1"
+        launcher:screen="2"
         launcher:x="0"
         launcher:y="2" />
 
     <favorite
         launcher:packageName="com.android.vending"
         launcher:className="com.android.vending.AssetBrowserActivity"
-        launcher:screen="1"
+        launcher:screen="2"
         launcher:x="3"
         launcher:y="2" />
 
diff --git a/src/com/android/launcher2/Launcher.java b/src/com/android/launcher2/Launcher.java
index 1574be8..9aa6cd3 100644
--- a/src/com/android/launcher2/Launcher.java
+++ b/src/com/android/launcher2/Launcher.java
@@ -66,6 +66,7 @@
 import android.appwidget.AppWidgetProviderInfo;
 
 import java.util.ArrayList;
+import java.util.Map.Entry;
 import java.util.HashMap;
 import java.io.DataOutputStream;
 import java.io.FileNotFoundException;
@@ -108,8 +109,8 @@
     static final String EXTRA_CUSTOM_WIDGET = "custom_widget";
     static final String SEARCH_WIDGET = "search_widget";
 
-    static final int SCREEN_COUNT = 3;
-    static final int DEFAULT_SCREN = 1;
+    static final int SCREEN_COUNT = 5;
+    static final int DEFAULT_SCREEN = 2;
     static final int NUMBER_CELLS_X = 4;
     static final int NUMBER_CELLS_Y = 4;
 
@@ -148,7 +149,7 @@
     static final int APPWIDGET_HOST_ID = 1024;
 
     private static final Object sLock = new Object();
-    private static int sScreen = DEFAULT_SCREN;
+    private static int sScreen = DEFAULT_SCREEN;
 
     private LayoutInflater mInflater;
 
@@ -375,8 +376,9 @@
                     // We just wanted the activity result here so we can clear mWaitingForResult
                     break;
             }
-        } else if (requestCode == REQUEST_PICK_APPWIDGET &&
-                resultCode == RESULT_CANCELED && data != null) {
+        } else if ((requestCode == REQUEST_PICK_APPWIDGET ||
+                requestCode == REQUEST_CREATE_APPWIDGET) && resultCode == RESULT_CANCELED &&
+                data != null) {
             // Clean up the appWidgetId if we canceled
             int appWidgetId = data.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1);
             if (appWidgetId != -1) {
@@ -679,7 +681,7 @@
         Bundle extras = data.getExtras();
         int appWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, -1);
 
-        d(LOG_TAG, "dumping extras content="+extras.toString());
+        if (LOGD) d(LOG_TAG, "dumping extras content=" + extras.toString());
 
         AppWidgetProviderInfo appWidgetInfo = mAppWidgetManager.getAppWidgetInfo(appWidgetId);
 
@@ -689,7 +691,10 @@
 
         // Try finding open space on Launcher screen
         final int[] xy = mCellCoordinates;
-        if (!findSlot(cellInfo, xy, spans[0], spans[1])) return;
+        if (!findSlot(cellInfo, xy, spans[0], spans[1])) {
+            if (appWidgetId != -1) mAppWidgetHost.deleteAppWidgetId(appWidgetId);
+            return;
+        }
 
         // Build Launcher-specific widget info and save to database
         LauncherAppWidgetInfo launcherInfo = new LauncherAppWidgetInfo(appWidgetId);
@@ -1841,7 +1846,8 @@
     /**
      * Implementation of the method from LauncherModel.Callbacks.
      */
-    void bindFolders(HashMap<Long, FolderInfo> folders) {
+    public void bindFolders(HashMap<Long, FolderInfo> folders) {
+        mFolders.clear();
         mFolders.putAll(folders);
     }
 
diff --git a/src/com/android/launcher2/LauncherModel.java b/src/com/android/launcher2/LauncherModel.java
index de4f35b..7b53cd7 100644
--- a/src/com/android/launcher2/LauncherModel.java
+++ b/src/com/android/launcher2/LauncherModel.java
@@ -66,6 +66,7 @@
         public int getCurrentWorkspaceScreen();
         public void startBinding();
         public void bindItems(ArrayList<ItemInfo> shortcuts, int start, int end);
+        public void bindFolders(HashMap<Long,FolderInfo> folders);
         public void finishBindingItems();
         public void bindAppWidget(LauncherAppWidgetInfo info);
         public void bindAllApplications(ArrayList<ApplicationInfo> apps);
@@ -378,7 +379,7 @@
 
         final ArrayList<ItemInfo> mItems = new ArrayList<ItemInfo>();
         final ArrayList<LauncherAppWidgetInfo> mAppWidgets = new ArrayList<LauncherAppWidgetInfo>();
-        final HashMap<Long, FolderInfo> folders = new HashMap<Long, FolderInfo>();
+        final HashMap<Long, FolderInfo> mFolders = new HashMap<Long, FolderInfo>();
                 
         /**
          * Call this from the ui thread so the handler is initialized on the correct thread.
@@ -695,16 +696,16 @@
                                     default:
                                         // Item is in a user folder
                                         UserFolderInfo folderInfo =
-                                                findOrMakeUserFolder(folders, container);
+                                                findOrMakeUserFolder(mFolders, container);
                                         folderInfo.add(info);
                                         break;
                                     }
                                 }
                                 break;
-                            case LauncherSettings.Favorites.ITEM_TYPE_USER_FOLDER:
 
+                            case LauncherSettings.Favorites.ITEM_TYPE_USER_FOLDER:
                                 id = c.getLong(idIndex);
-                                UserFolderInfo folderInfo = findOrMakeUserFolder(folders, id);
+                                UserFolderInfo folderInfo = findOrMakeUserFolder(mFolders, id);
 
                                 folderInfo.title = c.getString(titleIndex);
 
@@ -720,11 +721,14 @@
                                         mItems.add(folderInfo);
                                         break;
                                 }
+
+                                mFolders.put(folderInfo.id, folderInfo);
                                 break;
+
                             case LauncherSettings.Favorites.ITEM_TYPE_LIVE_FOLDER:
 
                                 id = c.getLong(idIndex);
-                                LiveFolderInfo liveFolderInfo = findOrMakeLiveFolder(folders, id);
+                                LiveFolderInfo liveFolderInfo = findOrMakeLiveFolder(mFolders, id);
 
                                 intentDescription = c.getString(intentIndex);
                                 intent = null;
@@ -755,7 +759,9 @@
                                         mItems.add(liveFolderInfo);
                                         break;
                                 }
+                                mFolders.put(liveFolderInfo.id, liveFolderInfo);
                                 break;
+
                             case LauncherSettings.Favorites.ITEM_TYPE_WIDGET_SEARCH:
                                 widgetInfo = Widget.makeSearch();
 
@@ -774,6 +780,7 @@
 
                                 mItems.add(widgetInfo);
                                 break;
+
                             case LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET:
                                 // Read all Launcher-specific widget details
                                 int appWidgetId = c.getInt(appWidgetIdIndex);
@@ -845,6 +852,14 @@
                         }
                     });
                 }
+                mHandler.post(new Runnable() {
+                    public void run() {
+                        Callbacks callbacks = tryGetCallbacks();
+                        if (callbacks != null) {
+                            callbacks.bindFolders(mFolders);
+                        }
+                    }
+                });
                 // Wait until the queue goes empty.
                 mHandler.postIdle(new Runnable() {
                     public void run() {
@@ -886,7 +901,6 @@
                         });
                     }
                 }
-                // TODO: Bind the folders
                 // Tell the workspace that we're done.
                 mHandler.post(new Runnable() {
                     public void run() {
diff --git a/src/com/android/launcher2/LauncherProvider.java b/src/com/android/launcher2/LauncherProvider.java
index 9226c22..942b4be 100644
--- a/src/com/android/launcher2/LauncherProvider.java
+++ b/src/com/android/launcher2/LauncherProvider.java
@@ -58,7 +58,7 @@
 
     private static final String DATABASE_NAME = "launcher.db";
     
-    private static final int DATABASE_VERSION = 4;
+    private static final int DATABASE_VERSION = 5;
 
     static final String AUTHORITY = "com.android.launcher2.settings";
     
@@ -393,6 +393,21 @@
                 }
             }
             
+            if (version < 5) {
+                // We went from 3 to 5 screens. Move everything 1 to the right
+                db.beginTransaction();
+                try {
+                    db.execSQL("UPDATE favorites SET screen=(screen + 1);");
+                    db.setTransactionSuccessful();
+                    version = 5;
+                } catch (SQLException ex) {
+                    // Old version remains, which means we wipe old data
+                    Log.e(LOG_TAG, ex.getMessage(), ex);
+                } finally {
+                    db.endTransaction();
+                }
+            }
+            
             if (version != DATABASE_VERSION) {
                 Log.w(LOG_TAG, "Destroying all old data.");
                 db.execSQL("DROP TABLE IF EXISTS " + TABLE_FAVORITES);
diff --git a/src/com/android/launcher2/Workspace.java b/src/com/android/launcher2/Workspace.java
index a0391d3..a14a11f 100644
--- a/src/com/android/launcher2/Workspace.java
+++ b/src/com/android/launcher2/Workspace.java
@@ -543,6 +543,14 @@
         if (restore) {
             canvas.restoreToCount(restoreCount);
         }
+        
+        onDrawScrollBars(canvas);
+    }
+
+    @Override
+    protected int computeHorizontalScrollRange() {
+        final int count = getChildCount();
+        return count == 0 ? getWidth() : (getChildAt(count - 1)).getRight();
     }
 
     private float mScale = 1.0f;
@@ -577,8 +585,11 @@
             getChildAt(i).measure(widthMeasureSpec, heightMeasureSpec);
         }
 
+
         if (mFirstLayout) {
+            setHorizontalScrollBarEnabled(false);
             scrollTo(mCurrentScreen * width, 0);
+            setHorizontalScrollBarEnabled(true);
             updateWallpaperOffset(width * (getChildCount() - 1));
             mFirstLayout = false;
         }
@@ -725,7 +736,7 @@
                     if (xMoved) {
                         // Scroll if the user moved far enough along the X axis
                         mTouchState = TOUCH_STATE_SCROLLING;
-                        enableChildrenCache();
+                        enableChildrenCache(mCurrentScreen - 1, mCurrentScreen + 1);
                     }
                     // Either way, cancel any pending longpress
                     if (mAllowLongPress) {
@@ -781,9 +792,20 @@
         return mTouchState != TOUCH_STATE_REST;
     }
 
-    void enableChildrenCache() {
+    void enableChildrenCache(int fromScreen, int toScreen) {
+        if (fromScreen > toScreen) {
+            int temp = fromScreen;
+            fromScreen = toScreen;
+            toScreen = fromScreen;
+        }
+        
         final int count = getChildCount();
-        for (int i = 0; i < count; i++) {
+        
+        fromScreen = Math.max(fromScreen, 0);
+        toScreen = Math.min(toScreen, count - 1);
+        
+        for (int i = fromScreen; i <= toScreen; i++) {
+            // Log.d("TAG", "enablingChildrenCache: " + i);
             final CellLayout layout = (CellLayout) getChildAt(i);
             layout.setChildrenDrawnWithCacheEnabled(true);
             layout.setChildrenDrawingCacheEnabled(true);
@@ -852,6 +874,8 @@
                         scrollBy(Math.min(availableToScroll, deltaX), 0);
                         updateWallpaperOffset();
                     }
+                } else {
+                    awakenScrollBars();
                 }
             }
             break;
@@ -895,22 +919,26 @@
     void snapToScreen(int whichScreen) {
         if (!mScroller.isFinished()) return;
 
-        clearVacantCache();
-        enableChildrenCache();
-
         whichScreen = Math.max(0, Math.min(whichScreen, getChildCount() - 1));
-        boolean changingScreens = whichScreen != mCurrentScreen;
+        
+        clearVacantCache();
+        enableChildrenCache(mCurrentScreen, whichScreen);
+
+
+        final int screenDelta = Math.abs(whichScreen - mCurrentScreen);
         
         mNextScreen = whichScreen;
         
         View focusedChild = getFocusedChild();
-        if (focusedChild != null && changingScreens && focusedChild == getChildAt(mCurrentScreen)) {
+        if (focusedChild != null && screenDelta != 0 && focusedChild == getChildAt(mCurrentScreen)) {
             focusedChild.clearFocus();
         }
         
         final int newX = whichScreen * getWidth();
         final int delta = newX - mScrollX;
-        mScroller.startScroll(mScrollX, 0, delta, 0, Math.abs(delta) * 2);
+        final int duration = screenDelta * 300;
+        awakenScrollBars(duration);
+        mScroller.startScroll(mScrollX, 0, delta, 0, duration);
         invalidate();
     }
 
