diff --git a/libhwcomposer/hwc_qclient.cpp b/libhwcomposer/hwc_qclient.cpp
index efe6e16..7e22fd0 100644
--- a/libhwcomposer/hwc_qclient.cpp
+++ b/libhwcomposer/hwc_qclient.cpp
@@ -33,12 +33,14 @@
 #include <mdp_version.h>
 #include <hwc_mdpcomp.h>
 #include <hwc_virtual.h>
+#include <overlay.h>
 
 #define QCLIENT_DEBUG 0
 
 using namespace android;
 using namespace qService;
 using namespace qhwc;
+using namespace overlay;
 
 namespace qClient {
 
@@ -236,6 +238,10 @@
             HWCVirtualBase::dynamicDebug(enable);
             if (debug_type != IQService::DEBUG_ALL)
                 break;
+        case IQService::DEBUG_PIPE_LIFECYCLE:
+            Overlay::debugPipeLifecycle(enable);
+            if (debug_type != IQService::DEBUG_ALL)
+                break;
     }
 }
 
diff --git a/liboverlay/mdpWrapper.h b/liboverlay/mdpWrapper.h
index 9c38cdb..36faf07 100644
--- a/liboverlay/mdpWrapper.h
+++ b/liboverlay/mdpWrapper.h
@@ -44,8 +44,11 @@
 #include <utils/Trace.h>
 #include <errno.h>
 #include "overlayUtils.h"
+#include "overlay.h"
 
 #define IOCTL_DEBUG 0
+#define LIKELY( exp )       (__builtin_expect( (exp) != 0, true  ))
+#define UNLIKELY( exp )     (__builtin_expect( (exp) != 0, false ))
 
 namespace overlay{
 
@@ -180,11 +183,33 @@
 
 inline bool validateAndSet(const int& fd, mdp_overlay_list& list) {
     ATRACE_CALL();
+    uint32_t id = 0;
+    if(UNLIKELY(Overlay::isDebugPipeLifecycle())) {
+        for(uint32_t i = 0; i < list.num_overlays; i++) {
+            if(list.overlay_list[i]->id != (uint32_t)MSMFB_NEW_REQUEST) {
+                id |= list.overlay_list[i]->id;
+            }
+        }
+
+        ALOGD("%s Total pipes needed: %d, Exisiting pipe mask 0x%04x",
+                __FUNCTION__, list.num_overlays, id);
+        id = 0;
+    }
+
     if (ioctl(fd, MSMFB_OVERLAY_PREPARE, &list) < 0) {
         ALOGD_IF(IOCTL_DEBUG, "Failed to call ioctl MSMFB_OVERLAY_PREPARE "
                 "err=%s", strerror(errno));
         return false;
     }
+
+    if(UNLIKELY(Overlay::isDebugPipeLifecycle())) {
+        for(uint32_t i = 0; i < list.num_overlays; i++) {
+            id |= list.overlay_list[i]->id;
+        }
+
+        ALOGD("%s Pipe mask after OVERLAY_PREPARE 0x%04x", __FUNCTION__, id);
+    }
+
     return true;
 }
 
@@ -200,6 +225,9 @@
 
 inline bool unsetOverlay(int fd, int ovId) {
     ATRACE_CALL();
+    ALOGD_IF(Overlay::isDebugPipeLifecycle(), "%s Unsetting pipe 0x%04x",
+            __FUNCTION__, ovId);
+
     if (ioctl(fd, MSMFB_OVERLAY_UNSET, &ovId) < 0) {
         ALOGE("Failed to call ioctl MSMFB_OVERLAY_UNSET err=%s",
                 strerror(errno));
@@ -230,6 +258,8 @@
 
 inline bool displayCommit(int fd, mdp_display_commit& info) {
     ATRACE_CALL();
+    ALOGD_IF(Overlay::isDebugPipeLifecycle(), "%s", __FUNCTION__);
+
     if(ioctl(fd, MSMFB_DISPLAY_COMMIT, &info) == -1) {
         ALOGE("Failed to call ioctl MSMFB_DISPLAY_COMMIT err=%s",
                 strerror(errno));
diff --git a/liboverlay/overlay.cpp b/liboverlay/overlay.cpp
index 26c8845..cad4c7d 100644
--- a/liboverlay/overlay.cpp
+++ b/liboverlay/overlay.cpp
@@ -33,8 +33,6 @@
 #include "mdp_version.h"
 #include "qdMetaData.h"
 
-#define PIPE_DEBUG 0
-
 namespace overlay {
 using namespace utils;
 using namespace qdutils;
@@ -46,7 +44,6 @@
         mPipeBook[i].init();
     }
 
-    mDumpStr[0] = '\0';
     initScalar();
     setDMAMultiplexingSupported();
 }
@@ -64,7 +61,6 @@
         PipeBook::resetUse(i);
         PipeBook::resetAllocation(i);
     }
-    mDumpStr[0] = '\0';
 }
 
 void Overlay::configDone() {
@@ -73,19 +69,9 @@
                     isSessionEnded((eDest)i)) {
             //Forces UNSET on pipes, flushes rotator memory and session, closes
             //fds
-            if(mPipeBook[i].valid()) {
-                char str[32];
-                snprintf(str, 32, "Unset=%s dpy=%d mix=%d; ",
-                        PipeBook::getDestStr((eDest)i),
-                        mPipeBook[i].mDisplay, mPipeBook[i].mMixer);
-#if PIPE_DEBUG
-                strlcat(mDumpStr, str, sizeof(mDumpStr));
-#endif
-            }
             mPipeBook[i].destroy();
         }
     }
-    dump();
     PipeBook::save();
 }
 
@@ -138,16 +124,7 @@
         if(not mPipeBook[index].valid()) {
             mPipeBook[index].mPipe = new GenericPipe(dpy);
             mPipeBook[index].mSession = PipeBook::NONE;
-            char str[32];
-            snprintf(str, 32, "Set=%s dpy=%d mix=%d; ",
-                     PipeBook::getDestStr(dest), dpy, mixer);
-#if PIPE_DEBUG
-            strlcat(mDumpStr, str, sizeof(mDumpStr));
-#endif
         }
-    } else {
-        ALOGD_IF(PIPE_DEBUG, "Pipe unavailable type=%d display=%d mixer=%d",
-                (int)type, dpy, mixer);
     }
 
     return dest;
@@ -507,14 +484,6 @@
     return true;
 }
 
-void Overlay::dump() const {
-#if PIPE_DEBUG
-    if(strlen(mDumpStr)) { //dump only on state change
-        ALOGD("%s\n", mDumpStr);
-    }
-#endif
-}
-
 void Overlay::getDump(char *buf, size_t len) {
     int totalPipes = 0;
     const char *str = "\nOverlay State\n\n";
@@ -596,6 +565,7 @@
 int Overlay::sDpyFbMap[DPY_MAX] = {0, -1, -1};
 int Overlay::sDMAMode = DMA_LINE_MODE;
 bool Overlay::sDMAMultiplexingSupported = false;
+bool Overlay::sDebugPipeLifecycle = false;
 int Overlay::PipeBook::NUM_PIPES = 0;
 int Overlay::PipeBook::sPipeUsageBitmap = 0;
 int Overlay::PipeBook::sLastUsageBitmap = 0;
diff --git a/liboverlay/overlay.h b/liboverlay/overlay.h
index 4f5d56d..e8369ca 100644
--- a/liboverlay/overlay.h
+++ b/liboverlay/overlay.h
@@ -152,6 +152,10 @@
      * Single interface panels will only update left ROI. */
     static bool displayCommit(const int& fd, const utils::Dim& lRoi,
                               const utils::Dim& rRoi);
+    /* Logs pipe lifecycle events like set, unset, commit when enabled */
+    static void debugPipeLifecycle(const bool& enable);
+    /* Returns true if pipe life cycle logging is enabled */
+    static bool isDebugPipeLifecycle();
 
 private:
     /* Ctor setup */
@@ -159,7 +163,6 @@
     /*Validate index range, abort if invalid */
     void validate(int index);
     static void setDMAMultiplexingSupported();
-    void dump() const;
     /* Returns an available pipe based on the type of pipe requested. When ANY
      * is requested, the first available VG or RGB is returned. If no pipe is
      * available for the display "dpy" then INV is returned. Note: If a pipe is
@@ -239,9 +242,6 @@
 
     PipeBook mPipeBook[utils::OV_INVALID]; //Used as max
 
-    /* Dump string */
-    char mDumpStr[1024];
-
     /* Singleton Instance*/
     static Overlay *sInstance;
     static int sDpyFbMap[DPY_MAX];
@@ -249,6 +249,7 @@
     static bool sDMAMultiplexingSupported;
     static void *sLibScaleHandle;
     static int (*sFnProgramScale)(struct mdp_overlay_list *);
+    static bool sDebugPipeLifecycle;
 
     friend class MdpCtrl;
 };
@@ -342,6 +343,14 @@
     return sFnProgramScale;
 }
 
+inline void Overlay::debugPipeLifecycle(const bool& enable) {
+    sDebugPipeLifecycle = enable;
+}
+
+inline bool Overlay::isDebugPipeLifecycle() {
+    return sDebugPipeLifecycle;
+}
+
 inline bool Overlay::PipeBook::valid() {
     return (mPipe != NULL);
 }
diff --git a/libqservice/IQService.h b/libqservice/IQService.h
index 9be04b2..30c064e 100644
--- a/libqservice/IQService.h
+++ b/libqservice/IQService.h
@@ -65,7 +65,8 @@
         DEBUG_ALL,
         DEBUG_MDPCOMP,
         DEBUG_VSYNC,
-        DEBUG_VD
+        DEBUG_VD,
+        DEBUG_PIPE_LIFECYCLE,
     };
 
     // Register a client that can be notified
