diff --git a/libs/ui/EventHub.cpp b/libs/ui/EventHub.cpp
index 60c177b..e39a357 100644
--- a/libs/ui/EventHub.cpp
+++ b/libs/ui/EventHub.cpp
@@ -781,12 +781,21 @@
         if(strcmp(mDevices[i]->path.string(), deviceName) == 0) {
             //LOGD("remove device %d: %s\n", i, deviceName);
             device_t* device = mDevices[i];
-            int count = mFDCount - i - 1;
+            
+            LOGI("Removed device: path=%s name=%s id=0x%x (of 0x%x) index=%d fd=%d classes=0x%x\n",
+                 device->path.string(), device->name.string(), device->id,
+                 mNumDevicesById, mFDCount, mFDs[i].fd, device->classes);
+         
+            // Clear this device's entry.
             int index = (device->id&ID_MASK);
             mDevicesById[index].device = NULL;
+            
+            // Close the file descriptor and compact the fd array.
             close(mFDs[i].fd);
+            int count = mFDCount - i - 1;
             memmove(mDevices + i, mDevices + i + 1, sizeof(mDevices[0]) * count);
             memmove(mFDs + i, mFDs + i + 1, sizeof(mFDs[0]) * count);
+            mFDCount--;
 
 #ifdef EV_SW
             for (int j=0; j<EV_SW; j++) {
@@ -799,8 +808,6 @@
             device->next = mClosingDevices;
             mClosingDevices = device;
 
-            mFDCount--;
-
             uint32_t publicID;
             if (device->id == mFirstKeyboardId) {
                 LOGW("built-in keyboard device %s (id=%d) is closing! the apps will not like this",
@@ -817,7 +824,7 @@
             return 0;
         }
     }
-    LOGE("remote device: %s not found\n", deviceName);
+    LOGE("remove device: %s not found\n", deviceName);
     return -1;
 }
 
@@ -832,7 +839,7 @@
     int event_pos = 0;
     struct inotify_event *event;
 
-LOGD("EventHub::read_notify nfd: %d\n", nfd);
+    LOGV("EventHub::read_notify nfd: %d\n", nfd);
     res = read(nfd, event_buf, sizeof(event_buf));
     if(res < (int)sizeof(*event)) {
         if(errno == EINTR)
diff --git a/services/java/com/android/server/KeyInputQueue.java b/services/java/com/android/server/KeyInputQueue.java
index 7ca12f21..244e136 100644
--- a/services/java/com/android/server/KeyInputQueue.java
+++ b/services/java/com/android/server/KeyInputQueue.java
@@ -54,6 +54,7 @@
     private static final String EXCLUDED_DEVICES_PATH = "etc/excluded-input-devices.xml";
 
     final SparseArray<InputDevice> mDevices = new SparseArray<InputDevice>();
+    final SparseArray<InputDevice> mIgnoredDevices = new SparseArray<InputDevice>();
     final ArrayList<VirtualKey> mVirtualKeys = new ArrayList<VirtualKey>();
     final HapticFeedbackCallback mHapticFeedbackCallback;
     
@@ -391,26 +392,50 @@
                     if (ev.type == RawInputEvent.EV_DEVICE_ADDED) {
                         synchronized (mFirst) {
                             di = newInputDevice(ev.deviceId);
-                            mDevices.put(ev.deviceId, di);
-                            if ((di.classes & RawInputEvent.CLASS_TOUCHSCREEN) != 0) {
-                                readVirtualKeys(di.name);
+                            if (di.classes != 0) {
+                                // If this device is some kind of input class,
+                                // we care about it.
+                                mDevices.put(ev.deviceId, di);
+                                if ((di.classes & RawInputEvent.CLASS_TOUCHSCREEN) != 0) {
+                                    readVirtualKeys(di.name);
+                                }
+                                // The configuration may have changed because
+                                // of this device.
+                                configChanged = true;
+                            } else {
+                                // We won't do anything with this device.
+                                mIgnoredDevices.put(ev.deviceId, di);
+                                Log.i(TAG, "Ignoring non-input device: id=0x"
+                                        + Integer.toHexString(di.id)
+                                        + ", name=" + di.name);
                             }
-                            configChanged = true;
                         }
                     } else if (ev.type == RawInputEvent.EV_DEVICE_REMOVED) {
                         synchronized (mFirst) {
-                            Log.i(TAG, "Device removed: id=0x"
-                                    + Integer.toHexString(ev.deviceId));
+                            if (false) {
+                                Log.i(TAG, "Device removed: id=0x"
+                                        + Integer.toHexString(ev.deviceId));
+                            }
                             di = mDevices.get(ev.deviceId);
                             if (di != null) {
                                 mDevices.delete(ev.deviceId);
+                                // The configuration may have changed because
+                                // of this device.
                                 configChanged = true;
+                            } else if ((di=mIgnoredDevices.get(ev.deviceId)) != null) {
+                                mIgnoredDevices.remove(ev.deviceId);
                             } else {
-                                Log.w(TAG, "Bad device id: " + ev.deviceId);
+                                Log.w(TAG, "Removing bad device id: "
+                                        + Integer.toHexString(ev.deviceId));
+                                continue;
                             }
                         }
                     } else {
                         di = getInputDevice(ev.deviceId);
+                        if (di == null) {
+                            // This may be some junk from an ignored device.
+                            continue;
+                        }
                         
                         // first crack at it
                         send = preprocessEvent(di, ev);
@@ -422,10 +447,6 @@
                         }
                     }
 
-                    if (di == null) {
-                        continue;
-                    }
-                    
                     if (configChanged) {
                         synchronized (mFirst) {
                             addLocked(di, System.nanoTime(), 0,
@@ -1056,28 +1077,33 @@
     private InputDevice newInputDevice(int deviceId) {
         int classes = getDeviceClasses(deviceId);
         String name = getDeviceName(deviceId);
-        Log.i(TAG, "Device added: id=0x" + Integer.toHexString(deviceId)
-                + ", name=" + name
-                + ", classes=" + Integer.toHexString(classes));
-        InputDevice.AbsoluteInfo absX;
-        InputDevice.AbsoluteInfo absY;
-        InputDevice.AbsoluteInfo absPressure;
-        InputDevice.AbsoluteInfo absSize;
-        if ((classes&RawInputEvent.CLASS_TOUCHSCREEN_MT) != 0) {
-            absX = loadAbsoluteInfo(deviceId, RawInputEvent.ABS_MT_POSITION_X, "X");
-            absY = loadAbsoluteInfo(deviceId, RawInputEvent.ABS_MT_POSITION_Y, "Y");
-            absPressure = loadAbsoluteInfo(deviceId, RawInputEvent.ABS_MT_TOUCH_MAJOR, "Pressure");
-            absSize = loadAbsoluteInfo(deviceId, RawInputEvent.ABS_MT_WIDTH_MAJOR, "Size");
-        } else if ((classes&RawInputEvent.CLASS_TOUCHSCREEN) != 0) {
-            absX = loadAbsoluteInfo(deviceId, RawInputEvent.ABS_X, "X");
-            absY = loadAbsoluteInfo(deviceId, RawInputEvent.ABS_Y, "Y");
-            absPressure = loadAbsoluteInfo(deviceId, RawInputEvent.ABS_PRESSURE, "Pressure");
-            absSize = loadAbsoluteInfo(deviceId, RawInputEvent.ABS_TOOL_WIDTH, "Size");
-        } else {
-            absX = null;
-            absY = null;
-            absPressure = null;
-            absSize = null;
+        InputDevice.AbsoluteInfo absX = null;
+        InputDevice.AbsoluteInfo absY = null;
+        InputDevice.AbsoluteInfo absPressure = null;
+        InputDevice.AbsoluteInfo absSize = null;
+        if (classes != 0) {
+            Log.i(TAG, "Device added: id=0x" + Integer.toHexString(deviceId)
+                    + ", name=" + name
+                    + ", classes=" + Integer.toHexString(classes));
+            if ((classes&RawInputEvent.CLASS_TOUCHSCREEN_MT) != 0) {
+                absX = loadAbsoluteInfo(deviceId,
+                        RawInputEvent.ABS_MT_POSITION_X, "X");
+                absY = loadAbsoluteInfo(deviceId,
+                        RawInputEvent.ABS_MT_POSITION_Y, "Y");
+                absPressure = loadAbsoluteInfo(deviceId,
+                        RawInputEvent.ABS_MT_TOUCH_MAJOR, "Pressure");
+                absSize = loadAbsoluteInfo(deviceId,
+                        RawInputEvent.ABS_MT_WIDTH_MAJOR, "Size");
+            } else if ((classes&RawInputEvent.CLASS_TOUCHSCREEN) != 0) {
+                absX = loadAbsoluteInfo(deviceId,
+                        RawInputEvent.ABS_X, "X");
+                absY = loadAbsoluteInfo(deviceId,
+                        RawInputEvent.ABS_Y, "Y");
+                absPressure = loadAbsoluteInfo(deviceId,
+                        RawInputEvent.ABS_PRESSURE, "Pressure");
+                absSize = loadAbsoluteInfo(deviceId,
+                        RawInputEvent.ABS_TOOL_WIDTH, "Size");
+            }
         }
         
         return new InputDevice(deviceId, classes, name, absX, absY, absPressure, absSize);
diff --git a/services/java/com/android/server/WindowManagerService.java b/services/java/com/android/server/WindowManagerService.java
index 81e0136..c7c748f 100644
--- a/services/java/com/android/server/WindowManagerService.java
+++ b/services/java/com/android/server/WindowManagerService.java
@@ -375,11 +375,14 @@
     // made visible or hidden at the next transition.
     int mNextAppTransition = WindowManagerPolicy.TRANSIT_NONE;
     boolean mAppTransitionReady = false;
+    boolean mAppTransitionRunning = false;
     boolean mAppTransitionTimeout = false;
     boolean mStartingIconInTransition = false;
     boolean mSkipAppTransitionAnimation = false;
     final ArrayList<AppWindowToken> mOpeningApps = new ArrayList<AppWindowToken>();
     final ArrayList<AppWindowToken> mClosingApps = new ArrayList<AppWindowToken>();
+    final ArrayList<AppWindowToken> mToTopApps = new ArrayList<AppWindowToken>();
+    final ArrayList<AppWindowToken> mToBottomApps = new ArrayList<AppWindowToken>();
 
     //flag to detect fat touch events
     boolean mFatTouch = false;
@@ -690,7 +693,11 @@
                             i--;
                             break;
                         }
-                        if (t.windows.size() > 0) {
+                        
+                        // We haven't reached the token yet; if this token
+                        // is not going to the bottom and has windows, we can
+                        // use it as an anchor for when we do reach the token.
+                        if (!t.sendingToBottom && t.windows.size() > 0) {
                             pos = t.windows.get(0);
                         }
                     }
@@ -712,6 +719,8 @@
                         }
                         placeWindowBefore(pos, win);
                     } else {
+                        // Continue looking down until we find the first
+                        // token that has windows.
                         while (i >= 0) {
                             AppWindowToken t = mAppTokens.get(i);
                             final int NW = t.windows.size();
@@ -2760,7 +2769,6 @@
                 mTempConfiguration.setToDefaults();
                 if (computeNewConfigurationLocked(mTempConfiguration)) {
                     if (appConfig.diff(mTempConfiguration) != 0) {
-                        Log.i(TAG, "Config changed: " + mTempConfiguration);
                         return new Configuration(mTempConfiguration);
                     }
                 }
@@ -3198,12 +3206,14 @@
                 wtoken.setDummyAnimation();
                 mOpeningApps.remove(wtoken);
                 mClosingApps.remove(wtoken);
+                wtoken.waitingToShow = wtoken.waitingToHide = false;
                 wtoken.inPendingTransaction = true;
                 if (visible) {
                     mOpeningApps.add(wtoken);
                     wtoken.allDrawn = false;
                     wtoken.startingDisplayed = false;
                     wtoken.startingMoved = false;
+                    wtoken.waitingToShow = true;
 
                     if (wtoken.clientHidden) {
                         // In the case where we are making an app visible
@@ -3217,6 +3227,7 @@
                     }
                 } else {
                     mClosingApps.add(wtoken);
+                    wtoken.waitingToHide = true;
                 }
                 return;
             }
@@ -3351,10 +3362,12 @@
                 delayed = setTokenVisibilityLocked(wtoken, null, false, WindowManagerPolicy.TRANSIT_NONE, true);
                 wtoken.inPendingTransaction = false;
                 mOpeningApps.remove(wtoken);
+                wtoken.waitingToShow = false;
                 if (mClosingApps.contains(wtoken)) {
                     delayed = true;
                 } else if (mNextAppTransition != WindowManagerPolicy.TRANSIT_NONE) {
                     mClosingApps.add(wtoken);
+                    wtoken.waitingToHide = true;
                     delayed = true;
                 }
                 if (DEBUG_APP_TRANSITIONS) Log.v(
@@ -3441,6 +3454,12 @@
             final AppWindowToken wtoken = mAppTokens.get(tokenPos-1);
             if (DEBUG_REORDER) Log.v(TAG, "Looking for lower windows @ "
                     + tokenPos + " -- " + wtoken.token);
+            if (wtoken.sendingToBottom) {
+                if (DEBUG_REORDER) Log.v(TAG,
+                        "Skipping token -- currently sending to bottom");
+                tokenPos--;
+                continue;
+            }
             int i = wtoken.windows.size();
             while (i > 0) {
                 i--;
@@ -3449,7 +3468,7 @@
                 while (j > 0) {
                     j--;
                     WindowState cwin = (WindowState)win.mChildWindows.get(j);
-                    if (cwin.mSubLayer >= 0 ) {
+                    if (cwin.mSubLayer >= 0) {
                         for (int pos=NW-1; pos>=0; pos--) {
                             if (mWindows.get(pos) == cwin) {
                                 if (DEBUG_REORDER) Log.v(TAG,
@@ -3553,6 +3572,26 @@
         }
     }
 
+    private void moveAppWindowsLocked(AppWindowToken wtoken, int tokenPos,
+            boolean updateFocusAndLayout) {
+        // First remove all of the windows from the list.
+        tmpRemoveAppWindowsLocked(wtoken);
+
+        // Where to start adding?
+        int pos = findWindowOffsetLocked(tokenPos);
+
+        // And now add them back at the correct place.
+        pos = reAddAppWindowsLocked(pos, wtoken);
+
+        if (updateFocusAndLayout) {
+            if (!updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES)) {
+                assignLayersLocked();
+            }
+            mLayoutNeeded = true;
+            performLayoutAndPlaceSurfacesLocked();
+        }
+    }
+
     private void moveAppWindowsLocked(List<IBinder> tokens, int tokenPos) {
         // First remove all of the windows from the list.
         final int N = tokens.size();
@@ -3575,7 +3614,9 @@
             }
         }
 
-        updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES);
+        if (!updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES)) {
+            assignLayersLocked();
+        }
         mLayoutNeeded = true;
         performLayoutAndPlaceSurfacesLocked();
 
@@ -3596,9 +3637,19 @@
                 AppWindowToken wt = findAppWindowToken(tokens.get(i));
                 if (wt != null) {
                     mAppTokens.add(wt);
+                    if (mNextAppTransition != WindowManagerPolicy.TRANSIT_NONE) {
+                        mToTopApps.remove(wt);
+                        mToBottomApps.remove(wt);
+                        mToTopApps.add(wt);
+                        wt.sendingToBottom = false;
+                        wt.sendingToTop = true;
+                    }
                 }
             }
-            moveAppWindowsLocked(tokens, mAppTokens.size());
+            
+            if (mNextAppTransition == WindowManagerPolicy.TRANSIT_NONE) {
+                moveAppWindowsLocked(tokens, mAppTokens.size());
+            }
         }
         Binder.restoreCallingIdentity(origId);
     }
@@ -3618,10 +3669,20 @@
                 AppWindowToken wt = findAppWindowToken(tokens.get(i));
                 if (wt != null) {
                     mAppTokens.add(pos, wt);
+                    if (mNextAppTransition != WindowManagerPolicy.TRANSIT_NONE) {
+                        mToTopApps.remove(wt);
+                        mToBottomApps.remove(wt);
+                        mToBottomApps.add(i, wt);
+                        wt.sendingToTop = false;
+                        wt.sendingToBottom = true;
+                    }
                     pos++;
                 }
             }
-            moveAppWindowsLocked(tokens, 0);
+            
+            if (mNextAppTransition == WindowManagerPolicy.TRANSIT_NONE) {
+                moveAppWindowsLocked(tokens, 0);
+            }
         }
         Binder.restoreCallingIdentity(origId);
     }
@@ -4253,19 +4314,6 @@
         if (!computeNewConfigurationLocked(config)) {
             return null;
         }
-        Log.i(TAG, "Config changed: " + config);
-        long now = SystemClock.uptimeMillis();
-        //Log.i(TAG, "Config changing, gc pending: " + mFreezeGcPending + ", now " + now);
-        if (mFreezeGcPending != 0) {
-            if (now > (mFreezeGcPending+1000)) {
-                //Log.i(TAG, "Gc!  " + now + " > " + (mFreezeGcPending+1000));
-                mH.removeMessages(H.FORCE_GC);
-                Runtime.getRuntime().gc();
-                mFreezeGcPending = now;
-            }
-        } else {
-            mFreezeGcPending = now;
-        }
         return config;
     }
 
@@ -7213,6 +7261,10 @@
          * of a transition that has not yet been started.
          */
         boolean isReadyForDisplay() {
+            if (mRootToken.waitingToShow &&
+                    mNextAppTransition != WindowManagerPolicy.TRANSIT_NONE) {
+                return false;
+            }
             final AppWindowToken atoken = mAppToken;
             final boolean animating = atoken != null
                     ? (atoken.animation != null) : false;
@@ -7547,6 +7599,22 @@
         // Temporary for finding which tokens no longer have visible windows.
         boolean hasVisible;
 
+        // Set to true when this token is in a pending transaction where it
+        // will be shown.
+        boolean waitingToShow;
+        
+        // Set to true when this token is in a pending transaction where it
+        // will be hidden.
+        boolean waitingToHide;
+        
+        // Set to true when this token is in a pending transaction where its
+        // windows will be put to the bottom of the list.
+        boolean sendingToBottom;
+        
+        // Set to true when this token is in a pending transaction where its
+        // windows will be put to the top of the list.
+        boolean sendingToTop;
+        
         WindowToken(IBinder _token, int type, boolean _explicit) {
             token = _token;
             windowType = type;
@@ -7559,6 +7627,12 @@
             pw.print(prefix); pw.print("windowType="); pw.print(windowType);
                     pw.print(" hidden="); pw.print(hidden);
                     pw.print(" hasVisible="); pw.println(hasVisible);
+            if (waitingToShow || waitingToHide || sendingToBottom || sendingToTop) {
+                pw.print(prefix); pw.print("waitingToShow="); pw.print(waitingToShow);
+                        pw.print(" waitingToHide="); pw.print(waitingToHide);
+                        pw.print(" sendingToBottom="); pw.print(sendingToBottom);
+                        pw.print(" sendingToTop="); pw.println(sendingToTop);
+            }
         }
 
         @Override
@@ -7868,7 +7942,7 @@
                 pw.print(prefix); pw.print("allAppWindows="); pw.println(allAppWindows);
             }
             pw.print(prefix); pw.print("groupId="); pw.print(groupId);
-                    pw.print(" appFullscreen="); pw.println(appFullscreen);
+                    pw.print(" appFullscreen="); pw.print(appFullscreen);
                     pw.print(" requestedOrientation="); pw.println(requestedOrientation);
             pw.print(prefix); pw.print("hiddenRequested="); pw.print(hiddenRequested);
                     pw.print(" clientHidden="); pw.print(clientHidden);
@@ -8434,6 +8508,50 @@
         return win;
     }
 
+    final void rebuildAppWindowListLocked() {
+        int NW = mWindows.size();
+        int i;
+        
+        // First remove all existing app windows.
+        i=0;
+        while (i < NW) {
+            if (((WindowState)mWindows.get(i)).mAppToken != null) {
+                mWindows.remove(i);
+                NW--;
+                continue;
+            }
+            i++;
+        }
+        
+        // Now go through the app tokens and add the windows back in.
+        int NT = mAppTokens.size();
+        i = 0;
+        for (int j=0; j<NT; j++) {
+            AppWindowToken wt = mAppTokens.get(j);
+            final int NTW = wt.windows.size();
+            for (int k=0; k<NTW; k++) {
+                WindowState win = wt.windows.get(k);
+                final int NC = win.mChildWindows.size();
+                int c;
+                for (c=0; c<NC; c++) {
+                    WindowState cwin = (WindowState)win.mChildWindows.get(c);
+                    if (cwin.mSubLayer >= 0) {
+                        break;
+                    }
+                    mWindows.add(i, cwin);
+                    i++;
+                }
+                mWindows.add(i, win);
+                i++;
+                for (; c<NC; c++) {
+                    WindowState cwin = (WindowState)win.mChildWindows.get(c);
+                    mWindows.add(i, cwin);
+                    i++;
+                }
+            }
+        }
+    }
+    
     private final void assignLayersLocked() {
         int N = mWindows.size();
         int curBaseLayer = 0;
@@ -8814,12 +8932,30 @@
                         }
                         mNextAppTransition = WindowManagerPolicy.TRANSIT_NONE;
                         mAppTransitionReady = false;
+                        mAppTransitionRunning = true;
                         mAppTransitionTimeout = false;
                         mStartingIconInTransition = false;
                         mSkipAppTransitionAnimation = false;
 
                         mH.removeMessages(H.APP_TRANSITION_TIMEOUT);
 
+                        // If there are applications waiting to come to the
+                        // top of the stack, now is the time to move their windows.
+                        // (Note that we don't do apps going to the bottom
+                        // here -- we want to keep their windows in the old
+                        // Z-order until the animation completes.)
+                        if (mToTopApps.size() > 0) {
+                            NN = mAppTokens.size();
+                            for (i=0; i<NN; i++) {
+                                AppWindowToken wtoken = mAppTokens.get(i);
+                                if (wtoken.sendingToTop) {
+                                    wtoken.sendingToTop = false;
+                                    moveAppWindowsLocked(wtoken, NN, false);
+                                }
+                            }
+                            mToTopApps.clear();
+                        }
+                        
                         adjustWallpaperWindowsLocked();
                         wallpaperMayChange = false;
                         
@@ -8889,6 +9025,7 @@
                             wtoken.animation = null;
                             setTokenVisibilityLocked(wtoken, lp, true, transit, false);
                             wtoken.updateReportedVisibilityLocked();
+                            wtoken.waitingToShow = false;
                             wtoken.showAllWindowsLocked();
                         }
                         NN = mClosingApps.size();
@@ -8900,6 +9037,7 @@
                             wtoken.animation = null;
                             setTokenVisibilityLocked(wtoken, lp, false, transit, false);
                             wtoken.updateReportedVisibilityLocked();
+                            wtoken.waitingToHide = false;
                             // Force the allDrawn flag, because we want to start
                             // this guy's animations regardless of whether it's
                             // gotten drawn.
@@ -8922,10 +9060,31 @@
                     }
                 }
                 
+                if (!animating && mAppTransitionRunning) {
+                    // We have finished the animation of an app transition.  To do
+                    // this, we have delayed a lot of operations like showing and
+                    // hiding apps, moving apps in Z-order, etc.  The app token list
+                    // reflects the correct Z-order, but the window list may now
+                    // be out of sync with it.  So here we will just rebuild the
+                    // entire app window list.  Fun!
+                    mAppTransitionRunning = false;
+                    // Clear information about apps that were moving.
+                    mToBottomApps.clear();
+                    
+                    rebuildAppWindowListLocked();
+                    restart = true;
+                    moveInputMethodWindowsIfNeededLocked(false);
+                    wallpaperMayChange = true;
+                    mLayoutNeeded = true;
+                }
+                
                 if (wallpaperMayChange) {
                     if (adjustWallpaperWindowsLocked()) {
                         assignLayersLocked();
                     }
+                    if (mLayoutNeeded) {
+                        performLayoutLockedInner();
+                    }
                 }
                 
             } while (restart);
@@ -9407,13 +9566,29 @@
             }
         }
 
+        boolean needRelayout = false;
+        
+        if (!animating && mAppTransitionRunning) {
+            // We have finished the animation of an app transition.  To do
+            // this, we have delayed a lot of operations like showing and
+            // hiding apps, moving apps in Z-order, etc.  The app token list
+            // reflects the correct Z-order, but the window list may now
+            // be out of sync with it.  So here we will just rebuild the
+            // entire app window list.  Fun!
+            mAppTransitionRunning = false;
+            needRelayout = true;
+            rebuildAppWindowListLocked();
+            // Clear information about apps that were moving.
+            mToBottomApps.clear();
+        }
+        
         if (focusDisplayed) {
             mH.sendEmptyMessage(H.REPORT_LOSING_FOCUS);
         }
         if (wallpaperDestroyed) {
-            wallpaperDestroyed = adjustWallpaperWindowsLocked();            
+            needRelayout = adjustWallpaperWindowsLocked();            
         }
-        if (wallpaperDestroyed) {
+        if (needRelayout) {
             requestAnimationLocked(0);
         } else if (animating) {
             requestAnimationLocked(currentTime+(1000/60)-SystemClock.uptimeMillis());
@@ -9909,6 +10084,7 @@
             pw.print("  mNextAppTransition=0x");
                     pw.print(Integer.toHexString(mNextAppTransition));
                     pw.print(", mAppTransitionReady="); pw.print(mAppTransitionReady);
+                    pw.print(", mAppTransitionRunning="); pw.print(mAppTransitionRunning);
                     pw.print(", mAppTransitionTimeout="); pw.println( mAppTransitionTimeout);
             pw.print("  mStartingIconInTransition="); pw.print(mStartingIconInTransition);
                     pw.print(", mSkipAppTransitionAnimation="); pw.println(mSkipAppTransitionAnimation);
@@ -9918,6 +10094,12 @@
             if (mClosingApps.size() > 0) {
                 pw.print("  mClosingApps="); pw.println(mClosingApps);
             }
+            if (mToTopApps.size() > 0) {
+                pw.print("  mToTopApps="); pw.println(mToTopApps);
+            }
+            if (mToBottomApps.size() > 0) {
+                pw.print("  mToBottomApps="); pw.println(mToBottomApps);
+            }
             pw.print("  DisplayWidth="); pw.print(mDisplay.getWidth());
                     pw.print(" DisplayHeight="); pw.println(mDisplay.getHeight());
             pw.println("  KeyWaiter state:");
diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java
index 252a6d2..8ea6699 100644
--- a/services/java/com/android/server/am/ActivityManagerService.java
+++ b/services/java/com/android/server/am/ActivityManagerService.java
@@ -12544,6 +12544,7 @@
                 }
 
                 mConfiguration = newConfig;
+                Log.i(TAG, "Config changed: " + newConfig);
 
                 Message msg = mHandler.obtainMessage(UPDATE_CONFIGURATION_MSG);
                 msg.obj = new Configuration(mConfiguration);
