diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java
index 248e83747c48f6f48af23eae2b2f96170d933d3e..bb262d3df07fc92dd835cf8791566cbc7b8f9ef0 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java
@@ -116,7 +116,8 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin
         this (context, displayController, taskOrganizer, taskInfo, taskSurface, windowDecorConfig,
                 handler, choreographer, syncQueue, rootTaskDisplayAreaOrganizer,
                 SurfaceControl.Builder::new, SurfaceControl.Transaction::new,
-                WindowContainerTransaction::new, new SurfaceControlViewHostFactory() {});
+                WindowContainerTransaction::new, SurfaceControl::new,
+                new SurfaceControlViewHostFactory() {});
     }
 
     DesktopModeWindowDecoration(
@@ -133,10 +134,12 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin
             Supplier<SurfaceControl.Builder> surfaceControlBuilderSupplier,
             Supplier<SurfaceControl.Transaction> surfaceControlTransactionSupplier,
             Supplier<WindowContainerTransaction> windowContainerTransactionSupplier,
+            Supplier<SurfaceControl> surfaceControlSupplier,
             SurfaceControlViewHostFactory surfaceControlViewHostFactory) {
         super(context, displayController, taskOrganizer, taskInfo, taskSurface, windowDecorConfig,
                 surfaceControlBuilderSupplier, surfaceControlTransactionSupplier,
-                windowContainerTransactionSupplier, surfaceControlViewHostFactory);
+                windowContainerTransactionSupplier, surfaceControlSupplier,
+                surfaceControlViewHostFactory);
 
         mHandler = handler;
         mChoreographer = choreographer;
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/WindowDecoration.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/WindowDecoration.java
index d0e647b30a9658a761bc8ea1c4e76fedc4dcf4f4..044c0331282c93f45e3a6481c322275f4267ede3 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/WindowDecoration.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/WindowDecoration.java
@@ -20,6 +20,7 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
 import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
 import static android.view.WindowInsets.Type.statusBars;
 
+import android.annotation.NonNull;
 import android.app.ActivityManager.RunningTaskInfo;
 import android.app.WindowConfiguration.WindowingMode;
 import android.content.Context;
@@ -137,7 +138,8 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer>
             Configuration windowDecorConfig) {
         this(context, displayController, taskOrganizer, taskInfo, taskSurface, windowDecorConfig,
                 SurfaceControl.Builder::new, SurfaceControl.Transaction::new,
-                WindowContainerTransaction::new, new SurfaceControlViewHostFactory() {});
+                WindowContainerTransaction::new, SurfaceControl::new,
+                new SurfaceControlViewHostFactory() {});
     }
 
     WindowDecoration(
@@ -145,17 +147,18 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer>
             DisplayController displayController,
             ShellTaskOrganizer taskOrganizer,
             RunningTaskInfo taskInfo,
-            SurfaceControl taskSurface,
+            @NonNull SurfaceControl taskSurface,
             Configuration windowDecorConfig,
             Supplier<SurfaceControl.Builder> surfaceControlBuilderSupplier,
             Supplier<SurfaceControl.Transaction> surfaceControlTransactionSupplier,
             Supplier<WindowContainerTransaction> windowContainerTransactionSupplier,
+            Supplier<SurfaceControl> surfaceControlSupplier,
             SurfaceControlViewHostFactory surfaceControlViewHostFactory) {
         mContext = context;
         mDisplayController = displayController;
         mTaskOrganizer = taskOrganizer;
         mTaskInfo = taskInfo;
-        mTaskSurface = taskSurface;
+        mTaskSurface = cloneSurfaceControl(taskSurface, surfaceControlSupplier);
         mSurfaceControlBuilderSupplier = surfaceControlBuilderSupplier;
         mSurfaceControlTransactionSupplier = surfaceControlTransactionSupplier;
         mWindowContainerTransactionSupplier = windowContainerTransactionSupplier;
@@ -453,6 +456,7 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer>
     public void close() {
         mDisplayController.removeDisplayWindowListener(mOnDisplaysChangedListener);
         releaseViews();
+        mTaskSurface.release();
     }
 
     static int loadDimensionPixelSize(Resources resources, int resourceId) {
@@ -469,6 +473,13 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer>
         return resources.getDimension(resourceId);
     }
 
+    private static SurfaceControl cloneSurfaceControl(SurfaceControl sc,
+            Supplier<SurfaceControl> surfaceControlSupplier) {
+        final SurfaceControl copy = surfaceControlSupplier.get();
+        copy.copyFrom(sc, "WindowDecoration");
+        return copy;
+    }
+
     /**
      * Create a window associated with this WindowDecoration.
      * Note that subclass must dispose of this when the task is hidden/closed.
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorationTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorationTests.java
index a2dbab197fb56f2dabfc0aff362a869b1e2c9b1d..18fcdd00df9d155fb67689aaa9276425b55ec0b3 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorationTests.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorationTests.java
@@ -111,7 +111,8 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase {
                 mMockShellTaskOrganizer, taskInfo, mMockSurfaceControl, mConfiguration,
                 mMockHandler, mMockChoreographer, mMockSyncQueue, mMockRootTaskDisplayAreaOrganizer,
                 SurfaceControl.Builder::new, mMockTransactionSupplier,
-                WindowContainerTransaction::new, mMockSurfaceControlViewHostFactory);
+                WindowContainerTransaction::new, SurfaceControl::new,
+                mMockSurfaceControlViewHostFactory);
     }
 
     private ActivityManager.RunningTaskInfo createTaskInfo(boolean visible) {
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/WindowDecorationTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/WindowDecorationTests.java
index 8061aa3f844abbd53e77ad2277786bb77add6734..8e42f74b8d17665db602bea5c512816db3a03f9f 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/WindowDecorationTests.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/WindowDecorationTests.java
@@ -121,6 +121,8 @@ public class WindowDecorationTests extends ShellTestCase {
     private WindowContainerTransaction mMockWindowContainerTransaction;
     @Mock
     private SurfaceSyncGroup mMockSurfaceSyncGroup;
+    @Mock
+    private SurfaceControl mMockTaskSurface;
 
     private final List<SurfaceControl.Transaction> mMockSurfaceControlTransactions =
             new ArrayList<>();
@@ -189,8 +191,7 @@ public class WindowDecorationTests extends ShellTestCase {
         // Density is 2. Shadow radius is 10px. Caption height is 64px.
         taskInfo.configuration.densityDpi = DisplayMetrics.DENSITY_DEFAULT * 2;
 
-        final SurfaceControl taskSurface = mock(SurfaceControl.class);
-        final TestWindowDecoration windowDecor = createWindowDecoration(taskInfo, taskSurface);
+        final TestWindowDecoration windowDecor = createWindowDecoration(taskInfo);
 
         windowDecor.relayout(taskInfo);
 
@@ -199,7 +200,7 @@ public class WindowDecorationTests extends ShellTestCase {
         verify(captionContainerSurfaceBuilder, never()).build();
         verify(mMockSurfaceControlViewHostFactory, never()).create(any(), any(), any());
 
-        verify(mMockSurfaceControlFinishT).hide(taskSurface);
+        verify(mMockSurfaceControlFinishT).hide(mMockTaskSurface);
 
         assertNull(mRelayoutResult.mRootView);
     }
@@ -229,12 +230,11 @@ public class WindowDecorationTests extends ShellTestCase {
         taskInfo.isFocused = true;
         // Density is 2. Shadow radius is 10px. Caption height is 64px.
         taskInfo.configuration.densityDpi = DisplayMetrics.DENSITY_DEFAULT * 2;
-        final SurfaceControl taskSurface = mock(SurfaceControl.class);
-        final TestWindowDecoration windowDecor = createWindowDecoration(taskInfo, taskSurface);
+        final TestWindowDecoration windowDecor = createWindowDecoration(taskInfo);
 
         windowDecor.relayout(taskInfo);
 
-        verify(decorContainerSurfaceBuilder).setParent(taskSurface);
+        verify(decorContainerSurfaceBuilder).setParent(mMockTaskSurface);
         verify(decorContainerSurfaceBuilder).setContainerLayer();
         verify(mMockSurfaceControlStartT).setTrustedOverlay(decorContainerSurface, true);
         verify(mMockSurfaceControlStartT).setWindowCrop(decorContainerSurface, 300, 100);
@@ -262,14 +262,15 @@ public class WindowDecorationTests extends ShellTestCase {
         }
 
         verify(mMockSurfaceControlFinishT)
-                .setPosition(taskSurface, TASK_POSITION_IN_PARENT.x, TASK_POSITION_IN_PARENT.y);
+                .setPosition(mMockTaskSurface, TASK_POSITION_IN_PARENT.x,
+                        TASK_POSITION_IN_PARENT.y);
         verify(mMockSurfaceControlFinishT)
-                .setWindowCrop(taskSurface, 300, 100);
-        verify(mMockSurfaceControlStartT).setCornerRadius(taskSurface, CORNER_RADIUS);
-        verify(mMockSurfaceControlFinishT).setCornerRadius(taskSurface, CORNER_RADIUS);
+                .setWindowCrop(mMockTaskSurface, 300, 100);
+        verify(mMockSurfaceControlStartT).setCornerRadius(mMockTaskSurface, CORNER_RADIUS);
+        verify(mMockSurfaceControlFinishT).setCornerRadius(mMockTaskSurface, CORNER_RADIUS);
         verify(mMockSurfaceControlStartT)
-                .show(taskSurface);
-        verify(mMockSurfaceControlStartT).setShadowRadius(taskSurface, 10);
+                .show(mMockTaskSurface);
+        verify(mMockSurfaceControlStartT).setShadowRadius(mMockTaskSurface, 10);
 
         assertEquals(300, mRelayoutResult.mWidth);
         assertEquals(100, mRelayoutResult.mHeight);
@@ -308,8 +309,7 @@ public class WindowDecorationTests extends ShellTestCase {
         taskInfo.configuration.densityDpi = DisplayMetrics.DENSITY_DEFAULT * 2;
         mWindowConfiguration.densityDpi = taskInfo.configuration.densityDpi;
 
-        final SurfaceControl taskSurface = mock(SurfaceControl.class);
-        final TestWindowDecoration windowDecor = createWindowDecoration(taskInfo, taskSurface);
+        final TestWindowDecoration windowDecor = createWindowDecoration(taskInfo);
 
         windowDecor.relayout(taskInfo);
 
@@ -346,8 +346,7 @@ public class WindowDecorationTests extends ShellTestCase {
                 .setVisible(true)
                 .build();
 
-        final TestWindowDecoration windowDecor =
-                createWindowDecoration(taskInfo, new SurfaceControl());
+        final TestWindowDecoration windowDecor = createWindowDecoration(taskInfo);
         windowDecor.relayout(taskInfo);
 
         // It shouldn't show the window decoration when it can't obtain the display instance.
@@ -405,8 +404,7 @@ public class WindowDecorationTests extends ShellTestCase {
                 .build();
         taskInfo.isFocused = true;
         taskInfo.configuration.densityDpi = DisplayMetrics.DENSITY_DEFAULT * 2;
-        final SurfaceControl taskSurface = mock(SurfaceControl.class);
-        final TestWindowDecoration windowDecor = createWindowDecoration(taskInfo, taskSurface);
+        final TestWindowDecoration windowDecor = createWindowDecoration(taskInfo);
         windowDecor.relayout(taskInfo);
 
         final SurfaceControl additionalWindowSurface = mock(SurfaceControl.class);
@@ -465,8 +463,7 @@ public class WindowDecorationTests extends ShellTestCase {
                 .build();
         taskInfo.isFocused = true;
         taskInfo.configuration.densityDpi = DisplayMetrics.DENSITY_DEFAULT * 2;
-        final SurfaceControl taskSurface = mock(SurfaceControl.class);
-        final TestWindowDecoration windowDecor = createWindowDecoration(taskInfo, taskSurface);
+        final TestWindowDecoration windowDecor = createWindowDecoration(taskInfo);
 
         windowDecor.relayout(taskInfo);
 
@@ -506,8 +503,7 @@ public class WindowDecorationTests extends ShellTestCase {
                 .build();
         taskInfo.isFocused = true;
         taskInfo.configuration.densityDpi = DisplayMetrics.DENSITY_DEFAULT * 2;
-        final SurfaceControl taskSurface = mock(SurfaceControl.class);
-        final TestWindowDecoration windowDecor = createWindowDecoration(taskInfo, taskSurface);
+        final TestWindowDecoration windowDecor = createWindowDecoration(taskInfo);
 
         windowDecor.relayout(taskInfo, true /* applyStartTransactionOnDraw */);
 
@@ -545,12 +541,11 @@ public class WindowDecorationTests extends ShellTestCase {
                 .setWindowingMode(WINDOWING_MODE_FREEFORM)
                 .build();
         taskInfo.isFocused = true;
-        final SurfaceControl taskSurface = mock(SurfaceControl.class);
-        final TestWindowDecoration windowDecor = createWindowDecoration(taskInfo, taskSurface);
+        final TestWindowDecoration windowDecor = createWindowDecoration(taskInfo);
 
         windowDecor.relayout(taskInfo);
 
-        verify(mMockSurfaceControlStartT).setColor(taskSurface, new float[]{1.f, 1.f, 0.f});
+        verify(mMockSurfaceControlStartT).setColor(mMockTaskSurface, new float[]{1.f, 1.f, 0.f});
 
         mockitoSession.finishMocking();
     }
@@ -568,8 +563,7 @@ public class WindowDecorationTests extends ShellTestCase {
                 .setTaskDescriptionBuilder(taskDescriptionBuilder)
                 .setVisible(true)
                 .build();
-        final SurfaceControl taskSurface = mock(SurfaceControl.class);
-        final TestWindowDecoration windowDecor = createWindowDecoration(taskInfo, taskSurface);
+        final TestWindowDecoration windowDecor = createWindowDecoration(taskInfo);
 
         assertTrue(mInsetsState.getOrCreateSource(STATUS_BAR_INSET_SOURCE_ID, statusBars())
                 .isVisible());
@@ -613,12 +607,11 @@ public class WindowDecorationTests extends ShellTestCase {
                 .setWindowingMode(WINDOWING_MODE_FULLSCREEN)
                 .build();
         taskInfo.isFocused = true;
-        final SurfaceControl taskSurface = mock(SurfaceControl.class);
-        final TestWindowDecoration windowDecor = createWindowDecoration(taskInfo, taskSurface);
+        final TestWindowDecoration windowDecor = createWindowDecoration(taskInfo);
 
         windowDecor.relayout(taskInfo);
 
-        verify(mMockSurfaceControlStartT).unsetColor(taskSurface);
+        verify(mMockSurfaceControlStartT).unsetColor(mMockTaskSurface);
 
         mockitoSession.finishMocking();
     }
@@ -639,8 +632,7 @@ public class WindowDecorationTests extends ShellTestCase {
                 .setTaskDescriptionBuilder(taskDescriptionBuilder)
                 .setVisible(true)
                 .build();
-        final SurfaceControl taskSurface = mock(SurfaceControl.class);
-        final TestWindowDecoration windowDecor = createWindowDecoration(taskInfo, taskSurface);
+        final TestWindowDecoration windowDecor = createWindowDecoration(taskInfo);
 
         windowDecor.relayout(taskInfo);
 
@@ -650,15 +642,15 @@ public class WindowDecorationTests extends ShellTestCase {
                 eq(0) /* index */, eq(mandatorySystemGestures()));
     }
 
-    private TestWindowDecoration createWindowDecoration(
-            ActivityManager.RunningTaskInfo taskInfo, SurfaceControl testSurface) {
+    private TestWindowDecoration createWindowDecoration(ActivityManager.RunningTaskInfo taskInfo) {
         return new TestWindowDecoration(mContext, mMockDisplayController, mMockShellTaskOrganizer,
-                taskInfo, testSurface, mWindowConfiguration,
+                taskInfo, mMockTaskSurface, mWindowConfiguration,
                 new MockObjectSupplier<>(mMockSurfaceControlBuilders,
                         () -> createMockSurfaceControlBuilder(mock(SurfaceControl.class))),
                 new MockObjectSupplier<>(mMockSurfaceControlTransactions,
                         () -> mock(SurfaceControl.Transaction.class)),
-                () -> mMockWindowContainerTransaction, mMockSurfaceControlViewHostFactory);
+                () -> mMockWindowContainerTransaction, () -> mMockTaskSurface,
+                mMockSurfaceControlViewHostFactory);
     }
 
     private class MockObjectSupplier<T> implements Supplier<T> {
@@ -697,11 +689,12 @@ public class WindowDecorationTests extends ShellTestCase {
                 Supplier<SurfaceControl.Builder> surfaceControlBuilderSupplier,
                 Supplier<SurfaceControl.Transaction> surfaceControlTransactionSupplier,
                 Supplier<WindowContainerTransaction> windowContainerTransactionSupplier,
+                Supplier<SurfaceControl> surfaceControlSupplier,
                 SurfaceControlViewHostFactory surfaceControlViewHostFactory) {
             super(context, displayController, taskOrganizer, taskInfo, taskSurface,
                     windowConfiguration, surfaceControlBuilderSupplier,
                     surfaceControlTransactionSupplier, windowContainerTransactionSupplier,
-                    surfaceControlViewHostFactory);
+                    surfaceControlSupplier, surfaceControlViewHostFactory);
         }
 
         @Override