diff --git a/DrmHwcTwo.cpp b/DrmHwcTwo.cpp
index abf24e1..b57d2f3 100644
--- a/DrmHwcTwo.cpp
+++ b/DrmHwcTwo.cpp
@@ -790,16 +790,6 @@
     return HWC2::Error::BadConfig;
   }
 
-  // Disable the planes we're not using
-  for (auto i = primary_planes.begin(); i != primary_planes.end();) {
-    composition->AddPlaneDisable(*i);
-    i = primary_planes.erase(i);
-  }
-  for (auto i = overlay_planes.begin(); i != overlay_planes.end();) {
-    composition->AddPlaneDisable(*i);
-    i = overlay_planes.erase(i);
-  }
-
   a_args.composition = composition;
   ret = compositor_.ExecuteAtomicCommit(a_args);
 
diff --git a/compositor/DrmDisplayComposition.cpp b/compositor/DrmDisplayComposition.cpp
index cd95267..96e95ad 100644
--- a/compositor/DrmDisplayComposition.cpp
+++ b/compositor/DrmDisplayComposition.cpp
@@ -45,11 +45,6 @@
   return 0;
 }
 
-int DrmDisplayComposition::AddPlaneDisable(DrmPlane *plane) {
-  composition_planes_.emplace_back(DrmCompositionPlane::Type::kDisable, plane);
-  return 0;
-}
-
 int DrmDisplayComposition::AddPlaneComposition(DrmCompositionPlane plane) {
   composition_planes_.emplace_back(std::move(plane));
   return 0;
diff --git a/compositor/DrmDisplayComposition.h b/compositor/DrmDisplayComposition.h
index f1958d7..2ddfaac 100644
--- a/compositor/DrmDisplayComposition.h
+++ b/compositor/DrmDisplayComposition.h
@@ -34,22 +34,13 @@
 
 class DrmCompositionPlane {
  public:
-  enum class Type : int32_t {
-    kDisable,
-    kLayer,
-  };
-
   DrmCompositionPlane() = default;
   DrmCompositionPlane(DrmCompositionPlane &&rhs) = default;
   DrmCompositionPlane &operator=(DrmCompositionPlane &&other) = default;
-  DrmCompositionPlane(Type type, DrmPlane *plane) : type_(type), plane_(plane) {
+  DrmCompositionPlane(DrmPlane *plane) : plane_(plane) {
   }
-  DrmCompositionPlane(Type type, DrmPlane *plane, size_t source_layer)
-      : type_(type), plane_(plane), source_layers_(1, source_layer) {
-  }
-
-  Type type() const {
-    return type_;
+  DrmCompositionPlane(DrmPlane *plane, size_t source_layer)
+      : plane_(plane), source_layers_(1, source_layer) {
   }
 
   DrmPlane *plane() const {
@@ -68,7 +59,6 @@
   }
 
  private:
-  Type type_ = Type::kDisable;
   DrmPlane *plane_ = NULL;
   std::vector<size_t> source_layers_;
 };
@@ -81,7 +71,6 @@
 
   int SetLayers(DrmHwcLayer *layers, size_t num_layers);
   int AddPlaneComposition(DrmCompositionPlane plane);
-  int AddPlaneDisable(DrmPlane *plane);
 
   int Plan(std::vector<DrmPlane *> *primary_planes,
            std::vector<DrmPlane *> *overlay_planes);
diff --git a/compositor/DrmDisplayCompositor.cpp b/compositor/DrmDisplayCompositor.cpp
index dcc82fe..660052a 100644
--- a/compositor/DrmDisplayCompositor.cpp
+++ b/compositor/DrmDisplayCompositor.cpp
@@ -140,6 +140,8 @@
     }
   }
 
+  auto unused_planes = new_frame_state.used_planes;
+
   if (args.composition) {
     new_frame_state.used_framebuffers.clear();
     new_frame_state.used_planes.clear();
@@ -152,31 +154,29 @@
       DrmPlane *plane = comp_plane.plane();
       std::vector<size_t> &source_layers = comp_plane.source_layers();
 
-      if (comp_plane.type() != DrmCompositionPlane::Type::kDisable) {
-        if (source_layers.size() > 1) {
-          ALOGE("Can't handle more than one source layer sz=%zu type=%d",
-                source_layers.size(), comp_plane.type());
-          continue;
-        }
+      if (source_layers.size() > 1) {
+        ALOGE("Can't handle more than one source layer sz=%zu",
+              source_layers.size());
+        continue;
+      }
 
-        if (source_layers.empty() || source_layers.front() >= layers.size()) {
-          ALOGE("Source layer index %zu out of bounds %zu type=%d",
-                source_layers.front(), layers.size(), comp_plane.type());
-          return -EINVAL;
-        }
-        DrmHwcLayer &layer = layers[source_layers.front()];
+      if (source_layers.empty() || source_layers.front() >= layers.size()) {
+        ALOGE("Source layer index %zu out of bounds %zu", source_layers.front(),
+              layers.size());
+        return -EINVAL;
+      }
+      DrmHwcLayer &layer = layers[source_layers.front()];
 
-        new_frame_state.used_framebuffers.emplace_back(layer.FbIdHandle);
-        new_frame_state.used_planes.emplace_back(plane);
+      new_frame_state.used_framebuffers.emplace_back(layer.FbIdHandle);
+      new_frame_state.used_planes.emplace_back(plane);
 
-        if (plane->AtomicSetState(*pset, layer, source_layers.front(),
-                                  crtc->id()) != 0) {
-          return -EINVAL;
-        }
-      } else {
-        if (plane->AtomicDisablePlane(*pset) != 0) {
-          return -EINVAL;
-        }
+      /* Remove from 'unused' list, since plane is re-used */
+      auto &v = unused_planes;
+      v.erase(std::remove(v.begin(), v.end(), plane), v.end());
+
+      if (plane->AtomicSetState(*pset, layer, source_layers.front(),
+                                crtc->id()) != 0) {
+        return -EINVAL;
       }
     }
   }
@@ -184,7 +184,10 @@
   if (args.clear_active_composition) {
     new_frame_state.used_framebuffers.clear();
     new_frame_state.used_planes.clear();
-    for (auto *plane : active_frame_state.used_planes) {
+  }
+
+  if (args.clear_active_composition || args.composition) {
+    for (auto *plane : unused_planes) {
       if (plane->AtomicDisablePlane(*pset) != 0) {
         return -EINVAL;
       }
diff --git a/compositor/Planner.cpp b/compositor/Planner.cpp
index 9db03c3..fd9678c 100644
--- a/compositor/Planner.cpp
+++ b/compositor/Planner.cpp
@@ -70,8 +70,7 @@
 
 int PlanStageProtected::ProvisionPlanes(
     std::vector<DrmCompositionPlane> *composition,
-    std::map<size_t, DrmHwcLayer *> &layers,
-    std::vector<DrmPlane *> *planes) {
+    std::map<size_t, DrmHwcLayer *> &layers, std::vector<DrmPlane *> *planes) {
   int ret = 0;
   for (auto i = layers.begin(); i != layers.end();) {
     if (!i->second->protected_usage()) {
@@ -79,8 +78,7 @@
       continue;
     }
 
-    ret = Emplace(composition, planes, DrmCompositionPlane::Type::kLayer,
-                  std::make_pair(i->first, i->second));
+    ret = Emplace(composition, planes, std::make_pair(i->first, i->second));
     if (ret) {
       ALOGE("Failed to dedicate protected layer! Dropping it.");
       return ret;
@@ -94,12 +92,10 @@
 
 int PlanStageGreedy::ProvisionPlanes(
     std::vector<DrmCompositionPlane> *composition,
-    std::map<size_t, DrmHwcLayer *> &layers,
-    std::vector<DrmPlane *> *planes) {
+    std::map<size_t, DrmHwcLayer *> &layers, std::vector<DrmPlane *> *planes) {
   // Fill up the remaining planes
   for (auto i = layers.begin(); i != layers.end(); i = layers.erase(i)) {
-    int ret = Emplace(composition, planes, DrmCompositionPlane::Type::kLayer,
-                      std::make_pair(i->first, i->second));
+    int ret = Emplace(composition, planes, std::make_pair(i->first, i->second));
     // We don't have any planes left
     if (ret == -ENOENT)
       break;
diff --git a/compositor/Planner.h b/compositor/Planner.h
index 3390acb..b54a9be 100644
--- a/compositor/Planner.h
+++ b/compositor/Planner.h
@@ -55,7 +55,6 @@
     // Inserts the given layer:plane in the composition at the back
     static int Emplace(std::vector<DrmCompositionPlane> *composition,
                        std::vector<DrmPlane *> *planes,
-                       DrmCompositionPlane::Type type,
                        std::pair<size_t, DrmHwcLayer *> layer) {
       DrmPlane *plane = PopPlane(planes);
       std::vector<DrmPlane *> unused_planes;
@@ -70,7 +69,7 @@
       }
 
       if (!ret) {
-        composition->emplace_back(type, plane, layer.first);
+        composition->emplace_back(plane, layer.first);
         planes->insert(planes->begin(), unused_planes.begin(),
                        unused_planes.end());
       }
