diff --git a/services/surfaceflinger/DisplayHardware/HWComposer.cpp b/services/surfaceflinger/DisplayHardware/HWComposer.cpp
index 4e13377..6ae03c9 100644
--- a/services/surfaceflinger/DisplayHardware/HWComposer.cpp
+++ b/services/surfaceflinger/DisplayHardware/HWComposer.cpp
@@ -32,6 +32,7 @@
 #include <hardware/hwcomposer.h>
 
 #include <cutils/log.h>
+#include <cutils/properties.h>
 
 #include <EGL/egl.h>
 
@@ -51,8 +52,13 @@
       mNumOVLayers(0), mNumFBLayers(0),
       mDpy(EGL_NO_DISPLAY), mSur(EGL_NO_SURFACE),
       mEventHandler(handler),
-      mRefreshPeriod(refreshPeriod), mVSyncCount(0)
+      mRefreshPeriod(refreshPeriod),
+      mVSyncCount(0), mDebugForceFakeVSync(false)
 {
+    char value[PROPERTY_VALUE_MAX];
+    property_get("debug.sf.no_hw_vsync", value, "0");
+    mDebugForceFakeVSync = atoi(value);
+
     bool needVSyncThread = false;
     int err = hw_get_module(HWC_HARDWARE_MODULE_ID, &mModule);
     ALOGW_IF(err, "%s module not found", HWC_HARDWARE_MODULE_ID);
@@ -68,7 +74,12 @@
                 mHwc->registerProcs(mHwc, &mCBContext.procs);
                 memset(mCBContext.procs.zero, 0, sizeof(mCBContext.procs.zero));
             }
-            if (mHwc->common.version < HWC_DEVICE_API_VERSION_0_3) {
+            if (mHwc->common.version >= HWC_DEVICE_API_VERSION_0_3) {
+                if (mDebugForceFakeVSync) {
+                    // make sure to turn h/w vsync off in "fake vsync" mode
+                    mHwc->methods->eventControl(mHwc, HWC_EVENT_VSYNC, 0);
+                }
+            } else {
                 needVSyncThread = true;
             }
         }
@@ -83,6 +94,7 @@
 }
 
 HWComposer::~HWComposer() {
+    eventControl(EVENT_VSYNC, 0);
     free(mList);
     if (mVSyncThread != NULL) {
         mVSyncThread->requestExitAndWait();
@@ -116,7 +128,9 @@
 status_t HWComposer::eventControl(int event, int enabled) {
     status_t err = NO_ERROR;
     if (mHwc && mHwc->common.version >= HWC_DEVICE_API_VERSION_0_3) {
-        err = mHwc->methods->eventControl(mHwc, event, enabled);
+        if (!mDebugForceFakeVSync) {
+            err = mHwc->methods->eventControl(mHwc, event, enabled);
+        }
     }
 
     if (err == NO_ERROR && mVSyncThread != NULL) {
@@ -219,10 +233,10 @@
         const Vector< sp<LayerBase> >& visibleLayersSortedByZ) const {
     if (mHwc && mList) {
         result.append("Hardware Composer state:\n");
-
-        snprintf(buffer, SIZE, "  numHwLayers=%u, flags=%08x\n",
+        result.appendFormat("  mDebugForceFakeVSync=%d\n",
+                mDebugForceFakeVSync);
+        result.appendFormat("  numHwLayers=%u, flags=%08x\n",
                 mList->numHwLayers, mList->flags);
-        result.append(buffer);
         result.append(
                 "   type   |  handle  |   hints  |   flags  | tr | blend |  format  |       source crop         |           frame           name \n"
                 "----------+----------+----------+----------+----+-------+----------+---------------------------+--------------------------------\n");
@@ -237,17 +251,16 @@
                     format = buffer->getPixelFormat();
                 }
             }
-            snprintf(buffer, SIZE,
+            result.appendFormat(
                     " %8s | %08x | %08x | %08x | %02x | %05x | %08x | [%5d,%5d,%5d,%5d] | [%5d,%5d,%5d,%5d] %s\n",
                     l.compositionType ? "OVERLAY" : "FB",
                     intptr_t(l.handle), l.hints, l.flags, l.transform, l.blending, format,
                     l.sourceCrop.left, l.sourceCrop.top, l.sourceCrop.right, l.sourceCrop.bottom,
                     l.displayFrame.left, l.displayFrame.top, l.displayFrame.right, l.displayFrame.bottom,
                     layer->getName().string());
-            result.append(buffer);
         }
     }
-    if (mHwc && mHwc->common.version >= 1 && mHwc->dump) {
+    if (mHwc && mHwc->common.version >= HWC_DEVICE_API_VERSION_0_1 && mHwc->dump) {
         mHwc->dump(mHwc, buffer, SIZE);
         result.append(buffer);
     }
diff --git a/services/surfaceflinger/DisplayHardware/HWComposer.h b/services/surfaceflinger/DisplayHardware/HWComposer.h
index 7814594..76aadf8 100644
--- a/services/surfaceflinger/DisplayHardware/HWComposer.h
+++ b/services/surfaceflinger/DisplayHardware/HWComposer.h
@@ -144,6 +144,7 @@
     nsecs_t                 mRefreshPeriod;
     size_t                  mVSyncCount;
     sp<VSyncThread>         mVSyncThread;
+    bool                    mDebugForceFakeVSync;
 };
 
 
diff --git a/services/surfaceflinger/EventThread.cpp b/services/surfaceflinger/EventThread.cpp
index cc44186..5813eef 100644
--- a/services/surfaceflinger/EventThread.cpp
+++ b/services/surfaceflinger/EventThread.cpp
@@ -41,7 +41,8 @@
       mHw(flinger->graphicPlane(0).editDisplayHardware()),
       mLastVSyncTimestamp(0),
       mVSyncTimestamp(0),
-      mDeliveredEvents(0)
+      mDeliveredEvents(0),
+      mDebugVsyncEnabled(false)
 {
 }
 
@@ -144,8 +145,7 @@
                 if (!waitForNextVsync) {
                     // we received a VSYNC but we have no clients
                     // don't report it, and disable VSYNC events
-                    mHw.getHwComposer().eventControl(
-                            HWComposer::EVENT_VSYNC, false);
+                    disableVSync();
                 } else {
                     // report VSYNC event
                     break;
@@ -157,8 +157,7 @@
                 // disable VSYNC events then.
                 if (waitForNextVsync) {
                     // enable
-                    mHw.getHwComposer().eventControl(
-                            HWComposer::EVENT_VSYNC, true);
+                    enableVSync();
                 }
             }
 
@@ -234,6 +233,16 @@
     return true;
 }
 
+void EventThread::enableVSync() {
+    mHw.getHwComposer().eventControl(HWComposer::EVENT_VSYNC, true);
+    mDebugVsyncEnabled = true;
+}
+
+void EventThread::disableVSync() {
+    mHw.getHwComposer().eventControl(HWComposer::EVENT_VSYNC, false);
+    mDebugVsyncEnabled = false;
+}
+
 status_t EventThread::readyToRun() {
     ALOGI("EventThread ready to run.");
     return NO_ERROR;
@@ -241,10 +250,16 @@
 
 void EventThread::dump(String8& result, char* buffer, size_t SIZE) const {
     Mutex::Autolock _l(mLock);
-    result.append("VSYNC state:\n");
-    snprintf(buffer, SIZE, "  numListeners=%u, events-delivered: %u\n",
+    result.appendFormat("VSYNC state: %s\n",
+            mDebugVsyncEnabled?"enabled":"disabled");
+    result.appendFormat("  numListeners=%u,\n  events-delivered: %u\n",
             mDisplayEventConnections.size(), mDeliveredEvents);
-    result.append(buffer);
+    for (size_t i=0 ; i<mDisplayEventConnections.size() ; i++) {
+        sp<Connection> connection =
+                mDisplayEventConnections.itemAt(i).promote();
+        result.appendFormat("    %p: count=%d\n",
+                connection.get(), connection!=NULL ? connection->count : 0);
+    }
 }
 
 // ---------------------------------------------------------------------------
diff --git a/services/surfaceflinger/EventThread.h b/services/surfaceflinger/EventThread.h
index 3f9d452..2e237dd 100644
--- a/services/surfaceflinger/EventThread.h
+++ b/services/surfaceflinger/EventThread.h
@@ -81,9 +81,11 @@
     virtual bool        threadLoop();
     virtual status_t    readyToRun();
     virtual void        onFirstRef();
-    virtual void onVSyncReceived(int, nsecs_t timestamp);
+    virtual void        onVSyncReceived(int, nsecs_t timestamp);
 
     void removeDisplayEventConnection(const wp<Connection>& connection);
+    void enableVSync();
+    void disableVSync();
 
     // constants
     sp<SurfaceFlinger> mFlinger;
@@ -99,6 +101,9 @@
 
     // main thread only
     size_t mDeliveredEvents;
+
+    // for debugging
+    bool mDebugVsyncEnabled;
 };
 
 // ---------------------------------------------------------------------------
