diff --git a/src/com/android/launcher2/ApplicationInfoDropTarget.java b/src/com/android/launcher2/ApplicationInfoDropTarget.java
index fdcbbd4..2ee3501 100644
--- a/src/com/android/launcher2/ApplicationInfoDropTarget.java
+++ b/src/com/android/launcher2/ApplicationInfoDropTarget.java
@@ -16,16 +16,18 @@
 
 package com.android.launcher2;
 
+import com.android.launcher.R;
+
 import android.animation.Animator;
-import android.animation.Animator.AnimatorListener;
+import android.animation.AnimatorSet;
 import android.animation.ObjectAnimator;
+import android.animation.Animator.AnimatorListener;
 import android.content.ComponentName;
 import android.content.Context;
 import android.graphics.PorterDuff;
 import android.graphics.PorterDuffColorFilter;
 import android.util.AttributeSet;
-
-import com.android.launcher.R;
+import android.view.View;
 
 /**
  * Implements a DropTarget which allows applications to be dropped on it,
@@ -35,8 +37,9 @@
     private static final int sFadeInAnimationDuration = 200;
     private static final int sFadeOutAnimationDuration = 100;
 
-    private ObjectAnimator mFadeAnimator;
+    private AnimatorSet mFadeAnimator;
     private ObjectAnimator mHandleFadeAnimator;
+    private boolean mHandleWasVisibleOnDragStart;
 
     public ApplicationInfoDropTarget(Context context, AttributeSet attrs) {
         this(context, attrs, 0);
@@ -87,13 +90,25 @@
             if (mActive) {
                 // Fade in this icon
                 if (mFadeAnimator != null) mFadeAnimator.cancel();
-                mFadeAnimator = ObjectAnimator.ofFloat(this, "alpha", 0.0f, 1.0f);
-                mFadeAnimator.setDuration(sFadeInAnimationDuration);
+                mFadeAnimator = new AnimatorSet();
+                Animator infoButtonAnimator = ObjectAnimator.ofFloat(this, "alpha", 0.0f, 1.0f);
+                infoButtonAnimator.setDuration(sFadeInAnimationDuration);
+
+                if (mHandle == mLauncher.findViewById(R.id.configure_button)) {
+                    final View divider = mLauncher.findViewById(R.id.divider_during_drag);
+                    divider.setVisibility(VISIBLE);
+                    Animator dividerAnimator = ObjectAnimator.ofFloat(divider, "alpha", 1.0f);
+                    dividerAnimator.setDuration(sFadeInAnimationDuration);
+                    mFadeAnimator.play(infoButtonAnimator).with(dividerAnimator);
+                } else {
+                    mFadeAnimator.play(infoButtonAnimator);
+                }
                 mFadeAnimator.start();
                 setVisibility(VISIBLE);
 
                 // Fade out the handle
                 if (mHandle != null) {
+                    mHandleWasVisibleOnDragStart = mHandle.getVisibility() == VISIBLE;
                     if (mHandleFadeAnimator != null) mHandleFadeAnimator.cancel();
                     mHandleFadeAnimator = ObjectAnimator.ofFloat(mHandle, "alpha", 0.0f);
                     mHandleFadeAnimator.setDuration(sFadeOutAnimationDuration);
@@ -123,8 +138,12 @@
 
         // Fade out this icon
         if (mFadeAnimator != null) mFadeAnimator.cancel();
-        mFadeAnimator = ObjectAnimator.ofFloat(this, "alpha", 0.0f);
-        mFadeAnimator.setDuration(sFadeOutAnimationDuration);
+        mFadeAnimator = new AnimatorSet();
+        Animator infoButtonAnimator = ObjectAnimator.ofFloat(this, "alpha", 0.0f);
+        infoButtonAnimator.setDuration(sFadeOutAnimationDuration);
+        final View divider = mLauncher.findViewById(R.id.divider_during_drag);
+        divider.setVisibility(VISIBLE);
+        Animator dividerAnimator = ObjectAnimator.ofFloat(divider, "alpha", 0.0f);
         mFadeAnimator.addListener(new AnimatorListener() {
             public void onAnimationStart(Animator animation) {}
             public void onAnimationRepeat(Animator animation) {}
@@ -136,13 +155,15 @@
             }
             private void onEndOrCancel() {
                 setVisibility(GONE);
+                divider.setVisibility(GONE);
                 mFadeAnimator = null;
             }
         });
+        mFadeAnimator.play(infoButtonAnimator).with(dividerAnimator);
         mFadeAnimator.start();
 
         // Fade in the handle
-        if (mHandle != null) {
+        if (mHandle != null && mHandleWasVisibleOnDragStart) {
             if (mHandleFadeAnimator != null) mHandleFadeAnimator.cancel();
             mHandleFadeAnimator = ObjectAnimator.ofFloat(mHandle, "alpha", 1.0f);
             mHandleFadeAnimator.setDuration(sFadeInAnimationDuration);
diff --git a/src/com/android/launcher2/CustomizePagedView.java b/src/com/android/launcher2/CustomizePagedView.java
index cfc15d1..5672921 100644
--- a/src/com/android/launcher2/CustomizePagedView.java
+++ b/src/com/android/launcher2/CustomizePagedView.java
@@ -599,8 +599,6 @@
      * in the customize drawer.
      */
     private Drawable parseWallpaperPreviewXml(ComponentName component, ResolveInfo ri) {
-        Drawable d = null;
-
         ActivityInfo activityInfo = ri.activityInfo;
         XmlResourceParser parser = null;
         try {
diff --git a/src/com/android/launcher2/Launcher.java b/src/com/android/launcher2/Launcher.java
index 130cb76..bf72add 100644
--- a/src/com/android/launcher2/Launcher.java
+++ b/src/com/android/launcher2/Launcher.java
@@ -2572,23 +2572,27 @@
     private void hideAndShowToolbarButtons(State newState, AnimatorSet showSeq, AnimatorSet hideSeq) {
         final View searchButton = findViewById(R.id.search_button_cluster);
         final View allAppsButton = findViewById(R.id.all_apps_button);
+        final View divider = findViewById(R.id.divider);
         final View configureButton = findViewById(R.id.configure_button);
 
         switch (newState) {
         case WORKSPACE:
             hideOrShowToolbarButton(true, searchButton, showSeq);
             hideOrShowToolbarButton(true, allAppsButton, showSeq);
+            hideOrShowToolbarButton(true, divider, showSeq);
             hideOrShowToolbarButton(true, configureButton, showSeq);
             mDeleteZone.setHandle(allAppsButton);
             break;
         case ALL_APPS:
             hideOrShowToolbarButton(false, configureButton, hideSeq);
             hideOrShowToolbarButton(false, searchButton, hideSeq);
+            hideOrShowToolbarButton(false, divider, hideSeq);
             hideOrShowToolbarButton(false, allAppsButton, hideSeq);
             break;
         case CUSTOMIZE:
             hideOrShowToolbarButton(false, allAppsButton, hideSeq);
             hideOrShowToolbarButton(false, searchButton, hideSeq);
+            hideOrShowToolbarButton(false, divider, hideSeq);
             hideOrShowToolbarButton(false, configureButton, hideSeq);
             mDeleteZone.setHandle(allAppsButton);
             break;
