diff --git a/liboverlay/overlay.cpp b/liboverlay/overlay.cpp
index 3fdb7c4..37e99df 100644
--- a/liboverlay/overlay.cpp
+++ b/liboverlay/overlay.cpp
@@ -190,8 +190,12 @@
 Overlay *Overlay::sInstance = 0;
 
 Overlay* Overlay::getInstance() {
-    if(sInstance == NULL)
+    if(sInstance == NULL) {
+        if(utils::initOverlay() == -1) {
+            ALOGE("utils::initOverlay() ERROR!!");
+        }
         sInstance = new Overlay();
+    }
     return sInstance;
 }
 
diff --git a/liboverlay/overlayUtils.cpp b/liboverlay/overlayUtils.cpp
index 4956f90..1c9c72b 100644
--- a/liboverlay/overlayUtils.cpp
+++ b/liboverlay/overlayUtils.cpp
@@ -84,6 +84,10 @@
 
 
 namespace utils {
+//------------------ defines -----------------------------
+#define FB_DEVICE_TEMPLATE "/dev/graphics/fb%u"
+#define NUM_FB_DEVICES 3
+
 //--------------------------------------------------------
 FrameBufferInfo::FrameBufferInfo() {
     mFBWidth = 0;
@@ -154,6 +158,50 @@
     return (trueMirroringSupported && mBorderFillSupported);
 }
 
+/* clears any VG pipes allocated to the fb devices */
+int initOverlay() {
+    msmfb_mixer_info_req  req;
+    mdp_mixer_info *minfo = NULL;
+    char name[64];
+    int fd = -1;
+    for(int i = 0; i < NUM_FB_DEVICES; i++) {
+        snprintf(name, 64, FB_DEVICE_TEMPLATE, i);
+        ALOGD("initoverlay:: opening the device:: %s", name);
+        fd = ::open(name, O_RDWR, 0);
+        if(fd < 0) {
+            ALOGE("cannot open framebuffer(%d)", i);
+            return -1;
+        }
+        //Get the mixer configuration */
+        req.mixer_num = i;
+        if (ioctl(fd, MSMFB_MIXER_INFO, &req) == -1) {
+            ALOGE("ERROR: MSMFB_MIXER_INFO ioctl failed");
+            close(fd);
+            return -1;
+        }
+        minfo = req.info;
+        for (int j = 0; j < req.cnt; j++) {
+            ALOGD("ndx=%d num=%d z_order=%d", minfo->pndx, minfo->pnum,
+                    minfo->z_order);
+            // except the RGB base layer with z_order of -1, clear any
+            // other pipes connected to mixer.
+            if((minfo->z_order) != -1) {
+                int index = minfo->pndx;
+                ALOGD("Unset overlay with index: %d at mixer %d", index, i);
+                if(ioctl(fd, MSMFB_OVERLAY_UNSET, &index) == -1) {
+                    ALOGE("ERROR: MSMFB_OVERLAY_UNSET failed");
+                    close(fd);
+                    return -1;
+                }
+            }
+            minfo++;
+        }
+        close(fd);
+        fd = -1;
+    }
+    return 0;
+}
+
 //--------------------------------------------------------
 //Refer to graphics.h, gralloc_priv.h, msm_mdp.h
 int getMdpFormat(int format) {
diff --git a/liboverlay/overlayUtils.h b/liboverlay/overlayUtils.h
index fdaa22a..e5f7119 100644
--- a/liboverlay/overlayUtils.h
+++ b/liboverlay/overlayUtils.h
@@ -145,6 +145,11 @@
 enum { BARRIER_LAND = 1,
     BARRIER_PORT = 2 };
 
+/* if SurfaceFlinger process gets killed in bypass mode, In initOverlay()
+ * close all the pipes if it is opened after reboot.
+ */
+int initOverlay(void);
+
 inline uint32_t format3D(uint32_t x) { return x & 0xFF000; }
 inline uint32_t colorFormat(uint32_t fmt) {
     /*TODO enable this block only if format has interlace / 3D info in top bits.
