diff --git a/libhwcomposer/hwc.cpp b/libhwcomposer/hwc.cpp
index 785e66e..ae7bb95 100644
--- a/libhwcomposer/hwc.cpp
+++ b/libhwcomposer/hwc.cpp
@@ -209,22 +209,24 @@
 }
 
 static int hwc_eventControl(struct hwc_composer_device_1* dev, int dpy,
-                             int event, int enabled)
+                             int event, int enable)
 {
     int ret = 0;
-
     hwc_context_t* ctx = (hwc_context_t*)(dev);
     private_module_t* m = reinterpret_cast<private_module_t*>(
                 ctx->mFbDev->common.module);
     pthread_mutex_lock(&ctx->vstate.lock);
     switch(event) {
         case HWC_EVENT_VSYNC:
-            if (ctx->vstate.enable == enabled)
+            if (ctx->vstate.enable == enable)
                 break;
-            ctx->vstate.enable = !!enabled;
-            pthread_cond_signal(&ctx->vstate.cond);
+            ret = hwc_vsync_control(ctx, dpy, enable);
+            if(ret == 0) {
+                ctx->vstate.enable = !!enable;
+                pthread_cond_signal(&ctx->vstate.cond);
+            }
             ALOGD_IF (VSYNC_DEBUG, "VSYNC state changed to %s",
-                      (enabled)?"ENABLED":"DISABLED");
+                      (enable)?"ENABLED":"DISABLED");
             break;
         default:
             ret = -EINVAL;
@@ -241,7 +243,8 @@
         ctx->mFbDev->common.module);
     Locker::Autolock _l(ctx->mBlankLock);
     int ret = 0;
-    ALOGD("%s: Doing Dpy=%d, blank=%d", __FUNCTION__, dpy, blank);
+    ALOGD("%s: %s display: %d", __FUNCTION__,
+          blank==1 ? "Blanking":"Unblanking", dpy);
     switch(dpy) {
         case HWC_DISPLAY_PRIMARY:
             if(blank) {
@@ -286,14 +289,16 @@
     // Enable HPD here, as during bootup unblank is called
     // when SF is completely initialized
     ctx->mExtDisplay->setHPD(1);
-
-    if(ret < 0) {
-        ALOGE("%s: failed. Dpy=%d, blank=%d : %s",
-                __FUNCTION__, dpy, blank, strerror(errno));
+    if(ret == 0){
+        ctx->dpyAttr[dpy].isActive = !blank;
+    } else {
+        ALOGE("%s: Failed in %s display: %d error:%s", __FUNCTION__,
+              blank==1 ? "blanking":"unblanking", dpy, strerror(errno));
         return ret;
     }
-    ALOGD("%s: Done Dpy=%d, blank=%d", __FUNCTION__, dpy, blank);
-    ctx->dpyAttr[dpy].isActive = !blank;
+
+    ALOGD("%s: Done %s display: %d", __FUNCTION__,
+          blank==1 ? "blanking":"unblanking", dpy);
     return 0;
 }
 
diff --git a/libhwcomposer/hwc_utils.cpp b/libhwcomposer/hwc_utils.cpp
index 5193644..e9446ad 100644
--- a/libhwcomposer/hwc_utils.cpp
+++ b/libhwcomposer/hwc_utils.cpp
@@ -98,6 +98,7 @@
     pthread_mutex_init(&(ctx->vstate.lock), NULL);
     pthread_cond_init(&(ctx->vstate.cond), NULL);
     ctx->vstate.enable = false;
+    ctx->vstate.fakevsync = false;
     ctx->mExtDispConfiguring = false;
 
     //Right now hwc starts the service but anybody could do it, or it could be
diff --git a/libhwcomposer/hwc_utils.h b/libhwcomposer/hwc_utils.h
index 187c43a..de62b05 100644
--- a/libhwcomposer/hwc_utils.h
+++ b/libhwcomposer/hwc_utils.h
@@ -140,6 +140,7 @@
 bool isSecureModePolicy(int mdpVersion);
 bool isExternalActive(hwc_context_t* ctx);
 bool needsScaling(hwc_layer_1_t const* layer);
+int hwc_vsync_control(hwc_context_t* ctx, int dpy, int enable);
 
 //Helper function to dump logs
 void dumpsys_log(android::String8& buf, const char* fmt, ...);
@@ -227,6 +228,7 @@
     pthread_mutex_t lock;
     pthread_cond_t  cond;
     bool enable;
+    bool fakevsync;
 };
 
 // -----------------------------------------------------------------------------
diff --git a/libhwcomposer/hwc_vsync.cpp b/libhwcomposer/hwc_vsync.cpp
index f83b6d7..559cd7d 100644
--- a/libhwcomposer/hwc_vsync.cpp
+++ b/libhwcomposer/hwc_vsync.cpp
@@ -18,9 +18,6 @@
  * limitations under the License.
  */
 
-// WARNING : Excessive logging, if VSYNC_DEBUG enabled
-#define VSYNC_DEBUG 0
-
 #include <cutils/properties.h>
 #include <utils/Log.h>
 #include <fcntl.h>
@@ -32,11 +29,23 @@
 #include "string.h"
 #include "external.h"
 
-using android::LogIfSlow;
 namespace qhwc {
 
 #define HWC_VSYNC_THREAD_NAME "hwcVsyncThread"
 
+int hwc_vsync_control(hwc_context_t* ctx, int dpy, int enable)
+{
+    int ret = 0;
+    if(!ctx->vstate.fakevsync &&
+       ioctl(ctx->dpyAttr[dpy].fd, MSMFB_OVERLAY_VSYNC_CTRL,
+             &enable) < 0) {
+        ALOGE("%s: vsync control failed. Dpy=%d, enable=%d : %s",
+              __FUNCTION__, dpy, enable, strerror(errno));
+        ret = -errno;
+    }
+    return ret;
+}
+
 static void *vsync_loop(void *param)
 {
     const char* vsync_timestamp_fb0 = "/sys/class/graphics/fb0/vsync_event";
@@ -59,14 +68,17 @@
     int fd_timestamp = -1;
     int ret = 0;
     bool fb1_vsync = false;
-    bool enabled = false;
-    bool fakevsync = false;
-    uint32_t log_threshold = ns2ms(ctx->dpyAttr[dpy].vsync_period)*2;
+    bool logvsync = false;
 
     char property[PROPERTY_VALUE_MAX];
     if(property_get("debug.hwc.fakevsync", property, NULL) > 0) {
         if(atoi(property) == 1)
-            fakevsync = true;
+            ctx->vstate.fakevsync = true;
+    }
+
+    if(property_get("debug.hwc.logvsync", property, 0) > 0) {
+        if(atoi(property) == 1)
+            logvsync = true;
     }
 
     /* Currently read vsync timestamp from drivers
@@ -77,42 +89,18 @@
         ALOGE ("FATAL:%s:not able to open file:%s, %s",  __FUNCTION__,
                (fb1_vsync) ? vsync_timestamp_fb1 : vsync_timestamp_fb0,
                strerror(errno));
-        fakevsync = true;
+        ctx->vstate.fakevsync = true;
     }
 
     do {
         pthread_mutex_lock(&ctx->vstate.lock);
         while (ctx->vstate.enable == false) {
-            if(enabled) {
-                int e = 0;
-                if(!fakevsync &&
-                   ioctl(ctx->dpyAttr[dpy].fd, MSMFB_OVERLAY_VSYNC_CTRL,
-                         &e) < 0) {
-                    ALOGE("%s: vsync control failed. Dpy=%d, enabled=%d : %s",
-                          __FUNCTION__, dpy, enabled, strerror(errno));
-                    ret = -errno;
-                }
-                enabled = false;
-            }
             pthread_cond_wait(&ctx->vstate.cond, &ctx->vstate.lock);
         }
         pthread_mutex_unlock(&ctx->vstate.lock);
 
-        if (!enabled) {
-            int e = 1;
-            if(!fakevsync &&
-               ioctl(ctx->dpyAttr[dpy].fd, MSMFB_OVERLAY_VSYNC_CTRL,
-                     &e) < 0) {
-                ALOGE("%s: vsync control failed. Dpy=%d, enabled=%d : %s",
-                      __FUNCTION__, dpy, enabled, strerror(errno));
-                ret = -errno;
-            }
-            enabled = true;
-        }
-
-        if(!fakevsync) {
+        if (!ctx->vstate.fakevsync) {
             for(int i = 0; i < MAX_RETRY_COUNT; i++) {
-                ALOGD_IF_SLOW(log_threshold, "Excessive delay reading vsync");
                 len = pread(fd_timestamp, vdata, MAX_DATA, 0);
                 if(len < 0 && (errno == EAGAIN ||
                                errno == EINTR  ||
@@ -129,7 +117,7 @@
                 ALOGE ("FATAL:%s:not able to read file:%s, %s", __FUNCTION__,
                        vsync_timestamp_fb0, strerror(errno));
                 close (fd_timestamp);
-                fakevsync = true;
+                ctx->vstate.fakevsync = true;
             }
 
             // extract timestamp
@@ -140,7 +128,7 @@
                 ALOGE ("FATAL: %s: vsync timestamp not in correct format: [%s]",
                        __FUNCTION__,
                        str);
-                fakevsync = true;
+                ctx->vstate.fakevsync = true;
             }
 
         } else {
@@ -148,7 +136,7 @@
             cur_timestamp = systemTime();
         }
         // send timestamp to HAL
-        ALOGD_IF (VSYNC_DEBUG, "%s: timestamp %llu sent to HWC for %s",
+        ALOGD_IF (logvsync, "%s: timestamp %llu sent to HWC for %s",
                   __FUNCTION__, cur_timestamp, "fb0");
         ctx->proc->vsync(ctx->proc, dpy, cur_timestamp);
 
