diff --git a/libhwcomposer/hwc.cpp b/libhwcomposer/hwc.cpp
index a2c7ad3..e4f7f5f 100644
--- a/libhwcomposer/hwc.cpp
+++ b/libhwcomposer/hwc.cpp
@@ -260,48 +260,6 @@
     }
 }
 
-static bool optimizePrepare(hwc_context_t *ctx, int numDisplays,
-                            hwc_display_contents_1_t** displays) {
-
-    /* Do not re-program H/W, if frame geometry has not changed.
-     * But honor these exceptions:
-     * 1. Padding round
-     * 2. Idle fallback
-     * 3. Overlay is not configured
-     * 4. External/Virtual display is in Configure state
-     * 5. External/Virtual is Paused OR not connected/active
-     * 6. Non-Overlay device
-     */
-
-    if (ctx->isPaddingRound || MDPComp::isIdleFallback() ||
-        !ctx->mOverlay->isConfigured() || isSecondaryConfiguring(ctx) ||
-        ctx->mMDP.version < qdutils::MDP_V4_0) {
-        return false;
-    }
-
-    bool isOptimized = false;
-    for (uint32_t i = 0; i < numDisplays; i++) {
-        hwc_display_contents_1_t *list = displays[i];
-
-        if (list) {
-            if (list->flags & HWC_GEOMETRY_CHANGED) {
-                return false;
-            }
-            int dpy = getDpyforExternalDisplay(ctx, i);
-            if (dpy && (ctx->dpyAttr[dpy].isPause ||
-                !ctx->dpyAttr[dpy].connected ||
-                !ctx->dpyAttr[dpy].isActive)) {
-                return false;
-            }
-            // Set layer composition type as per last frame
-            ctx->mMDPComp[dpy]->setMDPCompLayerFlags(ctx, list);
-            isOptimized = true;
-        }
-    }
-
-    return isOptimized;
-}
-
 static int hwc_prepare_primary(hwc_composer_device_1 *dev,
         hwc_display_contents_1_t *list) {
     ATRACE_CALL();
@@ -387,12 +345,6 @@
     setPaddingRound(ctx,numDisplays,displays);
     setDMAState(ctx,numDisplays,displays);
     setNumActiveDisplays(ctx,numDisplays,displays);
-
-    if (optimizePrepare(ctx, numDisplays, displays)) {
-        // Do not re-program H/W, if it is not needed
-        return ret;
-    }
-
     reset(ctx, (int)numDisplays, displays);
 
     ctx->mOverlay->configBegin();
diff --git a/libhwcomposer/hwc_mdpcomp.h b/libhwcomposer/hwc_mdpcomp.h
index 7d4214a..8186fff 100644
--- a/libhwcomposer/hwc_mdpcomp.h
+++ b/libhwcomposer/hwc_mdpcomp.h
@@ -54,9 +54,6 @@
     static void resetIdleFallBack() { sIdleFallBack = false; }
     static void reset() { sHandleTimeout = false; };
     static bool isIdleFallback() { return sIdleFallBack; }
-    /* set/reset flags for MDPComp */
-    void setMDPCompLayerFlags(hwc_context_t *ctx,
-                              hwc_display_contents_1_t* list);
 
 protected:
     enum { MAX_SEC_LAYERS = 1 }; //TODO add property support
@@ -145,6 +142,9 @@
     /* configures 4kx2k yuv layer*/
     virtual int configure4k2kYuv(hwc_context_t *ctx, hwc_layer_1_t *layer,
             PipeLayerPair& PipeLayerPair) = 0;
+    /* set/reset flags for MDPComp */
+    void setMDPCompLayerFlags(hwc_context_t *ctx,
+                              hwc_display_contents_1_t* list);
     void setRedraw(hwc_context_t *ctx,
             hwc_display_contents_1_t* list);
     /* checks for conditions where mdpcomp is not possible */
diff --git a/liboverlay/overlay.h b/liboverlay/overlay.h
index 17c75e8..455f547 100644
--- a/liboverlay/overlay.h
+++ b/liboverlay/overlay.h
@@ -140,8 +140,6 @@
     void clear(int dpy);
     /* Validate the set of pipes for a display and set them in driver */
     bool validateAndSet(const int& dpy, const int& fbFd);
-    /* Returns true if PipeBook has been configured, false otherwise */
-    bool isConfigured();
 
     /* Closes open pipes, called during startup */
     static int initOverlay();
@@ -206,7 +204,6 @@
         static void resetAllocation(int index);
         static bool isAllocated(int index);
         static bool isNotAllocated(int index);
-        static bool isConfigured();
 
         static utils::eMdpPipeType getPipeType(utils::eDest dest);
         static const char* getDestStr(utils::eDest dest);
@@ -409,14 +406,6 @@
     return "Invalid";
 }
 
-inline bool Overlay::PipeBook::isConfigured() {
-    return (sAllocatedBitmap != 0);
-}
-
-inline bool Overlay::isConfigured() {
-    return PipeBook::isConfigured();
-}
-
 }; // overlay
 
 #endif // OVERLAY_H
