diff --git a/src/com/android/launcher2/CellLayout.java b/src/com/android/launcher2/CellLayout.java
index 6dd18d3..015f187 100644
--- a/src/com/android/launcher2/CellLayout.java
+++ b/src/com/android/launcher2/CellLayout.java
@@ -27,6 +27,7 @@
 import android.view.View;
 import android.view.ViewDebug;
 import android.view.ViewGroup;
+import android.app.WallpaperManager;
 
 import java.util.ArrayList;
 
@@ -52,14 +53,14 @@
     private final CellInfo mCellInfo = new CellInfo();
     
     int[] mCellXY = new int[2];
-    
     boolean[][] mOccupied;
 
     private RectF mDragRect = new RectF();
 
     private boolean mDirtyTag;
-    
     private boolean mLastDownOnOccupiedCell = false;
+    
+    private final WallpaperManager mWallpaperManager;     
 
     public CellLayout(Context context) {
         this(context, null);
@@ -99,6 +100,8 @@
                 mOccupied = new boolean[mLongAxisCells][mShortAxisCells];
             }
         }
+        
+        mWallpaperManager = WallpaperManager.getInstance(getContext());
     }
 
     @Override
@@ -433,6 +436,14 @@
         result[1] = vStartPadding + cellY * (mCellHeight + mHeightGap);
     }
 
+    int getCellWidth() {
+        return mCellWidth;
+    }
+
+    int getCellHeight() {
+        return mCellHeight;
+    }
+
     @Override
     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
         // TODO: currently ignoring padding
@@ -528,6 +539,13 @@
                 int childLeft = lp.x;
                 int childTop = lp.y;
                 child.layout(childLeft, childTop, childLeft + lp.width, childTop + lp.height);
+
+                if (lp.dropped) {
+                    lp.dropped = false;
+
+                    mWallpaperManager.sendWallpaperCommand(getWindowToken(), "android.home.drop",
+                            childLeft + lp.width / 2, childTop + lp.height / 2, 0, null);
+                }
             }
         }
     }
@@ -616,6 +634,7 @@
             lp.cellX = targetXY[0];
             lp.cellY = targetXY[1];
             lp.isDragging = false;
+            lp.dropped = true;
             mDragRect.setEmpty();
             child.requestLayout();
             invalidate();
@@ -844,6 +863,8 @@
         int y;
 
         boolean regenerateId;
+        
+        boolean dropped;
 
         public LayoutParams(Context c, AttributeSet attrs) {
             super(c, attrs);
diff --git a/src/com/android/launcher2/Launcher.java b/src/com/android/launcher2/Launcher.java
index 531e10c..1574be8 100644
--- a/src/com/android/launcher2/Launcher.java
+++ b/src/com/android/launcher2/Launcher.java
@@ -38,11 +38,7 @@
 import android.content.res.Resources;
 import android.graphics.Bitmap;
 import android.graphics.drawable.Drawable;
-import android.graphics.drawable.TransitionDrawable;
 import android.os.Bundle;
-import android.os.Looper;
-import android.os.Message;
-import android.os.MessageQueue;
 import android.os.Parcelable;
 import android.os.RemoteException;
 import android.os.ServiceManager;
@@ -61,7 +57,6 @@
 import android.view.MenuItem;
 import android.view.View;
 import android.view.ViewGroup;
-import android.view.WindowManager;
 import android.view.View.OnLongClickListener;
 import android.view.inputmethod.InputMethodManager;
 import android.widget.EditText;
@@ -70,10 +65,8 @@
 import android.appwidget.AppWidgetManager;
 import android.appwidget.AppWidgetProviderInfo;
 
-import java.lang.ref.WeakReference;
 import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.LinkedList;
 import java.io.DataOutputStream;
 import java.io.FileNotFoundException;
 import java.io.IOException;
@@ -184,19 +177,14 @@
 
     private boolean mRestoring;
     private boolean mWaitingForResult;
-    private boolean mLocaleChanged;
     private boolean mExitingBecauseOfLaunch;
 
-    private boolean mHomeDown;
-    private boolean mBackDown;
-
     private Bundle mSavedInstanceState;
 
     private LauncherModel mModel;
 
-    private ArrayList<ItemInfo> mDesktopItems = new ArrayList();
-    private static HashMap<Long, FolderInfo> mFolders = new HashMap();
-    private ArrayList<ApplicationInfo> mAllAppsList = new ArrayList();
+    private ArrayList<ItemInfo> mDesktopItems = new ArrayList<ItemInfo>();
+    private static HashMap<Long, FolderInfo> mFolders = new HashMap<Long, FolderInfo>();
 
     public static long lastStartTime;
 
@@ -263,9 +251,9 @@
         final int previousMnc = localeConfiguration.mnc;
         final int mnc = configuration.mnc;
 
-        mLocaleChanged = !locale.equals(previousLocale) || mcc != previousMcc || mnc != previousMnc;
+        boolean localeChanged = !locale.equals(previousLocale) || mcc != previousMcc || mnc != previousMnc;
 
-        if (mLocaleChanged) {
+        if (localeChanged) {
             localeConfiguration.locale = locale;
             localeConfiguration.mcc = mcc;
             localeConfiguration.mnc = mnc;
@@ -1275,22 +1263,12 @@
     }
 
     @Override
-    public void onWindowFocusChanged(boolean hasFocus) {
-        super.onWindowFocusChanged(hasFocus);
-        if (!hasFocus) {
-            mBackDown = mHomeDown = false;
-        }
-    }
-
-    @Override
     public boolean dispatchKeyEvent(KeyEvent event) {
         if (event.getAction() == KeyEvent.ACTION_DOWN) {
             switch (event.getKeyCode()) {
                 case KeyEvent.KEYCODE_BACK:
-                    mBackDown = true;
                     return true;
                 case KeyEvent.KEYCODE_HOME:
-                    mHomeDown = true;
                     return true;
             }
         } else if (event.getAction() == KeyEvent.ACTION_UP) {
@@ -1304,10 +1282,8 @@
                             closeFolder();
                         }
                     }
-                    mBackDown = false;
                     return true;
                 case KeyEvent.KEYCODE_HOME:
-                    mHomeDown = false;
                     return true;
             }
         }
@@ -1881,11 +1857,6 @@
         final AppWidgetProviderInfo appWidgetInfo = mAppWidgetManager.getAppWidgetInfo(appWidgetId);
         item.hostView = mAppWidgetHost.createView(this, appWidgetId, appWidgetInfo);
 
-        if (true) {
-            Log.d(LOG_TAG, String.format("about to setAppWidget for id=%d, info=%s",
-                    appWidgetId, appWidgetInfo));
-        }
-
         item.hostView.setAppWidget(appWidgetId, appWidgetInfo);
         item.hostView.setTag(item);
 
@@ -1945,8 +1916,7 @@
      * Implementation of the method from LauncherModel.Callbacks.
      */
     public void bindAllApplications(ArrayList<ApplicationInfo> apps) {
-        mAllAppsList = apps;
-        mAllAppsGrid.setApps(mAllAppsList);
+        mAllAppsGrid.setApps(apps);
     }
 
     /**
diff --git a/src/com/android/launcher2/LauncherModel.java b/src/com/android/launcher2/LauncherModel.java
index b917cdd..e103961 100644
--- a/src/com/android/launcher2/LauncherModel.java
+++ b/src/com/android/launcher2/LauncherModel.java
@@ -29,9 +29,7 @@
 import android.database.Cursor;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
-import android.graphics.drawable.Drawable;
 import android.net.Uri;
-import static android.util.Log.*;
 import android.util.Log;
 import android.os.Process;
 import android.os.SystemClock;
@@ -318,18 +316,18 @@
 
             if (mAllAppsList.added.size() > 0) {
                 added = mAllAppsList.added;
-                mAllAppsList.added = new ArrayList();
+                mAllAppsList.added = new ArrayList<ApplicationInfo>();
             }
             if (mAllAppsList.removed.size() > 0) {
                 removed = mAllAppsList.removed;
-                mAllAppsList.removed = new ArrayList();
+                mAllAppsList.removed = new ArrayList<ApplicationInfo>();
                 for (ApplicationInfo info: removed) {
                     AppInfoCache.remove(info.intent.getComponent());
                 }
             }
             if (mAllAppsList.modified.size() > 0) {
                 modified = mAllAppsList.modified;
-                mAllAppsList.modified = new ArrayList();
+                mAllAppsList.modified = new ArrayList<ApplicationInfo>();
             }
 
             final Callbacks callbacks = mCallbacks != null ? mCallbacks.get() : null;
@@ -375,9 +373,9 @@
         private int mLastAllAppsSeq = 0;
         private int mAllAppsSeq = 1;
 
-        final ArrayList<ItemInfo> mItems = new ArrayList();
-        final ArrayList<LauncherAppWidgetInfo> mAppWidgets = new ArrayList();
-        final HashMap<Long, FolderInfo> folders = new HashMap();
+        final ArrayList<ItemInfo> mItems = new ArrayList<ItemInfo>();
+        final ArrayList<LauncherAppWidgetInfo> mAppWidgets = new ArrayList<LauncherAppWidgetInfo>();
+        final HashMap<Long, FolderInfo> folders = new HashMap<Long, FolderInfo>();
                 
         /**
          * Call this from the ui thread so the handler is initialized on the correct thread.
@@ -462,6 +460,7 @@
                             mWaitThread.join();
                             done = true;
                         } catch (InterruptedException ex) {
+                            // Ignore
                         }
                     }
                     mWaitThread = null;
@@ -519,6 +518,7 @@
                         try {
                             this.wait();
                         } catch (InterruptedException ex) {
+                            // Ignore
                         }
                     }
                     Log.d(TAG, "done waiting to be done with workspace");
@@ -559,7 +559,6 @@
                     // Setting the reference is atomic, but we can't do it inside the other critical
                     // sections.
                     mLoaderThread = null;
-                    return;
                 }
             }
 
@@ -942,7 +941,7 @@
             private void bindAllApps() {
                 synchronized (mLock) {
                     final ArrayList<ApplicationInfo> results = mAllAppsList.added;
-                    mAllAppsList.added = new ArrayList();
+                    mAllAppsList.added = new ArrayList<ApplicationInfo>();
                     mHandler.post(new Runnable() {
                         public void run() {
                             final long t = SystemClock.uptimeMillis();
diff --git a/src/com/android/launcher2/Workspace.java b/src/com/android/launcher2/Workspace.java
index 608e7b7..a0391d3 100644
--- a/src/com/android/launcher2/Workspace.java
+++ b/src/com/android/launcher2/Workspace.java
@@ -48,7 +48,7 @@
  * A workspace is meant to be used with a fixed width only.
  */
 public class Workspace extends ViewGroup implements DropTarget, DragSource, DragScroller {
-    private static final String TAG = "Launcher.Workspace";
+    //private static final String TAG = "Launcher.Workspace";
     private static final int INVALID_SCREEN = -1;
     
     /**
@@ -982,7 +982,7 @@
                         mDragInfo.spanX, mDragInfo.spanY, cell, cellLayout, mTargetCell);
                 cellLayout.onDropChild(cell, mTargetCell);
 
-                final ItemInfo info = (ItemInfo)cell.getTag();
+                final ItemInfo info = (ItemInfo) cell.getTag();
                 CellLayout.LayoutParams lp = (CellLayout.LayoutParams) cell.getLayoutParams();
                 LauncherModel.moveItemInDatabase(mLauncher, info,
                         LauncherSettings.Favorites.CONTAINER_DESKTOP, index, lp.cellX, lp.cellY);
