diff --git a/src/com/android/launcher2/Launcher.java b/src/com/android/launcher2/Launcher.java
index 0f302a0..1cf558b 100644
--- a/src/com/android/launcher2/Launcher.java
+++ b/src/com/android/launcher2/Launcher.java
@@ -212,12 +212,6 @@
 
     private static HashMap<Long, FolderInfo> sFolders = new HashMap<Long, FolderInfo>();
 
-    // Hotseats (quick-launch icons next to AllApps)
-    private String[] mHotseatConfig = null;
-    private Intent[] mHotseats = null;
-    private Drawable[] mHotseatIcons = null;
-    private CharSequence[] mHotseatLabels = null;
-
     private Intent mAppMarketIntent = null;
 
     // Related to the auto-advancing of widgets
@@ -436,16 +430,6 @@
         }
     }
 
-    // Note: This doesn't do all the client-id magic that BrowserProvider does
-    // in Browser. (http://b/2425179)
-    private Uri getDefaultBrowserUri() {
-        String url = getString(R.string.default_browser_url);
-        if (url.indexOf("{CID}") != -1) {
-            url = url.replace("{CID}", "android-google");
-        }
-        return Uri.parse(url);
-    }
-
     /**
      * Returns whether we should delay spring loaded mode -- for shortcuts and widgets that have
      * a configuration step, this allows the proper animations to run after other transitions.
@@ -1922,27 +1906,6 @@
         showDialog(DIALOG_CREATE_SHORTCUT);
     }
 
-    private void pickShortcut() {
-        // Insert extra item to handle picking application
-        Bundle bundle = new Bundle();
-
-        ArrayList<String> shortcutNames = new ArrayList<String>();
-        shortcutNames.add(getString(R.string.group_applications));
-        bundle.putStringArrayList(Intent.EXTRA_SHORTCUT_NAME, shortcutNames);
-
-        ArrayList<ShortcutIconResource> shortcutIcons = new ArrayList<ShortcutIconResource>();
-        shortcutIcons.add(ShortcutIconResource.fromContext(Launcher.this,
-                        R.drawable.ic_launcher_application));
-        bundle.putParcelableArrayList(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, shortcutIcons);
-
-        Intent pickIntent = new Intent(Intent.ACTION_PICK_ACTIVITY);
-        pickIntent.putExtra(Intent.EXTRA_INTENT, new Intent(Intent.ACTION_CREATE_SHORTCUT));
-        pickIntent.putExtra(Intent.EXTRA_TITLE, getText(R.string.title_select_shortcut));
-        pickIntent.putExtras(bundle);
-
-        startActivityForResult(pickIntent, REQUEST_PICK_SHORTCUT);
-    }
-
     private class RenameFolder {
         private EditText mInput;
 
diff --git a/src/com/android/launcher2/Workspace.java b/src/com/android/launcher2/Workspace.java
index 23b8c2d..e03f329 100644
--- a/src/com/android/launcher2/Workspace.java
+++ b/src/com/android/launcher2/Workspace.java
@@ -140,7 +140,6 @@
     private int[] mTempEstimate = new int[2];
     private float[] mDragViewVisualCenter = new float[2];
     private float[] mTempDragCoordinates = new float[2];
-    private float[] mTempTouchCoordinates = new float[2];
     private float[] mTempCellLayoutCenterCoordinates = new float[2];
     private float[] mTempDragBottomRightCoordinates = new float[2];
     private Matrix mTempInverseMatrix = new Matrix();
@@ -1288,12 +1287,6 @@
         }
     }
 
-    private boolean childLayersEnabled() {
-        boolean isSmallOrSpringloaded =
-            isSmall() || mIsSwitchingState || mState == State.SPRING_LOADED;
-        return isSmallOrSpringloaded || isPageMoving() || mIsDragOccuring;
-    }
-
     private void updateChildrenLayersEnabled() {
         boolean small =
             isSmall() || mIsSwitchingState || mState == State.SPRING_LOADED;
@@ -1711,6 +1704,14 @@
     }
 
     void unshrink(boolean animated, boolean springLoaded) {
+        if (mFirstLayout) {
+            // (mFirstLayout == "first layout has not happened yet")
+            // cancel any pending shrinks that were set earlier
+            mSwitchStateAfterFirstLayout = false;
+            mStateAfterFirstLayout = State.NORMAL;
+            return;
+        }
+
         if (isSmall()) {
             float finalScaleFactor = 1.0f;
             float finalBackgroundAlpha = 0.0f;
@@ -2056,7 +2057,6 @@
         final Bitmap b = createDragBitmap(child, new Canvas(), bitmapPadding);
 
         final int bmpWidth = b.getWidth();
-        final int bmpHeight = b.getHeight();
 
         mLauncher.getDragLayer().getLocationInDragLayer(child, mTempXY);
         final int dragLayerX = (int) mTempXY[0] + (child.getWidth() - bmpWidth) / 2;
@@ -2776,8 +2776,6 @@
 
         // Identify whether we have dragged over a side page
         if (isSmall()) {
-            int left = d.x - d.xOffset;
-            int top = d.y - d.yOffset;
             layout = findMatchingPageForDragOver(d.dragView, mDragViewVisualCenter[0],
                     mDragViewVisualCenter[1], true);
             if (layout != mDragTargetLayout) {
@@ -3107,7 +3105,6 @@
     }
     public void resetTransitionTransform(CellLayout layout) {
         if (isSwitchingState()) {
-            int index = indexOfChild(layout);
             mCurrentScaleX = layout.getScaleX();
             mCurrentScaleY = layout.getScaleY();
             mCurrentTranslationX = layout.getTranslationX();
@@ -3338,7 +3335,6 @@
             int count = layout.getChildCount();
             for (int i = 0; i < count; i++) {
                 View child = layout.getChildAt(i);
-                CellLayout.LayoutParams lp = (CellLayout.LayoutParams) child.getLayoutParams();
                 if (child instanceof Folder) {
                     Folder f = (Folder) child;
                     if (f.getInfo() == tag && f.getInfo().opened) {
@@ -3378,7 +3374,6 @@
     }
 
     void removeItems(final ArrayList<ApplicationInfo> apps) {
-        final int screenCount = getChildCount();
         final AppWidgetManager widgets = AppWidgetManager.getInstance(getContext());
 
         final HashSet<String> packageNames = new HashSet<String>();
