diff --git a/common.mk b/common.mk
index 5ae6df9..360032b 100644
--- a/common.mk
+++ b/common.mk
@@ -1,6 +1,5 @@
 #Common headers
 common_includes := hardware/qcom/display/libgralloc
-common_includes += hardware/qcom/display/libgenlock
 common_includes += hardware/qcom/display/liboverlay
 common_includes += hardware/qcom/display/libcopybit
 common_includes += hardware/qcom/display/libqdutils
diff --git a/libgenlock/genlock.cpp b/libgenlock/genlock.cpp
index 6f4ec6c..c606ecc 100644
--- a/libgenlock/genlock.cpp
+++ b/libgenlock/genlock.cpp
@@ -43,6 +43,7 @@
     int get_kernel_lock_type(genlock_lock_type lockType)
     {
         int kLockType = 0;
+#ifdef USE_GENLOCK
         // If the user sets both a read and write lock, higher preference is
         // given to the write lock.
         if (lockType & GENLOCK_WRITE_LOCK) {
@@ -54,6 +55,7 @@
                   __FUNCTION__, lockType);
             return -1;
         }
+#endif
         return kLockType;
     }
 
@@ -62,6 +64,7 @@
                                                    int lockType, int timeout,
                                                    int flags)
     {
+#ifdef USE_GENLOCK
         if (private_handle_t::validate(buffer_handle)) {
             ALOGE("%s: handle is invalid", __FUNCTION__);
             return GENLOCK_FAILURE;
@@ -104,6 +107,7 @@
             }
 #endif
         }
+#endif
         return GENLOCK_NO_ERROR;
     }
 
@@ -120,7 +124,6 @@
             handle = -1;
         }
     }
-
 }
 /*
  * Create a genlock lock. The genlock lock file descriptor and the lock
@@ -132,13 +135,13 @@
 genlock_status_t genlock_create_lock(native_handle_t *buffer_handle)
 {
     genlock_status_t ret = GENLOCK_NO_ERROR;
+#ifdef USE_GENLOCK
     if (private_handle_t::validate(buffer_handle)) {
         ALOGE("%s: handle is invalid", __FUNCTION__);
         return GENLOCK_FAILURE;
     }
 
     private_handle_t *hnd = reinterpret_cast<private_handle_t*>(buffer_handle);
-#ifdef USE_GENLOCK
     if ((hnd->flags & private_handle_t::PRIV_FLAGS_UNSYNCHRONIZED) == 0) {
         // Open the genlock device
         int fd = open(GENLOCK_DEVICE, O_RDWR);
@@ -173,8 +176,6 @@
     } else {
         hnd->genlockHandle = 0;
     }
-#else
-    hnd->genlockHandle = 0;
 #endif
     return ret;
 }
diff --git a/libgralloc/Android.mk b/libgralloc/Android.mk
index 749a672..fb2b0df 100644
--- a/libgralloc/Android.mk
+++ b/libgralloc/Android.mk
@@ -21,7 +21,7 @@
 LOCAL_MODULE_PATH             := $(TARGET_OUT_SHARED_LIBRARIES)/hw
 LOCAL_MODULE_TAGS             := optional
 LOCAL_C_INCLUDES              := $(common_includes) $(kernel_includes)
-LOCAL_SHARED_LIBRARIES        := $(common_libs) libmemalloc libgenlock
+LOCAL_SHARED_LIBRARIES        := $(common_libs) libmemalloc
 LOCAL_SHARED_LIBRARIES        += libqdutils libGLESv1_CM
 LOCAL_CFLAGS                  := $(common_flags) -DLOG_TAG=\"qdgralloc\"
 LOCAL_ADDITIONAL_DEPENDENCIES := $(common_deps) $(kernel_deps)
@@ -35,7 +35,7 @@
 LOCAL_MODULE                  := libmemalloc
 LOCAL_MODULE_TAGS             := optional
 LOCAL_C_INCLUDES              := $(common_includes) $(kernel_includes)
-LOCAL_SHARED_LIBRARIES        := $(common_libs) libgenlock libqdutils libdl
+LOCAL_SHARED_LIBRARIES        := $(common_libs) libqdutils libdl
 LOCAL_CFLAGS                  := $(common_flags) -DLOG_TAG=\"qdmemalloc\"
 LOCAL_ADDITIONAL_DEPENDENCIES := $(common_deps) $(kernel_deps)
 LOCAL_SRC_FILES               :=  ionalloc.cpp alloc_controller.cpp
diff --git a/libgralloc/framebuffer.cpp b/libgralloc/framebuffer.cpp
index ab36830..cc16a5f 100644
--- a/libgralloc/framebuffer.cpp
+++ b/libgralloc/framebuffer.cpp
@@ -39,7 +39,6 @@
 #include "gralloc_priv.h"
 #include "fb_priv.h"
 #include "gr.h"
-#include <genlock.h>
 #include <cutils/properties.h>
 #include <profiler.h>
 
diff --git a/libgralloc/gpu.cpp b/libgralloc/gpu.cpp
index f1af045..292012b 100644
--- a/libgralloc/gpu.cpp
+++ b/libgralloc/gpu.cpp
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 The Android Open Source Project
- * Copyright (c) 2011-2012 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011-2013 The Linux Foundation. All rights reserved.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,8 +21,6 @@
 #include <cutils/properties.h>
 #include <sys/mman.h>
 
-#include <genlock.h>
-
 #include "gr.h"
 #include "gpu.h"
 #include "memalloc.h"
@@ -165,10 +163,6 @@
         ALOGE_IF(eDataErr, "gralloc failed for eDataErr=%s",
                                           strerror(-eDataErr));
 
-        if (usage & GRALLOC_USAGE_PRIVATE_UNSYNCHRONIZED) {
-            flags |= private_handle_t::PRIV_FLAGS_UNSYNCHRONIZED;
-        }
-
         if (usage & GRALLOC_USAGE_PRIVATE_EXTERNAL_ONLY) {
             flags |= private_handle_t::PRIV_FLAGS_EXTERNAL_ONLY;
             //The EXTERNAL_BLOCK flag is always an add-on
@@ -200,6 +194,8 @@
 
         hnd->offset = data.offset;
         hnd->base = int(data.base) + data.offset;
+        hnd->gpuaddr = 0;
+
         *pHandle = hnd;
     }
 
@@ -265,13 +261,6 @@
         return err;
     }
 
-    // Create a genlock lock for this buffer handle.
-    err = genlock_create_lock((native_handle_t*)(*pHandle));
-    if (err) {
-        ALOGE("%s: genlock_create_lock failed", __FUNCTION__);
-        free_impl(reinterpret_cast<private_handle_t*>(pHandle));
-        return err;
-    }
     *pStride = alignedw;
     return 0;
 }
@@ -299,12 +288,6 @@
             return err;
     }
 
-    // Release the genlock
-    int err = genlock_release_lock((native_handle_t*)hnd);
-    if (err) {
-        ALOGE("%s: genlock_release_lock failed", __FUNCTION__);
-    }
-
     delete hnd;
     return 0;
 }
diff --git a/libgralloc/gralloc_priv.h b/libgralloc/gralloc_priv.h
index d2f3073..719a941 100644
--- a/libgralloc/gralloc_priv.h
+++ b/libgralloc/gralloc_priv.h
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2008 The Android Open Source Project
- * Copyright (c) 2011-2012, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011-2013, The Linux Foundation. All rights reserved.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -54,14 +54,6 @@
      * cannot be used with noncontiguous heaps */
     GRALLOC_USAGE_PRIVATE_UNCACHED        =       0x02000000,
 
-    /* This flag can be set to disable genlock synchronization
-     * for the gralloc buffer. If this flag is set the caller
-     * is required to perform explicit synchronization.
-     * WARNING - flag is outside the standard PRIVATE region
-     * and may need to be moved if the gralloc API changes
-     */
-    GRALLOC_USAGE_PRIVATE_UNSYNCHRONIZED  =       0X04000000,
-
     /* Buffer content should be displayed on an external display only */
     GRALLOC_USAGE_PRIVATE_EXTERNAL_ONLY   =       0x08000000,
 
@@ -169,8 +161,6 @@
 
         // file-descriptors
         int     fd;
-        // genlock handle to be dup'd by the binder
-        int     genlockHandle;
         int     fd_metadata;          // fd for the meta-data
         // ints
         int     magic;
@@ -181,28 +171,24 @@
         int     base;
         int     offset_metadata;
         // The gpu address mapped into the mmu.
-        // If using ashmem, set to 0, they don't care
         int     gpuaddr;
-        int     pid;   // deprecated
         int     format;
         int     width;
         int     height;
-        // local fd of the genlock device.
-        int     genlockPrivFd;
         int     base_metadata;
 
 #ifdef __cplusplus
-        static const int sNumInts = 14;
-        static const int sNumFds = 3;
+        static const int sNumInts = 12;
+        static const int sNumFds = 2;
         static const int sMagic = 'gmsm';
 
         private_handle_t(int fd, int size, int flags, int bufferType,
                          int format,int width, int height, int eFd = -1,
                          int eOffset = 0, int eBase = 0) :
-            fd(fd), genlockHandle(-1), fd_metadata(eFd), magic(sMagic),
+            fd(fd), fd_metadata(eFd), magic(sMagic),
             flags(flags), size(size), offset(0), bufferType(bufferType),
-            base(0), offset_metadata(eOffset), gpuaddr(0), pid(getpid()),
-            format(format), width(width), height(height), genlockPrivFd(-1),
+            base(0), offset_metadata(eOffset), gpuaddr(0),
+            format(format), width(width), height(height),
             base_metadata(eBase)
         {
             version = sizeof(native_handle);
diff --git a/libgralloc/mapper.cpp b/libgralloc/mapper.cpp
index 27761be..268630b 100644
--- a/libgralloc/mapper.cpp
+++ b/libgralloc/mapper.cpp
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2008 The Android Open Source Project
- * Copyright (c) 2011-2012, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011-2013, The Linux Foundation. All rights reserved.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -34,8 +34,6 @@
 
 #include <hardware/hardware.h>
 #include <hardware/gralloc.h>
-#include <genlock.h>
-
 #include <linux/android_pmem.h>
 
 #include "gralloc_priv.h"
@@ -155,24 +153,6 @@
         return err;
     }
 
-    // Reset the genlock private fd flag in the handle
-    hnd->genlockPrivFd = -1;
-
-    // Check if there is a valid lock attached to the handle.
-    if (-1 == hnd->genlockHandle) {
-        ALOGE("%s: the lock is invalid.", __FUNCTION__);
-        gralloc_unmap(module, handle);
-        hnd->base = 0;
-        return -EINVAL;
-    }
-
-    // Attach the genlock handle
-    if (GENLOCK_NO_ERROR != genlock_attach_lock((native_handle_t *)handle)) {
-        ALOGE("%s: genlock_attach_lock failed", __FUNCTION__);
-        gralloc_unmap(module, handle);
-        hnd->base = 0;
-        return -EINVAL;
-    }
     return 0;
 }
 
@@ -195,13 +175,6 @@
     }
     hnd->base = 0;
     hnd->base_metadata = 0;
-    // Release the genlock
-    if (-1 != hnd->genlockHandle) {
-        return genlock_release_lock((native_handle_t *)handle);
-    } else {
-        ALOGE("%s: there was no genlock attached to this buffer", __FUNCTION__);
-        return -EINVAL;
-    }
     return 0;
 }
 
@@ -250,27 +223,6 @@
         }
         *vaddr = (void*)hnd->base;
 
-        // Lock the buffer for read/write operation as specified. Write lock
-        // has a higher priority over read lock.
-        int lockType = 0;
-        if (usage & GRALLOC_USAGE_SW_WRITE_MASK) {
-            lockType = GENLOCK_WRITE_LOCK;
-        } else if (usage & GRALLOC_USAGE_SW_READ_MASK) {
-            lockType = GENLOCK_READ_LOCK;
-        }
-
-        int timeout = GENLOCK_MAX_TIMEOUT;
-        if (GENLOCK_NO_ERROR != genlock_lock_buffer((native_handle_t *)handle,
-                                                    (genlock_lock_type)lockType,
-                                                    timeout)) {
-            ALOGE("%s: genlock_lock_buffer (lockType=0x%x) failed", __FUNCTION__,
-                  lockType);
-            return -EINVAL;
-        } else {
-            // Mark this buffer as locked for SW read/write operation.
-            hnd->flags |= private_handle_t::PRIV_FLAGS_SW_LOCK;
-        }
-
         if ((usage & GRALLOC_USAGE_SW_WRITE_MASK) &&
             !(hnd->flags & private_handle_t::PRIV_FLAGS_FRAMEBUFFER)) {
             // Mark the buffer to be flushed after cpu read/write
@@ -304,14 +256,6 @@
         hnd->flags &= ~private_handle_t::PRIV_FLAGS_NEEDS_FLUSH;
     }
 
-    if ((hnd->flags & private_handle_t::PRIV_FLAGS_SW_LOCK)) {
-        // Unlock the buffer.
-        if (GENLOCK_NO_ERROR != genlock_unlock_buffer((native_handle_t *)handle)) {
-            ALOGE("%s: genlock_unlock_buffer failed", __FUNCTION__);
-            return -EINVAL;
-        } else
-            hnd->flags &= ~private_handle_t::PRIV_FLAGS_SW_LOCK;
-    }
     return 0;
 }
 
diff --git a/libhwcomposer/Android.mk b/libhwcomposer/Android.mk
index 0ca7ca1..b1ee2da 100644
--- a/libhwcomposer/Android.mk
+++ b/libhwcomposer/Android.mk
@@ -6,7 +6,7 @@
 LOCAL_MODULE_PATH             := $(TARGET_OUT_SHARED_LIBRARIES)/hw
 LOCAL_MODULE_TAGS             := optional
 LOCAL_C_INCLUDES              := $(common_includes) $(kernel_includes)
-LOCAL_SHARED_LIBRARIES        := $(common_libs) libEGL liboverlay libgenlock \
+LOCAL_SHARED_LIBRARIES        := $(common_libs) libEGL liboverlay \
                                  libexternal libqdutils libhardware_legacy \
                                  libdl libmemalloc libqservice libsync \
                                  libbinder libmedia
