diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java
index ee7c6d2..56eaa83 100644
--- a/services/core/java/com/android/server/wm/AppWindowToken.java
+++ b/services/core/java/com/android/server/wm/AppWindowToken.java
@@ -425,8 +425,7 @@
         }
         if (destroyedSomething) {
             final DisplayContent dc = getDisplayContent();
-            mService.mLayersController.assignLayersLocked(dc.getWindowList());
-            dc.setLayoutNeeded();
+            dc.assignWindowLayers(true /*setLayoutNeeded*/);
         }
     }
 
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index 3681123..7299bdf 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -44,6 +44,7 @@
 import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_DISPLAY;
 import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_FOCUS;
 import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_FOCUS_LIGHT;
+import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_LAYERS;
 import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_LAYOUT;
 import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WINDOW_MOVEMENT;
 import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_VISIBILITY;
@@ -171,13 +172,20 @@
     // the display's direct children should be allowed.
     private boolean mRemovingDisplay = false;
 
+    private final WindowLayersController mLayersController;
+    int mInputMethodAnimLayerAdjustment;
+
     /**
      * @param display May not be null.
      * @param service You know.
+     * @param layersController window layer controller used to assign layer to the windows on this
+     *                         display.
      */
-    DisplayContent(Display display, WindowManagerService service) {
+    DisplayContent(Display display, WindowManagerService service,
+            WindowLayersController layersController) {
         mDisplay = display;
         mDisplayId = display.getDisplayId();
+        mLayersController = layersController;
         display.getDisplayInfo(mDisplayInfo);
         display.getMetrics(mDisplayMetrics);
         isDefaultDisplay = mDisplayId == DEFAULT_DISPLAY;
@@ -691,6 +699,24 @@
         }
     }
 
+    void setInputMethodAnimLayerAdjustment(int adj) {
+        if (DEBUG_LAYERS) Slog.v(TAG_WM, "Setting im layer adj to " + adj);
+        mInputMethodAnimLayerAdjustment = adj;
+        final WindowState imw = mService.mInputMethodWindow;
+        if (imw != null) {
+            imw.adjustAnimLayer(adj);
+        }
+        for (int i = mService.mInputMethodDialogs.size() - 1; i >= 0; i--) {
+            final WindowState dialog = mService.mInputMethodDialogs.get(i);
+            // TODO: This and other places setting mAnimLayer can probably use WS.adjustAnimLayer,
+            // but need to make sure we are not setting things twice for child windows that are
+            // already in the list.
+            dialog.mWinAnimator.mAnimLayer = dialog.mLayer + adj;
+            if (DEBUG_LAYERS) Slog.v(TAG_WM, "IM win " + imw
+                    + " anim layer: " + dialog.mWinAnimator.mAnimLayer);
+        }
+    }
+
     void prepareFreezingTaskBounds() {
         for (int stackNdx = mTaskStackContainers.size() - 1; stackNdx >= 0; --stackNdx) {
             final TaskStack stack = mTaskStackContainers.get(stackNdx);
@@ -798,6 +824,11 @@
         mDimLayerController.dump(prefix + "  ", pw);
         pw.println();
         mDividerControllerLocked.dump(prefix + "  ", pw);
+
+        if (mInputMethodAnimLayerAdjustment != 0) {
+            pw.println(subPrefix
+                    + "mInputMethodAnimLayerAdjustment=" + mInputMethodAnimLayerAdjustment);
+        }
     }
 
     @Override
@@ -1113,6 +1144,14 @@
         }
     }
 
+    /** Updates the layer assignment of windows on this display. */
+    void assignWindowLayers(boolean setLayoutNeeded) {
+        mLayersController.assignWindowLayers(mWindows);
+        if (setLayoutNeeded) {
+            setLayoutNeeded();
+        }
+    }
+
     /**
      * Z-orders the display window list so that:
      * <ul>
diff --git a/services/core/java/com/android/server/wm/DockedStackDividerController.java b/services/core/java/com/android/server/wm/DockedStackDividerController.java
index 5854197..8b5f62e 100644
--- a/services/core/java/com/android/server/wm/DockedStackDividerController.java
+++ b/services/core/java/com/android/server/wm/DockedStackDividerController.java
@@ -33,6 +33,7 @@
 import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
 import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
 import static com.android.server.wm.WindowManagerService.H.NOTIFY_DOCKED_STACK_MINIMIZED_CHANGED;
+import static com.android.server.wm.WindowManagerService.LAYER_OFFSET_DIM;
 
 import android.content.Context;
 import android.content.res.Configuration;
@@ -296,7 +297,7 @@
         }
     }
 
-    boolean wasVisible() {
+    private boolean wasVisible() {
         return mLastVisibility;
     }
 
@@ -356,7 +357,7 @@
         mLastRect.set(frame);
     }
 
-    void notifyDockedDividerVisibilityChanged(boolean visible) {
+    private void notifyDockedDividerVisibilityChanged(boolean visible) {
         final int size = mDockedStackListeners.beginBroadcast();
         for (int i = 0; i < size; ++i) {
             final IDockedStackListener listener = mDockedStackListeners.getBroadcastItem(i);
@@ -413,7 +414,7 @@
         return mImeHideRequested;
     }
 
-    void notifyDockedStackMinimizedChanged(boolean minimizedDock, long animDuration) {
+    private void notifyDockedStackMinimizedChanged(boolean minimizedDock, long animDuration) {
         mService.mH.removeMessages(NOTIFY_DOCKED_STACK_MINIMIZED_CHANGED);
         mService.mH.obtainMessage(NOTIFY_DOCKED_STACK_MINIMIZED_CHANGED,
                 minimizedDock ? 1 : 0, 0).sendToTarget();
@@ -442,7 +443,7 @@
         mDockedStackListeners.finishBroadcast();
     }
 
-    void notifyAdjustedForImeChanged(boolean adjustedForIme, long animDuration) {
+    private void notifyAdjustedForImeChanged(boolean adjustedForIme, long animDuration) {
         final int size = mDockedStackListeners.beginBroadcast();
         for (int i = 0; i < size; ++i) {
             final IDockedStackListener listener = mDockedStackListeners.getBroadcastItem(i);
@@ -474,8 +475,7 @@
             stack.getDimBounds(mTmpRect);
             if (mTmpRect.height() > 0 && mTmpRect.width() > 0) {
                 mDimLayer.setBounds(mTmpRect);
-                mDimLayer.show(mService.mLayersController.getResizeDimLayer(),
-                        alpha, 0 /* duration */);
+                mDimLayer.show(getResizeDimLayer(), alpha, 0 /* duration */);
             } else {
                 visibleAndValid = false;
             }
@@ -487,6 +487,14 @@
     }
 
     /**
+     * @return The layer used for dimming the apps when dismissing docked/fullscreen stack. Just
+     *         above all application surfaces.
+     */
+    private int getResizeDimLayer() {
+        return (mWindow != null) ? mWindow.mLayer - 1 : LAYER_OFFSET_DIM;
+    }
+
+    /**
      * Notifies the docked stack divider controller of a visibility change that happens without
      * an animation.
      */
@@ -693,7 +701,7 @@
             return animateForIme(now);
         } else {
             if (mDimLayer != null && mDimLayer.isDimming()) {
-                mDimLayer.setLayer(mService.mLayersController.getResizeDimLayer());
+                mDimLayer.setLayer(getResizeDimLayer());
             }
             return false;
         }
diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java
index 05ffe2d..bddf6e2 100644
--- a/services/core/java/com/android/server/wm/RootWindowContainer.java
+++ b/services/core/java/com/android/server/wm/RootWindowContainer.java
@@ -165,8 +165,11 @@
     ParcelFileDescriptor mSurfaceTraceFd;
     RemoteEventTrace mRemoteEventTrace;
 
+    private final WindowLayersController mLayersController;
+
     RootWindowContainer(WindowManagerService service) {
         mService = service;
+        mLayersController = new WindowLayersController(mService);
     }
 
     WindowState computeFocusedWindow() {
@@ -211,7 +214,7 @@
     }
 
     private DisplayContent createDisplayContent(final Display display) {
-        final DisplayContent dc = new DisplayContent(display, mService);
+        final DisplayContent dc = new DisplayContent(display, mService, mLayersController);
         final int displayId = display.getDisplayId();
 
         if (DEBUG_DISPLAY) Slog.v(TAG_WM, "Adding display=" + display);
@@ -1171,9 +1174,9 @@
                 }
             }
 
-            for (DisplayContent displayContent : displayList) {
-                mService.mLayersController.assignLayersLocked(displayContent.getWindowList());
-                displayContent.setLayoutNeeded();
+            for (int j = displayList.size() - 1; j >= 0; --j) {
+                final DisplayContent dc = displayList.get(j);
+                dc.assignWindowLayers(true /*setLayoutNeeded*/);
             }
         }
 
@@ -1250,8 +1253,7 @@
 
                 if ((dc.pendingLayoutChanges & FINISH_LAYOUT_REDO_WALLPAPER) != 0
                         && mService.mWallpaperControllerLocked.adjustWallpaperWindows()) {
-                    mService.mLayersController.assignLayersLocked(windows);
-                    dc.setLayoutNeeded();
+                    dc.assignWindowLayers(true /*setLayoutNeeded*/);
                 }
 
                 if (isDefaultDisplay
diff --git a/services/core/java/com/android/server/wm/WallpaperController.java b/services/core/java/com/android/server/wm/WallpaperController.java
index 0841231..972a0cb 100644
--- a/services/core/java/com/android/server/wm/WallpaperController.java
+++ b/services/core/java/com/android/server/wm/WallpaperController.java
@@ -742,8 +742,7 @@
         }
 
         if (adjust && adjustWallpaperWindows()) {
-            mService.mLayersController.assignLayersLocked(windows);
-            dc.setLayoutNeeded();
+            dc.assignWindowLayers(true /*setLayoutNeeded*/);
         }
     }
 
@@ -769,6 +768,10 @@
             pw.print("mLastWallpaperDisplayOffsetX="); pw.print(mLastWallpaperDisplayOffsetX);
             pw.print(" mLastWallpaperDisplayOffsetY="); pw.println(mLastWallpaperDisplayOffsetY);
         }
+
+        if (mWallpaperAnimLayerAdjustment != 0) {
+            pw.println(prefix + "mWallpaperAnimLayerAdjustment=" + mWallpaperAnimLayerAdjustment);
+        }
     }
 
     void dumpTokens(PrintWriter pw, String prefix, boolean dumpAll) {
diff --git a/services/core/java/com/android/server/wm/WindowLayersController.java b/services/core/java/com/android/server/wm/WindowLayersController.java
index 68c2be9..e184e39 100644
--- a/services/core/java/com/android/server/wm/WindowLayersController.java
+++ b/services/core/java/com/android/server/wm/WindowLayersController.java
@@ -48,12 +48,10 @@
  * <li>replaced windows, which need to live above their normal level, because they anticipate
  * an animation</li>.
  */
-public class WindowLayersController {
+class WindowLayersController {
     private final WindowManagerService mService;
 
-    private int mInputMethodAnimLayerAdjustment;
-
-    public WindowLayersController(WindowManagerService service) {
+    WindowLayersController(WindowManagerService service) {
         mService = service;
     }
 
@@ -65,7 +63,7 @@
     private WindowState mDockDivider = null;
     private ArrayDeque<WindowState> mReplacingWindows = new ArrayDeque<>();
 
-    final void assignLayersLocked(WindowList windows) {
+    final void assignWindowLayers(WindowList windows) {
         if (DEBUG_LAYERS) Slog.v(TAG_WM, "Assigning layers based on windows=" + windows,
                 new RuntimeException("here").fillInStackTrace());
 
@@ -87,7 +85,7 @@
 
             // TODO: Preserved old behavior of code here but not sure comparing
             // oldLayer to mAnimLayer and mLayer makes sense...though the
-            // worst case would be unintentionalp layer reassignment.
+            // worst case would be unintentional layer reassignment.
             if (w.mLayer != oldLayer || w.mWinAnimator.mAnimLayer != oldLayer) {
                 layerChanged = true;
                 anyLayerChanged = true;
@@ -115,41 +113,6 @@
         if (DEBUG_LAYERS) logDebugLayers(windows);
     }
 
-    void setInputMethodAnimLayerAdjustment(int adj) {
-        if (DEBUG_LAYERS) Slog.v(TAG_WM, "Setting im layer adj to " + adj);
-        mInputMethodAnimLayerAdjustment = adj;
-        final WindowState imw = mService.mInputMethodWindow;
-        if (imw != null) {
-            imw.adjustAnimLayer(adj);
-        }
-        for (int i = mService.mInputMethodDialogs.size() - 1; i >= 0; i--) {
-            final WindowState dialog = mService.mInputMethodDialogs.get(i);
-            // TODO: This and other places setting mAnimLayer can probably use WS.adjustAnimLayer,
-            // but need to make sure we are not setting things twice for child windows that are
-            // already in the list.
-            dialog.mWinAnimator.mAnimLayer = dialog.mLayer + adj;
-            if (DEBUG_LAYERS) Slog.v(TAG_WM, "IM win " + imw
-                    + " anim layer: " + dialog.mWinAnimator.mAnimLayer);
-        }
-    }
-
-    int getSpecialWindowAnimLayerAdjustment(WindowState win) {
-        if (win.mIsImWindow) {
-            return mInputMethodAnimLayerAdjustment;
-        } else if (win.mIsWallpaper) {
-            return mService.mWallpaperControllerLocked.getAnimLayerAdjustment();
-        }
-        return 0;
-    }
-
-    /**
-     * @return The layer used for dimming the apps when dismissing docked/fullscreen stack. Just
-     *         above all application surfaces.
-     */
-    int getResizeDimLayer() {
-        return (mDockDivider != null) ? mDockDivider.mLayer - 1 : LAYER_OFFSET_DIM;
-    }
-
     private void logDebugLayers(WindowList windows) {
         for (int i = 0, n = windows.size(); i < n; i++) {
             final WindowState w = windows.get(i);
@@ -250,21 +213,11 @@
 
     private void assignAnimLayer(WindowState w, int layer) {
         w.mLayer = layer;
-        w.mWinAnimator.mAnimLayer = w.mLayer + w.getAnimLayerAdjustment() +
-                    getSpecialWindowAnimLayerAdjustment(w);
+        w.mWinAnimator.mAnimLayer = w.getAnimLayerAdjustment()
+                + w.getSpecialWindowAnimLayerAdjustment();
         if (w.mAppToken != null && w.mAppToken.mAppAnimator.thumbnailForceAboveLayer > 0
                 && w.mWinAnimator.mAnimLayer > w.mAppToken.mAppAnimator.thumbnailForceAboveLayer) {
             w.mAppToken.mAppAnimator.thumbnailForceAboveLayer = w.mWinAnimator.mAnimLayer;
         }
     }
-
-    void dump(PrintWriter pw, String s) {
-        if (mInputMethodAnimLayerAdjustment != 0 ||
-                mService.mWallpaperControllerLocked.getAnimLayerAdjustment() != 0) {
-            pw.print("  mInputMethodAnimLayerAdjustment=");
-            pw.print(mInputMethodAnimLayerAdjustment);
-            pw.print("  mWallpaperAnimLayerAdjustment=");
-            pw.println(mService.mWallpaperControllerLocked.getAnimLayerAdjustment());
-        }
-    }
 }
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 02d04cc..b90dc93 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -675,8 +675,6 @@
 
     WallpaperController mWallpaperControllerLocked;
 
-    final WindowLayersController mLayersController;
-
     boolean mAnimateWallpaperWithTarget;
 
     // TODO: Move to RootWindowContainer
@@ -685,19 +683,19 @@
     PowerManager mPowerManager;
     PowerManagerInternal mPowerManagerInternal;
 
-    float mWindowAnimationScaleSetting = 1.0f;
-    float mTransitionAnimationScaleSetting = 1.0f;
-    float mAnimatorDurationScaleSetting = 1.0f;
-    boolean mAnimationsDisabled = false;
+    private float mWindowAnimationScaleSetting = 1.0f;
+    private float mTransitionAnimationScaleSetting = 1.0f;
+    private float mAnimatorDurationScaleSetting = 1.0f;
+    private boolean mAnimationsDisabled = false;
 
     final InputManagerService mInputManager;
     final DisplayManagerInternal mDisplayManagerInternal;
     final DisplayManager mDisplayManager;
-    final Display[] mDisplays;
+    private final Display[] mDisplays;
 
     // Who is holding the screen on.
-    Session mHoldingScreenOn;
-    PowerManager.WakeLock mHoldingScreenWakeLock;
+    private Session mHoldingScreenOn;
+    private PowerManager.WakeLock mHoldingScreenWakeLock;
 
     boolean mTurnOnScreen;
 
@@ -708,7 +706,7 @@
     DragState mDragState = null;
 
     // For frozen screen animations.
-    int mExitAnimId, mEnterAnimId;
+    private int mExitAnimId, mEnterAnimId;
 
     boolean mAnimationScheduled;
 
@@ -972,7 +970,6 @@
 
         mWallpaperControllerLocked = new WallpaperController(this);
         mWindowPlacerLocked = new WindowSurfacePlacer(this);
-        mLayersController = new WindowLayersController(this);
         mPolicy = policy;
 
         LocalServices.addService(WindowManagerPolicy.class, mPolicy);
@@ -1120,7 +1117,8 @@
         // TODO(multidisplay): Needs some serious rethought when the target and IME are not on the
         // same display. Or even when the current IME/target are not on the same screen as the next
         // IME/target. For now only look for input windows on the main screen.
-        WindowList windows = getDefaultWindowListLocked();
+        final DisplayContent dc = getDefaultDisplayContentLocked();
+        final WindowList windows = dc.getWindowList();
         WindowState w = null;
         int i;
         for (i = windows.size() - 1; i >= 0; --i) {
@@ -1235,10 +1233,10 @@
                 mInputMethodTarget = w;
                 mInputMethodTargetWaitingAnim = false;
                 if (w.mAppToken != null) {
-                    mLayersController.setInputMethodAnimLayerAdjustment(
+                    dc.setInputMethodAnimLayerAdjustment(
                             w.mAppToken.mAppAnimator.animLayerAdjustment);
                 } else {
-                    mLayersController.setInputMethodAnimLayerAdjustment(0);
+                    dc.setInputMethodAnimLayerAdjustment(0);
                 }
             }
 
@@ -1260,7 +1258,7 @@
             if (DEBUG_INPUT_METHOD) Slog.w(TAG_WM, "Moving IM target from " + curTarget + " to null."
                     + (SHOW_STACK_CRAWLS ? " Callers=" + Debug.getCallers(4) : ""));
             mInputMethodTarget = null;
-            mLayersController.setInputMethodAnimLayerAdjustment(0);
+            dc.setInputMethodAnimLayerAdjustment(0);
         }
         return -1;
     }
@@ -1426,7 +1424,7 @@
         }
 
         if (needAssignLayers) {
-            mLayersController.assignLayersLocked(windows);
+            getDefaultDisplayContentLocked().assignWindowLayers(false /* setLayoutNeeded */);
         }
 
         return true;
@@ -1804,9 +1802,9 @@
                 moveInputMethodWindowsIfNeededLocked(false);
             }
 
-            mLayersController.assignLayersLocked(displayContent.getWindowList());
             // Don't do layout here, the window must call
             // relayout to be displayed, so we'll do it there.
+            displayContent.assignWindowLayers(false /* setLayoutNeeded */);
 
             if (focusChanged) {
                 mInputMonitor.setInputFocusLw(mCurrentFocus, false /*updateInputWindows*/);
@@ -2019,8 +2017,7 @@
         if (windows != null) {
             windows.remove(win);
             if (!mWindowPlacerLocked.isInLayout()) {
-                mLayersController.assignLayersLocked(windows);
-                win.setDisplayLayoutNeeded();
+                win.getDisplayContent().assignWindowLayers(true /* setLayoutNeeded */);
                 mWindowPlacerLocked.performSurfacePlacement();
                 if (win.mAppToken != null) {
                     win.mAppToken.updateReportedVisibilityLocked();
@@ -2398,7 +2395,7 @@
                 // its layer recomputed.  However, if the IME was hidden
                 // and isn't actually moved in the list, its layer may be
                 // out of data so we make sure to recompute it.
-                mLayersController.assignLayersLocked(win.getWindowList());
+                win.getDisplayContent().assignWindowLayers(false /* setLayoutNeeded */);
             }
 
             if (wallpaperMayMove) {
@@ -3719,7 +3716,7 @@
 
         if (!updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES,
                 false /*updateInputWindows*/)) {
-            mLayersController.assignLayersLocked(displayContent.getWindowList());
+            displayContent.assignWindowLayers(false /* setLayoutNeeded */);
         }
 
         mInputMonitor.setUpdateInputWindowsNeededLw();
@@ -8098,7 +8095,7 @@
                 } else if (mode == UPDATE_FOCUS_WILL_PLACE_SURFACES) {
                     // Client will do the layout, but we need to assign layers
                     // for handleNewWindowLocked() below.
-                    mLayersController.assignLayersLocked(displayContent.getWindowList());
+                    displayContent.assignWindowLayers(false /* setLayoutNeeded */);
                 }
             }
 
@@ -8758,7 +8755,6 @@
             }
             mWindowPlacerLocked.dump(pw, "  ");
             mWallpaperControllerLocked.dump(pw, "  ");
-            mLayersController.dump(pw, "  ");
             pw.print("  mSystemBooted="); pw.print(mSystemBooted);
                     pw.print(" mDisplayEnabled="); pw.println(mDisplayEnabled);
 
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index fa4dbc4..617c145 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -1986,6 +1986,17 @@
         return 0;
     }
 
+    int getSpecialWindowAnimLayerAdjustment() {
+        int specialAdjustment = 0;
+        if (mIsImWindow) {
+            specialAdjustment = getDisplayContent().mInputMethodAnimLayerAdjustment;
+        } else if (mIsWallpaper) {
+            specialAdjustment = mService.mWallpaperControllerLocked.getAnimLayerAdjustment();
+        }
+
+        return mLayer + specialAdjustment;
+    }
+
     void scheduleAnimationIfDimming() {
         final DisplayContent dc = getDisplayContent();
         if (dc == null) {
diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java
index 53fb99b..12e5bce 100644
--- a/services/core/java/com/android/server/wm/WindowStateAnimator.java
+++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java
@@ -461,8 +461,7 @@
         if (mAnimator.mWindowDetachedWallpaper == mWin) {
             mAnimator.mWindowDetachedWallpaper = null;
         }
-        mAnimLayer = mWin.mLayer
-                + mService.mLayersController.getSpecialWindowAnimLayerAdjustment(mWin);
+        mAnimLayer = mWin.getSpecialWindowAnimLayerAdjustment();
         if (DEBUG_LAYERS) Slog.v(TAG, "Stepping win " + this + " anim layer: " + mAnimLayer);
         mHasTransformation = false;
         mHasLocalTransformation = false;
diff --git a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java
index 285a75c..336bc68 100644
--- a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java
+++ b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java
@@ -532,7 +532,7 @@
         // TODO(multidisplay): IMEs are only supported on the default display.
         if (windows == mService.getDefaultWindowListLocked()
                 && !mService.moveInputMethodWindowsIfNeededLocked(true)) {
-            mService.mLayersController.assignLayersLocked(windows);
+            mService.getDefaultDisplayContentLocked().assignWindowLayers(false /*setLayoutNeeded*/);
         }
         mService.updateFocusedWindowLocked(UPDATE_FOCUS_PLACING_SURFACES,
                 true /*updateInputWindows*/);
diff --git a/services/core/java/com/android/server/wm/WindowToken.java b/services/core/java/com/android/server/wm/WindowToken.java
index 218972a..afaaeb9 100644
--- a/services/core/java/com/android/server/wm/WindowToken.java
+++ b/services/core/java/com/android/server/wm/WindowToken.java
@@ -140,7 +140,7 @@
                 highestAnimLayer = winHighestAnimLayer;
             }
             if (w == mService.mInputMethodTarget && !mService.mInputMethodTargetWaitingAnim) {
-                mService.mLayersController.setInputMethodAnimLayerAdjustment(adj);
+                mDisplayContent.setInputMethodAnimLayerAdjustment(adj);
             }
         }
         return highestAnimLayer;
