diff --git a/include/ui/GraphicBuffer.h b/include/ui/GraphicBuffer.h
index 54f4cd3..95ca0f3 100644
--- a/include/ui/GraphicBuffer.h
+++ b/include/ui/GraphicBuffer.h
@@ -91,6 +91,12 @@
             uint32_t inLayerCount, uint32_t inUsage, uint32_t inStride,
             native_handle_t* inHandle, bool keepOwnership);
 
+    // create a buffer from an existing handle using gralloc1
+    GraphicBuffer(uint32_t inWidth, uint32_t inHeight, PixelFormat inFormat,
+            uint32_t inLayerCount, uint32_t inProducerUsage,
+            uint32_t inConsumerUsage, uint32_t inStride,
+            native_handle_t* inHandle, bool keepOwnership);
+
     // create a buffer from an existing ANativeWindowBuffer
     GraphicBuffer(ANativeWindowBuffer* buffer, bool keepOwnership);
 
diff --git a/libs/ui/GraphicBuffer.cpp b/libs/ui/GraphicBuffer.cpp
index d29bae1..5ef95ec 100644
--- a/libs/ui/GraphicBuffer.cpp
+++ b/libs/ui/GraphicBuffer.cpp
@@ -104,6 +104,24 @@
     handle = inHandle;
 }
 
+GraphicBuffer::GraphicBuffer(uint32_t inWidth, uint32_t inHeight,
+        PixelFormat inFormat, uint32_t inLayerCount, uint32_t inProducerUsage,
+        uint32_t inConsumerUsage, uint32_t inStride,
+        native_handle_t* inHandle, bool keepOwnership)
+    : BASE(), mOwner(keepOwnership ? ownHandle : ownNone),
+      mBufferMapper(GraphicBufferMapper::get()),
+      mInitCheck(NO_ERROR), mId(getUniqueId()), mGenerationNumber(0)
+{
+    width  = static_cast<int>(inWidth);
+    height = static_cast<int>(inHeight);
+    stride = static_cast<int>(inStride);
+    format = inFormat;
+    layerCount = inLayerCount;
+    usage  = static_cast<int>(inConsumerUsage | inProducerUsage);
+    handle = inHandle;
+}
+
+
 GraphicBuffer::GraphicBuffer(ANativeWindowBuffer* buffer, bool keepOwnership)
     : BASE(), mOwner(keepOwnership ? ownHandle : ownNone),
       mBufferMapper(GraphicBufferMapper::get()),
diff --git a/services/vr/vr_window_manager/Android.mk_disable b/services/vr/vr_window_manager/Android.mk
similarity index 96%
rename from services/vr/vr_window_manager/Android.mk_disable
rename to services/vr/vr_window_manager/Android.mk
index cc1db7b..47d9dcc 100644
--- a/services/vr/vr_window_manager/Android.mk_disable
+++ b/services/vr/vr_window_manager/Android.mk
@@ -100,7 +100,6 @@
 
 include $(CLEAR_VARS)
 LOCAL_SRC_FILES := $(src)
-LOCAL_C_INCLUDES := hardware/qcom/display/msm8996/libgralloc
 LOCAL_STATIC_LIBRARIES := $(static_libs)
 LOCAL_SHARED_LIBRARIES := $(shared_libs)
 LOCAL_SHARED_LIBRARIES += libgvr
@@ -117,7 +116,6 @@
 
 include $(CLEAR_VARS)
 LOCAL_SRC_FILES := $(native_src)
-LOCAL_C_INCLUDES := hardware/qcom/display/msm8996/libgralloc
 LOCAL_STATIC_LIBRARIES := $(static_libs) libvrwm_binder
 LOCAL_SHARED_LIBRARIES := $(shared_libs)
 LOCAL_SHARED_LIBRARIES += libgvr
diff --git a/services/vr/vr_window_manager/composer/Android.bp b/services/vr/vr_window_manager/composer/Android.bp
index 207d456..08c105c 100644
--- a/services/vr/vr_window_manager/composer/Android.bp
+++ b/services/vr/vr_window_manager/composer/Android.bp
@@ -2,46 +2,43 @@
   "1.0",
 ]
 
-//cc_library_shared {
-//  name: "libvrhwc",
-//
-//  srcs: [
-//    "impl/sync_timeline.cpp",
-//    "impl/vr_composer_view.cpp",
-//    "impl/vr_hwc.cpp",
-//    "impl/vr_composer_client.cpp",
-//  ],
-//
-//  static_libs: [
-//    "libhwcomposer-client",
-//  ],
-//
-//  shared_libs: [
-//    "android.dvr.composer@1.0",
-//    "android.hardware.graphics.composer@2.1",
-//    "libbase",
-//    "libcutils",
-//    "libfmq",
-//    "libhardware",
-//    "libhidlbase",
-//    "libhidltransport",
-//    "liblog",
-//    "libsync",
-//    "libui",
-//    "libutils",
-//  ],
-//
-//  export_include_dirs: ["."],
-//
-//  include_dirs: [
-//    // Access to software sync timeline.
-//    "system/core/libsync",
-//
-//    // Access to internal gralloc implementation.
-//    "hardware/qcom/display/msm8996/libgralloc",
-//  ],
-//
-//  cflags: [
-//    "-DLOG_TAG=\"vrhwc\"",
-//  ],
-//}
+cc_library_shared {
+  name: "libvrhwc",
+
+  srcs: [
+    "impl/sync_timeline.cpp",
+    "impl/vr_composer_view.cpp",
+    "impl/vr_hwc.cpp",
+    "impl/vr_composer_client.cpp",
+  ],
+
+  static_libs: [
+    "libhwcomposer-client",
+  ],
+
+  shared_libs: [
+    "android.dvr.composer@1.0",
+    "android.hardware.graphics.composer@2.1",
+    "libbase",
+    "libcutils",
+    "libfmq",
+    "libhardware",
+    "libhidlbase",
+    "libhidltransport",
+    "liblog",
+    "libsync",
+    "libui",
+    "libutils",
+  ],
+
+  export_include_dirs: ["."],
+
+  include_dirs: [
+    // Access to software sync timeline.
+    "system/core/libsync",
+  ],
+
+  cflags: [
+    "-DLOG_TAG=\"vrhwc\"",
+  ],
+}
diff --git a/services/vr/vr_window_manager/composer/impl/vr_hwc.cpp b/services/vr/vr_window_manager/composer/impl/vr_hwc.cpp
index 7e406a5..d7d0e5b 100644
--- a/services/vr/vr_window_manager/composer/impl/vr_hwc.cpp
+++ b/services/vr/vr_window_manager/composer/impl/vr_hwc.cpp
@@ -15,7 +15,6 @@
  */
 #include "vr_hwc.h"
 
-#include <gralloc_priv.h>
 #include <ui/Fence.h>
 #include <ui/GraphicBuffer.h>
 #include <ui/GraphicBufferMapper.h>
@@ -44,13 +43,28 @@
 const Config kDefaultConfigId = 1;
 
 sp<GraphicBuffer> GetBufferFromHandle(const native_handle_t* handle) {
-  // TODO(dnicoara): Fix this once gralloc1 is available.
-  private_handle_t* private_handle = private_handle_t::dynamicCast(handle);
+  uint32_t width = 0, height = 0, stride = 0, layer_count = 1;
+  uint64_t producer_usage = 0, consumer_usage = 0;
+  int32_t format = 0;
+
+  GraphicBufferMapper& mapper = GraphicBufferMapper::get();
+  if (mapper.getDimensions(handle, &width, &height) ||
+      mapper.getStride(handle, &stride) ||
+      mapper.getFormat(handle, &format) ||
+      mapper.getProducerUsage(handle, &producer_usage) ||
+      mapper.getConsumerUsage(handle, &consumer_usage)) {
+    ALOGE("Failed to read handle properties");
+    return nullptr;
+  }
+
+  // This will only succeed if gralloc has GRALLOC1_CAPABILITY_LAYERED_BUFFERS
+  // capability. Otherwise assume a count of 1.
+  mapper.getLayerCount(handle, &layer_count);
+
   sp<GraphicBuffer> buffer = new GraphicBuffer(
-      private_handle->width, private_handle->height, private_handle->format, 1,
-      GraphicBuffer::USAGE_HW_COMPOSER | GraphicBuffer::USAGE_HW_TEXTURE,
-      private_handle->width, native_handle_clone(handle), true);
-  if (GraphicBufferMapper::get().registerBuffer(buffer.get()) != OK) {
+      width, height, format, layer_count, producer_usage, consumer_usage,
+      stride, native_handle_clone(handle), true);
+  if (mapper.registerBuffer(buffer.get()) != OK) {
     ALOGE("Failed to register buffer");
     return nullptr;
   }
diff --git a/services/vr/vr_window_manager/composer/impl/vr_hwc.h b/services/vr/vr_window_manager/composer/impl/vr_hwc.h
index 6b9487b..9450097 100644
--- a/services/vr/vr_window_manager/composer/impl/vr_hwc.h
+++ b/services/vr/vr_window_manager/composer/impl/vr_hwc.h
@@ -18,7 +18,8 @@
 
 #include <android/hardware/graphics/composer/2.1/IComposer.h>
 #include <ComposerBase.h>
-#include <ui/GraphicBufferMapper.h>
+#include <ui/Fence.h>
+#include <ui/GraphicBuffer.h>
 #include <utils/StrongPointer.h>
 
 #include <mutex>
diff --git a/services/vr/vr_window_manager/hwc_callback.cpp b/services/vr/vr_window_manager/hwc_callback.cpp
index 5045790..12a76d8 100644
--- a/services/vr/vr_window_manager/hwc_callback.cpp
+++ b/services/vr/vr_window_manager/hwc_callback.cpp
@@ -1,10 +1,10 @@
 #include "hwc_callback.h"
 
-#include <gralloc_priv.h>
 #include <android-base/unique_fd.h>
 #include <log/log.h>
 #include <private/dvr/native_buffer.h>
 #include <sync/sync.h>
+#include <ui/GraphicBufferMapper.h>
 
 namespace android {
 namespace dvr {
@@ -12,14 +12,28 @@
 namespace {
 
 sp<GraphicBuffer> GetBufferFromHandle(const native_handle_t* handle) {
-  // TODO(dnicoara): Fix this once gralloc1 is available.
-  private_handle_t* private_handle = private_handle_t::dynamicCast(handle);
+  uint32_t width = 0, height = 0, stride = 0, layer_count = 1;
+  uint64_t producer_usage = 0, consumer_usage = 0;
+  int32_t format = 0;
+
+  GraphicBufferMapper& mapper = GraphicBufferMapper::get();
+  if (mapper.getDimensions(handle, &width, &height) ||
+      mapper.getStride(handle, &stride) ||
+      mapper.getFormat(handle, &format) ||
+      mapper.getProducerUsage(handle, &producer_usage) ||
+      mapper.getConsumerUsage(handle, &consumer_usage)) {
+    ALOGE("Failed to read handle properties");
+    return nullptr;
+  }
+
+  // This will only succeed if gralloc has GRALLOC1_CAPABILITY_LAYERED_BUFFERS
+  // capability. Otherwise assume a count of 1.
+  mapper.getLayerCount(handle, &layer_count);
+
   sp<GraphicBuffer> buffer = new GraphicBuffer(
-      private_handle->width, private_handle->height, private_handle->format, 1,
-      GraphicBuffer::USAGE_HW_COMPOSER | GraphicBuffer::USAGE_HW_TEXTURE |
-      GraphicBuffer::USAGE_HW_2D | GraphicBuffer::USAGE_HW_RENDER,
-      private_handle->width, native_handle_clone(handle), true);
-  if (GraphicBufferMapper::get().registerBuffer(buffer.get()) != OK) {
+      width, height, format, layer_count, producer_usage, consumer_usage,
+      stride, native_handle_clone(handle), true);
+  if (mapper.registerBuffer(buffer.get()) != OK) {
     ALOGE("Failed to register buffer");
     return nullptr;
   }
