diff --git a/merrifield/common/buffers/BufferManager.cpp b/merrifield/common/buffers/BufferManager.cpp
index ca6f0ad..6a939ae 100644
--- a/merrifield/common/buffers/BufferManager.cpp
+++ b/merrifield/common/buffers/BufferManager.cpp
@@ -17,14 +17,14 @@
 #include <HwcTrace.h>
 #include <hardware/hwcomposer.h>
 #include <BufferManager.h>
-#include <hal_public.h>
 #include <DrmConfig.h>
 
 namespace android {
 namespace intel {
 
 BufferManager::BufferManager()
-    : mGralloc(NULL),
+    : mGrallocModule(NULL),
+      mAllocDev(NULL),
       mFrameBuffers(),
       mBufferPool(NULL),
       mDataBuffer(NULL),
@@ -56,9 +56,16 @@
     }
 
     // init gralloc module
-    if (gralloc_open_img(&mGralloc)) {
+    hw_module_t const* module;
+    if (hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &module)) {
         DEINIT_AND_RETURN_FALSE("failed to get gralloc module");
     }
+    mGrallocModule = (gralloc_module_t const*)module;
+
+    gralloc_open(module, &mAllocDev);
+    if (!mAllocDev) {
+        WTRACE("failed to open alloc device");
+    }
 
     // create a dummy data buffer
     mDataBuffer = createDataBuffer(0);
@@ -93,9 +100,9 @@
     }
     mFrameBuffers.clear();
 
-    if (mGralloc) {
-        gralloc_close_img(mGralloc);
-        mGralloc = NULL;
+    if (mAllocDev) {
+        gralloc_close(mAllocDev);
+        mAllocDev = NULL;
     }
 
     if (mDataBuffer) {
@@ -215,7 +222,7 @@
 {
     RETURN_NULL_IF_NOT_INIT();
 
-    if (!mGralloc) {
+    if (!mAllocDev) {
         WTRACE("Alloc device is not available");
         return 0;
     }
@@ -227,8 +234,8 @@
 
     ITRACE("size of frame buffer to create: %dx%d", width, height);
     buffer_handle_t handle = 0;
-    status_t err = gralloc_device_alloc_img(
-            mGralloc,
+    status_t err  = mAllocDev->alloc(
+            mAllocDev,
             width,
             height,
             DrmConfig::getFrameBufferFormat(),
@@ -275,7 +282,7 @@
     if (mapper) {
         delete mapper;
     }
-    gralloc_device_free_img(mGralloc, handle);
+    mAllocDev->free(mAllocDev, handle);
     return 0;
 }
 
@@ -283,7 +290,7 @@
 {
     RETURN_VOID_IF_NOT_INIT();
 
-    if (!mGralloc) {
+    if (!mAllocDev) {
         WTRACE("Alloc device is not available");
         return;
     }
@@ -299,14 +306,14 @@
     mapper->putFbHandle();
     delete mapper;
     mFrameBuffers.removeItem(fbHandle);
-    gralloc_device_free_img(mGralloc, handle);
+    mAllocDev->free(mAllocDev, handle);
 }
 
 buffer_handle_t BufferManager::allocGrallocBuffer(uint32_t width, uint32_t height, uint32_t format, uint32_t usage)
 {
     RETURN_NULL_IF_NOT_INIT();
 
-    if (!mGralloc) {
+    if (!mAllocDev) {
         WTRACE("Alloc device is not available");
         return 0;
     }
@@ -319,8 +326,8 @@
     ITRACE("size of graphic buffer to create: %dx%d", width, height);
     buffer_handle_t handle = 0;
     int stride;
-    status_t err = gralloc_device_alloc_img(
-                mGralloc,
+    status_t err  = mAllocDev->alloc(
+                mAllocDev,
                 width,
                 height,
                 format,
@@ -338,13 +345,13 @@
 void BufferManager::freeGrallocBuffer(buffer_handle_t handle)
 {
     RETURN_VOID_IF_NOT_INIT();
-    if (!mGralloc) {
+    if (!mAllocDev) {
         WTRACE("Alloc device is not available");
         return;
     }
 
     if (handle)
-        gralloc_device_free_img(mGralloc, handle);
+        mAllocDev->free(mAllocDev, handle);
 }
 
 } // namespace intel
diff --git a/merrifield/include/BufferManager.h b/merrifield/include/BufferManager.h
index d304b00..6bc98bf 100644
--- a/merrifield/include/BufferManager.h
+++ b/merrifield/include/BufferManager.h
@@ -65,7 +65,7 @@
     virtual DataBuffer* createDataBuffer(buffer_handle_t handle) = 0;
     virtual BufferMapper* createBufferMapper(DataBuffer& buffer) = 0;
 
-    const hw_device_t* mGralloc;
+    gralloc_module_t const* mGrallocModule;
 private:
     enum {
         // make the buffer pool large enough
diff --git a/merrifield/include/pvr/hal/hal_public.h b/merrifield/include/pvr/hal/hal_public.h
index 19910c1..e1053bd 100644
--- a/merrifield/include/pvr/hal/hal_public.h
+++ b/merrifield/include/pvr/hal/hal_public.h
@@ -21,195 +21,28 @@
  * THE SOFTWARE.
  */
 
-#ifndef HAL_PUBLIC_H
-#define HAL_PUBLIC_H
+#ifndef __HAL_PUBLIC_H
+#define __HAL_PUBLIC_H
 
-#define PVR_ANDROID_HAS_SET_BUFFERS_DATASPACE
-#define PVR_ANDROID_HAS_SET_BUFFERS_DATASPACE_2
+#define PVR_ANDROID_NATIVE_WINDOW_HAS_SYNC
 
-#include "img_gralloc_common_public.h"
+#include "img_gralloc_public.h"
 
-/* Extension pixel formats used by Intel components */
+#undef HAL_PIXEL_FORMAT_NV12
 
-#undef  HAL_PIXEL_FORMAT_NV12
+#define HAL_PIXEL_FORMAT_UYVY         0x107
+#define HAL_PIXEL_FORMAT_INTEL_ZSL    0x109
+#define HAL_PIXEL_FORMAT_NV12         0x3231564E
+#define HAL_PIXEL_FORMAT_NV21         0x3132564E
+#define HAL_PIXEL_FORMAT_I420         0x30323449
+#define HAL_PIXEL_FORMAT_YUY2         0x32595559
+#define HAL_PIXEL_FORMAT_NV12_VED     0x7FA00E00
+#define HAL_PIXEL_FORMAT_NV12_VEDT    0x7FA00F00
 
-#define HAL_PIXEL_FORMAT_UYVY                 0x107
-#define HAL_PIXEL_FORMAT_INTEL_YV12           0x108
-#define HAL_PIXEL_FORMAT_INTEL_ZSL            0x109
-#define HAL_PIXEL_FORMAT_NV12                 0x3231564E
-#define HAL_PIXEL_FORMAT_NV21                 0x3132564E
-#define HAL_PIXEL_FORMAT_I420                 0x30323449
-#define HAL_PIXEL_FORMAT_YUY2                 0x32595559
-#define HAL_PIXEL_FORMAT_NV12_VED             0x7FA00E00
-#define HAL_PIXEL_FORMAT_NV12_VEDT            0x7FA00F00
+#define GRALLOC_MODULE_GET_BUFFER_CPU_ADDRESSES_IMG 108
+#define GRALLOC_MODULE_PUT_BUFFER_CPU_ADDRESSES_IMG 109
 
-/* Extension API used by Intel components */
+#define GRALLOC_MODULE_GET_DISPLAY_DEVICE_IMG 1000
+#define GRALLOC_MODULE_GET_DISPLAY_STATUS_IMG 1001
 
-#define GRALLOC_GET_BUFFER_CPU_ADDRESSES_IMG  108
-#define GRALLOC_PUT_BUFFER_CPU_ADDRESSES_IMG  109
-
-#define GRALLOC_GET_DISPLAY_DEVICE_IMG        1000
-#define GRALLOC_GET_DISPLAY_STATUS_IMG        1001
-
-#include "img_gralloc.h"
-#include "img_gralloc1.h"
-
-typedef const gralloc_module_t gralloc0_t;
-typedef gralloc1_device_t      gralloc1_t;
-
-static inline int gralloc_is_v1_img(const hw_module_t *m)
-{
-	return ((m->module_api_version >> 8) & 0xff) == 1;
-}
-
-static inline int gralloc_open_img(const hw_device_t **d)
-{
-	const hw_module_t *m;
-	int err;
-
-	err = hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &m);
-	if (err)
-		return err;
-
-	if (gralloc_is_v1_img(m))
-		return gralloc1_open(m, (gralloc1_t **)d);
-	else
-		return gralloc_open(m, (alloc_device_t **)d);
-}
-
-static inline int gralloc_close_img(const hw_device_t *d)
-{
-	if (gralloc_is_v1_img(d->module))
-		return gralloc1_close((gralloc1_t *)d);
-	else
-		return gralloc_close((alloc_device_t *)d);
-}
-
-static inline int gralloc_register_img
-	(const hw_device_t *d, buffer_handle_t handle)
-{
-	if (gralloc_is_v1_img(d->module))
-		return gralloc1_register_img((gralloc1_t *)d, handle);
-	else
-		return gralloc0_register_img((gralloc0_t *)d->module, handle);
-}
-
-static inline int gralloc_unregister_img
-	(const hw_device_t *d, buffer_handle_t handle)
-{
-	if (gralloc_is_v1_img(d->module))
-		return gralloc1_unregister_img((gralloc1_t *)d, handle);
-	else
-		return gralloc0_unregister_img((gralloc0_t *)d->module, handle);
-}
-
-static inline int gralloc_device_alloc_img
-	(const hw_device_t *d, int w, int h, int format, int usage,
-	 buffer_handle_t *handle, int *stride)
-{
-	if (gralloc_is_v1_img(d->module)) {
-		usage = (usage | ((usage & 0x33) << 1)) & ~0x11;
-		return gralloc1_device_alloc_img((gralloc1_t *)d, w, h, format,
-										 usage, handle, stride);
-	} else
-		return gralloc0_device_alloc_img((alloc_device_t *)d, w, h, format,
-										 usage, handle, stride);
-}
-
-static inline int gralloc_device_free_img
-	(const hw_device_t *d, buffer_handle_t handle)
-{
-	if (gralloc_is_v1_img(d->module))
-		return gralloc1_device_free_img((gralloc1_t *)d, handle);
-	else
-		return gralloc0_device_free_img((alloc_device_t *)d, handle);
-}
-
-static inline int gralloc_lock_async_img
-	(const hw_device_t *d, buffer_handle_t handle, int usage,
-	 const gralloc1_rect_t *r, void **vaddr, int acquireFence)
-{
-	if (gralloc_is_v1_img(d->module)) {
-		usage = (usage | ((usage & 0x33) << 1)) & ~0x11;
-		return gralloc1_lock_async_img((gralloc1_t *)d,
-									   handle, usage, r, vaddr, acquireFence);
-	} else
-		return gralloc0_lock_async_img((gralloc0_t *)d->module,
-									   handle, usage, r, vaddr, acquireFence);
-}
-
-static inline int gralloc_unlock_async_img
-	(const hw_device_t *d, buffer_handle_t handle, int *releaseFence)
-{
-	if (gralloc_is_v1_img(d->module))
-		return gralloc1_unlock_async_img((gralloc1_t *)d,
-										 handle, releaseFence);
-	else
-		return gralloc0_unlock_async_img((gralloc0_t *)d->module,
-										 handle, releaseFence);
-}
-
-static inline int gralloc_blit_handle_to_handle_img
-	(const hw_device_t *d, buffer_handle_t src, buffer_handle_t dest,
-	 int w, int h, int x, int y, int transform, int input_fence,
-	 int *output_fence)
-{
-	if (gralloc_is_v1_img(d->module))
-		return gralloc1_blit_handle_to_handle_img((gralloc1_t *)d,
-												  src, dest, w, h, x, y,
-												  transform, input_fence,
-												  output_fence);
-	else
-		return gralloc0_blit_handle_to_handle_img((gralloc0_t *)d->module,
-												  src, dest, w, h, x, y,
-												  transform, input_fence,
-												  output_fence);
-}
-
-
-static inline int gralloc_get_buffer_cpu_addresses_img
-	(const hw_device_t *d, buffer_handle_t handle, void **vaddrs,
-	 size_t *sizes)
-{
-	if (gralloc_is_v1_img(d->module))
-		return gralloc1_get_buffer_cpu_addresses_img((gralloc1_t *)d,
-													 handle, vaddrs, sizes);
-	else
-		return gralloc0_get_buffer_cpu_addresses_img((gralloc0_t *)d->module,
-													 handle, vaddrs, sizes);
-}
-
-static inline int gralloc_put_buffer_cpu_addresses_img
-	(const hw_device_t *d, buffer_handle_t handle)
-{
-	if (gralloc_is_v1_img(d->module))
-		return gralloc1_put_buffer_cpu_addresses_img((gralloc1_t *)d,
-													 handle);
-	else
-		return gralloc0_put_buffer_cpu_addresses_img((gralloc0_t *)d->module,
-													 handle);
-}
-
-static inline int gralloc_get_display_device_img
-	(const hw_device_t *d, void **ppvDispDev)
-{
-	if (gralloc_is_v1_img(d->module))
-		return gralloc1_get_display_device_img((gralloc1_t *)d,
-											   ppvDispDev);
-	else
-		return gralloc0_get_display_device_img((gralloc0_t *)d->module,
-											   ppvDispDev);
-}
-
-static inline int gralloc_get_display_status_img
-	(const hw_device_t *d, buffer_handle_t handle, uint32_t *pui32Status)
-{
-	if (gralloc_is_v1_img(d->module))
-		return gralloc1_get_display_status_img((gralloc1_t *)d,
-											   handle, pui32Status);
-	else
-		return gralloc0_get_display_status_img((gralloc0_t *)d->module,
-											   handle, pui32Status);
-}
-
-#endif /* HAL_PUBLIC_H */
+#endif /* __HAL_PUBLIC_H */
diff --git a/merrifield/include/pvr/hal/img_gralloc.h b/merrifield/include/pvr/hal/img_gralloc.h
deleted file mode 100644
index d9560fa..0000000
--- a/merrifield/include/pvr/hal/img_gralloc.h
+++ /dev/null
@@ -1,107 +0,0 @@
-/* Copyright (c) Imagination Technologies Ltd.
- *
- * The contents of this file are subject to the MIT license as set out below.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-#ifndef IMG_GRALLOC_H
-#define IMG_GRALLOC_H
-
-#include <hardware/gralloc.h>
-
-/* for gralloc1_rect_t */
-#include <hardware/gralloc1.h>
-
-static inline int gralloc0_register_img
-	(const gralloc_module_t *g, buffer_handle_t handle)
-{
-	return g->registerBuffer(g, handle);
-}
-
-static inline int gralloc0_unregister_img
-	(const gralloc_module_t *g, buffer_handle_t handle)
-{
-	return g->unregisterBuffer(g, handle);
-}
-
-static inline int gralloc0_device_alloc_img
-	(alloc_device_t *d, int w, int h, int format, int usage,
-	 buffer_handle_t *handle, int *stride)
-{
-	return d->alloc(d, w, h, format, usage, handle, stride);
-}
-
-static inline int gralloc0_device_free_img
-	(alloc_device_t *d, buffer_handle_t handle)
-{
-	return d->free(d, handle);
-}
-
-static inline int gralloc0_lock_async_img
-	(const gralloc_module_t *g, buffer_handle_t handle, int usage,
-	 const gralloc1_rect_t *r, void **vaddr, int acquireFence)
-{
-	return g->lockAsync(g, handle, usage,
-						r->left, r->top, r->width, r->height,
-						vaddr, acquireFence);
-}
-
-static inline int gralloc0_unlock_async_img
-	(const gralloc_module_t *g, buffer_handle_t handle, int *releaseFence)
-{
-	return g->unlockAsync(g, handle, releaseFence);
-}
-
-static inline int gralloc0_blit_handle_to_handle_img
-	(const gralloc_module_t *g, buffer_handle_t src, buffer_handle_t dest,
-	 int w, int h, int x, int y, int transform, int input_fence,
-	 int *output_fence)
-{
-	return g->perform(g, GRALLOC_BLIT_HANDLE_TO_HANDLE_IMG, src, dest, w, h,
-					  x, y, transform, input_fence, output_fence);
-}
-
-static inline int gralloc0_get_buffer_cpu_addresses_img
-	(const gralloc_module_t *g, buffer_handle_t handle, void **vaddrs,
-	 size_t *sizes)
-{
-	return g->perform(g, GRALLOC_GET_BUFFER_CPU_ADDRESSES_IMG, handle, vaddrs,
-					  sizes);
-}
-
-static inline int gralloc0_put_buffer_cpu_addresses_img
-	(const gralloc_module_t *g, buffer_handle_t handle)
-{
-	return g->perform(g, GRALLOC_PUT_BUFFER_CPU_ADDRESSES_IMG, handle);
-}
-
-static inline int gralloc0_get_display_device_img
-	(const gralloc_module_t *g, void **ppvDispDev)
-{
-	return g->perform(g, GRALLOC_GET_DISPLAY_DEVICE_IMG, ppvDispDev);
-}
-
-static inline int gralloc0_get_display_status_img
-	(const gralloc_module_t *g, buffer_handle_t handle, uint32_t *pui32Status)
-{
-	return g->perform(g, GRALLOC_GET_DISPLAY_STATUS_IMG, handle, pui32Status);
-}
-
-#endif /* IMG_GRALLOC_H */
diff --git a/merrifield/include/pvr/hal/img_gralloc1.h b/merrifield/include/pvr/hal/img_gralloc1.h
deleted file mode 100644
index f9f69a2..0000000
--- a/merrifield/include/pvr/hal/img_gralloc1.h
+++ /dev/null
@@ -1,303 +0,0 @@
-/* Copyright (c) Imagination Technologies Ltd.
- *
- * The contents of this file are subject to the MIT license as set out below.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-#ifndef IMG_GRALLOC1_H
-#define IMG_GRALLOC1_H
-
-#include <hardware/gralloc1.h>
-
-#include <stdlib.h>
-
-#define GRALLOC1_FUNCTION_IMG_EXT_OFF 1000
-
-enum
-{
-	GRALLOC1_FUNCTION_BLIT_HANDLE_TO_HANDLE_IMG =
-		(GRALLOC1_FUNCTION_IMG_EXT_OFF + GRALLOC_BLIT_HANDLE_TO_HANDLE_IMG),
-	GRALLOC1_FUNCTION_GET_BUFFER_CPU_ADDRESSES_IMG =
-		(GRALLOC1_FUNCTION_IMG_EXT_OFF + GRALLOC_GET_BUFFER_CPU_ADDRESSES_IMG),
-	GRALLOC1_FUNCTION_PUT_BUFFER_CPU_ADDRESSES_IMG =
-		(GRALLOC1_FUNCTION_IMG_EXT_OFF + GRALLOC_PUT_BUFFER_CPU_ADDRESSES_IMG),
-	GRALLOC1_FUNCTION_GET_DISPLAY_DEVICE_IMG =
-		(GRALLOC1_FUNCTION_IMG_EXT_OFF + GRALLOC_GET_DISPLAY_DEVICE_IMG),
-	GRALLOC1_FUNCTION_GET_DISPLAY_STATUS_IMG =
-		(GRALLOC1_FUNCTION_IMG_EXT_OFF + GRALLOC_GET_DISPLAY_STATUS_IMG),
-};
-
-static inline int gralloc1_register_img
-	(gralloc1_device_t *g, buffer_handle_t handle)
-{
-	GRALLOC1_PFN_RETAIN f =
-		(GRALLOC1_PFN_RETAIN)
-			g->getFunction(g, GRALLOC1_FUNCTION_RETAIN);
-	int32_t err;
-
-	err = f(g, handle);
-	switch (err)
-	{
-		case GRALLOC1_ERROR_NO_RESOURCES:
-			return -EAGAIN;
-		case GRALLOC1_ERROR_NONE:
-			return 0;
-		default:
-			return -EINVAL;
-	}
-}
-
-static inline int gralloc1_unregister_img
-	(gralloc1_device_t *g, buffer_handle_t handle)
-{
-	GRALLOC1_PFN_RELEASE f =
-		(GRALLOC1_PFN_RELEASE)
-			g->getFunction(g, GRALLOC1_FUNCTION_RELEASE);
-	int32_t err;
-
-	err = f(g, handle);
-	switch (err)
-	{
-		case GRALLOC1_ERROR_NONE:
-			return 0;
-		default:
-			return -EINVAL;
-	}
-}
-
-static inline int gralloc1_device_alloc_img
-	(gralloc1_device_t *d, int w, int h, int format, int usage,
-	 buffer_handle_t *handle, int *stride)
-{
-	GRALLOC1_PFN_ALLOCATE allocate =
-		(GRALLOC1_PFN_ALLOCATE)
-			d->getFunction(d, GRALLOC1_FUNCTION_ALLOCATE);
-	GRALLOC1_PFN_CREATE_DESCRIPTOR createDescriptor =
-		(GRALLOC1_PFN_CREATE_DESCRIPTOR)
-			d->getFunction(d, GRALLOC1_FUNCTION_CREATE_DESCRIPTOR);
-	GRALLOC1_PFN_DESTROY_DESCRIPTOR destroyDescriptor =
-		(GRALLOC1_PFN_DESTROY_DESCRIPTOR)
-			d->getFunction(d, GRALLOC1_FUNCTION_DESTROY_DESCRIPTOR);
-	GRALLOC1_PFN_SET_CONSUMER_USAGE setConsumerUsage =
-		(GRALLOC1_PFN_SET_CONSUMER_USAGE)
-			d->getFunction(d, GRALLOC1_FUNCTION_SET_CONSUMER_USAGE);
-	GRALLOC1_PFN_SET_DIMENSIONS setDimensions =
-		(GRALLOC1_PFN_SET_DIMENSIONS)
-			d->getFunction(d, GRALLOC1_FUNCTION_SET_DIMENSIONS);
-	GRALLOC1_PFN_SET_FORMAT setFormat =
-		(GRALLOC1_PFN_SET_FORMAT)
-			d->getFunction(d, GRALLOC1_FUNCTION_SET_FORMAT);
-	GRALLOC1_PFN_SET_PRODUCER_USAGE setProducerUsage =
-		(GRALLOC1_PFN_SET_PRODUCER_USAGE)
-			d->getFunction(d, GRALLOC1_FUNCTION_SET_PRODUCER_USAGE);
-	GRALLOC1_PFN_GET_STRIDE getStride =
-		(GRALLOC1_PFN_GET_STRIDE)
-			d->getFunction(d, GRALLOC1_FUNCTION_GET_STRIDE);
-	uint64_t producerUsage =
-		(usage & (GRALLOC1_PRODUCER_USAGE_CPU_READ_OFTEN    |
-		          GRALLOC1_PRODUCER_USAGE_CPU_WRITE_OFTEN   |
-		          GRALLOC1_PRODUCER_USAGE_GPU_RENDER_TARGET |
-		          GRALLOC1_PRODUCER_USAGE_PROTECTED         |
-		          GRALLOC1_PRODUCER_USAGE_CAMERA            |
-		          GRALLOC1_PRODUCER_USAGE_VIDEO_DECODER));
-	uint64_t consumerUsage =
-		(usage & (GRALLOC1_CONSUMER_USAGE_CPU_READ_OFTEN    |
-		          GRALLOC1_CONSUMER_USAGE_GPU_TEXTURE       |
-		          GRALLOC1_CONSUMER_USAGE_HWCOMPOSER        |
-		          GRALLOC1_CONSUMER_USAGE_CLIENT_TARGET     |
-		          GRALLOC1_CONSUMER_USAGE_CURSOR            |
-		          GRALLOC1_CONSUMER_USAGE_VIDEO_ENCODER     |
-		          GRALLOC1_CONSUMER_USAGE_CAMERA            |
-		          GRALLOC1_CONSUMER_USAGE_RENDERSCRIPT));
-	gralloc1_buffer_descriptor_t descriptor;
-	uint32_t stride32;
-	int err = -EINVAL;
-	int32_t err32;
-
-	err32 = createDescriptor(d, &descriptor);
-	if (err32 != GRALLOC1_ERROR_NONE)
-		goto err_out;
-
-	err32 = setDimensions(d, descriptor, w, h);
-	if (err32 != GRALLOC1_ERROR_NONE)
-		goto err_destroy_descriptor;
-
-	err32 = setFormat(d, descriptor, format);
-	if (err32 != GRALLOC1_ERROR_NONE)
-		goto err_destroy_descriptor;
-
-	err32 = setConsumerUsage(d, descriptor, consumerUsage);
-	if (err32 != GRALLOC1_ERROR_NONE)
-		goto err_destroy_descriptor;
-
-	err32 = setProducerUsage(d, descriptor, producerUsage);
-	if (err32 != GRALLOC1_ERROR_NONE)
-		goto err_destroy_descriptor;
-
-	err32 = allocate(d, 1, &descriptor, handle);
-	switch (err32)
-	{
-		case GRALLOC1_ERROR_NOT_SHARED:
-		case GRALLOC1_ERROR_NONE:
-			break;
-		case GRALLOC1_ERROR_NO_RESOURCES:
-			err = -EAGAIN;
-		default:
-			goto err_destroy_descriptor;
-	}
-
-	err32 = getStride(d, *handle, &stride32);
-	if (err32 != GRALLOC1_ERROR_NONE)
-	{
-		gralloc1_unregister_img(d, *handle);
-		goto err_destroy_descriptor;
-	}
-
-	*stride = (int)stride32;
-	err = 0;
-err_destroy_descriptor:
-	destroyDescriptor(d, descriptor);
-err_out:
-	return err;
-}
-
-static inline int gralloc1_device_free_img
-	(gralloc1_device_t *d, buffer_handle_t handle)
-{
-	return gralloc1_unregister_img(d, handle);
-}
-
-static inline int gralloc1_lock_async_img
-	(gralloc1_device_t *g, buffer_handle_t handle, int usage,
-	 const gralloc1_rect_t *r, void **vaddr, int acquireFence)
-{
-	GRALLOC1_PFN_LOCK f =
-		(GRALLOC1_PFN_LOCK)
-			g->getFunction(g, GRALLOC1_FUNCTION_LOCK);
-	uint64_t producerUsage =
-		(usage & (GRALLOC1_PRODUCER_USAGE_CPU_READ_OFTEN |
-		          GRALLOC1_PRODUCER_USAGE_CPU_WRITE_OFTEN));
-	uint64_t consumerUsage =
-		(usage &  GRALLOC1_CONSUMER_USAGE_CPU_READ_OFTEN);
-	int32_t err;
-
-	err = f(g, handle, producerUsage, consumerUsage, r, vaddr, acquireFence);
-	switch (err)
-	{
-		case GRALLOC1_ERROR_NONE:
-			return 0;
-		case GRALLOC1_ERROR_NO_RESOURCES:
-			return -EAGAIN;
-		default:
-			return -EINVAL;
-	}
-}
-
-static inline int gralloc1_unlock_async_img
-	(gralloc1_device_t *g, buffer_handle_t handle, int *releaseFence)
-{
-	GRALLOC1_PFN_UNLOCK f =
-		(GRALLOC1_PFN_UNLOCK)
-			g->getFunction(g, GRALLOC1_FUNCTION_UNLOCK);
-	int32_t err, releaseFence32;
-
-	err = f(g, handle, &releaseFence32);
-	switch (err)
-	{
-		case GRALLOC1_ERROR_NONE:
-			*releaseFence = releaseFence32;
-			return 0;
-		default:
-			return -EINVAL;
-	}
-}
-
-typedef int (*GRALLOC1_PFN_BLIT_HANDLE_TO_HANDLE_IMG)
-	(gralloc1_device_t *g, buffer_handle_t src, buffer_handle_t dest,
-	 int w, int h, int x, int y, int transform, int input_fence,
-	 int *output_fence);
-
-static inline int gralloc1_blit_handle_to_handle_img
-	(gralloc1_device_t *g, buffer_handle_t src, buffer_handle_t dest,
-	 int w, int h, int x, int y, int transform, int input_fence,
-	 int *output_fence)
-{
-	GRALLOC1_PFN_BLIT_HANDLE_TO_HANDLE_IMG f =
-		(GRALLOC1_PFN_BLIT_HANDLE_TO_HANDLE_IMG)
-			g->getFunction(g, GRALLOC1_FUNCTION_BLIT_HANDLE_TO_HANDLE_IMG);
-
-	return f(g, src, dest, w, h, x, y, transform, input_fence, output_fence);
-}
-
-typedef int (*GRALLOC1_PFN_GET_BUFFER_CPU_ADDRESSES_IMG)
-	(gralloc1_device_t *g, buffer_handle_t handle, void **vaddrs,
-	 size_t *sizes);
-
-static inline int gralloc1_get_buffer_cpu_addresses_img
-	(gralloc1_device_t *g, buffer_handle_t handle, void **vaddrs,
-	 size_t *sizes)
-{
-	GRALLOC1_PFN_GET_BUFFER_CPU_ADDRESSES_IMG f =
-		(GRALLOC1_PFN_GET_BUFFER_CPU_ADDRESSES_IMG)
-			g->getFunction(g, GRALLOC1_FUNCTION_GET_BUFFER_CPU_ADDRESSES_IMG);
-
-	return f(g, handle, vaddrs, sizes);
-}
-
-typedef int (*GRALLOC1_PFN_PUT_BUFFER_CPU_ADDRESSES_IMG)
-	(gralloc1_device_t *g, buffer_handle_t handle);
-
-static inline int gralloc1_put_buffer_cpu_addresses_img
-	(gralloc1_device_t *g, buffer_handle_t handle)
-{
-	GRALLOC1_PFN_PUT_BUFFER_CPU_ADDRESSES_IMG f =
-		(GRALLOC1_PFN_PUT_BUFFER_CPU_ADDRESSES_IMG)
-			g->getFunction(g, GRALLOC1_FUNCTION_PUT_BUFFER_CPU_ADDRESSES_IMG);
-
-	return f(g, handle);
-}
-
-typedef int (*GRALLOC1_PFN_GET_DISPLAY_DEVICE_IMG)
-	(gralloc1_device_t *g, void **ppvDispDev);
-
-static inline int gralloc1_get_display_device_img
-	(gralloc1_device_t *g, void **ppvDispDev)
-{
-	GRALLOC1_PFN_GET_DISPLAY_DEVICE_IMG f =
-		(GRALLOC1_PFN_GET_DISPLAY_DEVICE_IMG)
-			g->getFunction(g, GRALLOC1_FUNCTION_GET_DISPLAY_DEVICE_IMG);
-
-	return f(g, ppvDispDev);
-}
-
-typedef int (*GRALLOC1_PFN_GET_DISPLAY_STATUS_IMG)
-	(gralloc1_device_t *g, buffer_handle_t handle, uint32_t *pui32Status);
-
-static inline int gralloc1_get_display_status_img
-	(gralloc1_device_t *g, buffer_handle_t handle, uint32_t *pui32Status)
-{
-	GRALLOC1_PFN_GET_DISPLAY_STATUS_IMG f =
-		(GRALLOC1_PFN_GET_DISPLAY_STATUS_IMG)
-			g->getFunction(g, GRALLOC1_FUNCTION_GET_DISPLAY_STATUS_IMG);
-
-	return f(g, handle, pui32Status);
-}
-
-#endif /* IMG_GRALLOC1_H */
diff --git a/merrifield/include/pvr/hal/img_gralloc_common_public.h b/merrifield/include/pvr/hal/img_gralloc_common_public.h
deleted file mode 100644
index 965e5a7..0000000
--- a/merrifield/include/pvr/hal/img_gralloc_common_public.h
+++ /dev/null
@@ -1,368 +0,0 @@
-/* Copyright (c) Imagination Technologies Ltd.
- *
- * The contents of this file are subject to the MIT license as set out below.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-#ifndef IMG_GRALLOC_COMMON_PUBLIC_H
-#define IMG_GRALLOC_COMMON_PUBLIC_H
-
-#include <cutils/native_handle.h>
-#include <system/graphics.h>
-#include <linux/ion.h>
-
-#define ALIGN(x,a)	((((x) + (a) - 1L) / (a)) * (a))
-#define HW_ALIGN	32
-
-/* Use bits [0-3] of "vendor format" bits as real format. Customers should
- * use *only* the unassigned bits below for custom pixel formats, YUV or RGB.
- *
- * If there are no bits set in this part of the field, or other bits are set
- * in the format outside of the "vendor format" mask, the non-extension format
- * is used instead. Reserve 0 for this purpose.
- */
-
-#define HAL_PIXEL_FORMAT_VENDOR_EXT(fmt) (0x100 | (fmt & 0xF))
-
-/*      Reserved ** DO NOT USE **    HAL_PIXEL_FORMAT_VENDOR_EXT(0) */
-#define HAL_PIXEL_FORMAT_BGRX_8888   HAL_PIXEL_FORMAT_VENDOR_EXT(1)
-#define HAL_PIXEL_FORMAT_sBGR_A_8888 HAL_PIXEL_FORMAT_VENDOR_EXT(2)
-#define HAL_PIXEL_FORMAT_sBGR_X_8888 HAL_PIXEL_FORMAT_VENDOR_EXT(3)
-/*      HAL_PIXEL_FORMAT_RGB_565     HAL_PIXEL_FORMAT_VENDOR_EXT(4) */
-/*      HAL_PIXEL_FORMAT_BGRA_8888   HAL_PIXEL_FORMAT_VENDOR_EXT(5) */
-#define HAL_PIXEL_FORMAT_NV12        HAL_PIXEL_FORMAT_VENDOR_EXT(6)
-/*      Free for customer use        HAL_PIXEL_FORMAT_VENDOR_EXT(7) */
-/*      Free for customer use        HAL_PIXEL_FORMAT_VENDOR_EXT(8) */
-/*      Free for customer use        HAL_PIXEL_FORMAT_VENDOR_EXT(9) */
-/*      Free for customer use        HAL_PIXEL_FORMAT_VENDOR_EXT(10) */
-/*      Free for customer use        HAL_PIXEL_FORMAT_VENDOR_EXT(11) */
-/*      Free for customer use        HAL_PIXEL_FORMAT_VENDOR_EXT(12) */
-/*      Free for customer use        HAL_PIXEL_FORMAT_VENDOR_EXT(13) */
-/*      Free for customer use        HAL_PIXEL_FORMAT_VENDOR_EXT(14) */
-/*      Free for customer use        HAL_PIXEL_FORMAT_VENDOR_EXT(15) */
-
-/* One of the below compression modes is OR'ed into bits [4-6] of the 8 bit
- * "vendor format" field. If no bits are set in this "compression mask", the
- * normal memory format for the pixel format is used. Otherwise the pixel
- * data will be compressed in memory with the Rogue framebuffer compressor.
- */
-
-#define HAL_FB_COMPRESSION_NONE                0
-#define HAL_FB_COMPRESSION_DIRECT_8x8          1
-#define HAL_FB_COMPRESSION_DIRECT_16x4         2
-#define HAL_FB_COMPRESSION_DIRECT_32x2         3
-#define HAL_FB_COMPRESSION_INDIRECT_8x8        4
-#define HAL_FB_COMPRESSION_INDIRECT_16x4       5
-#define HAL_FB_COMPRESSION_INDIRECT_4TILE_8x8  6
-#define HAL_FB_COMPRESSION_INDIRECT_4TILE_16x4 7
-
-/* The memory layout is OR'ed into bit 7 (top bit) of the 8 bit "vendor
- * format" field. Only STRIDED and TWIDDLED are supported; there is no space
- * for PAGETILED.
- */
-#define HAL_FB_MEMLAYOUT_STRIDED               0
-#define HAL_FB_MEMLAYOUT_TWIDDLED              1
-
-/* This can be tuned down as appropriate for the SOC.
- *
- * IMG formats are usually a single sub-alloc.
- * Some OEM video formats are two sub-allocs (Y, UV planes).
- * Future OEM video formats might be three sub-allocs (Y, U, V planes).
- */
-#define MAX_SUB_ALLOCS (3)
-
-typedef struct
-{
-	native_handle_t base;
-
-	/* These fields can be sent cross process. They are also valid
-	 * to duplicate within the same process.
-	 *
-	 * A table is stored within the gralloc implementation's private data
-	 * structure (which is per-process) which maps stamps to a mapped
-	 * PVRSRV_MEMDESC in that process. Each map entry has a lock count
-	 * associated with it, satisfying the requirements of the gralloc API.
-	 * This also prevents us from leaking maps/allocations.
-	 */
-
-#define IMG_NATIVE_HANDLE_NUMFDS (MAX_SUB_ALLOCS)
-	/* The `fd' field is used to "export" a meminfo to another process. */
-	int fd[IMG_NATIVE_HANDLE_NUMFDS];
-
-	/* This define should represent the number of packed 'int's required to
-	 * represent the fields following it. If you add a data type that is
-	 * 64-bit, for example using 'unsigned long long', you should write that
-	 * as "sizeof(unsigned long long) / sizeof(int)". Please keep the order
-	 * of the additions the same as the defined field order.
-	 */
-#define IMG_NATIVE_HANDLE_NUMINTS \
-	(sizeof(unsigned long long) / sizeof(int) + \
-	 6 + MAX_SUB_ALLOCS + MAX_SUB_ALLOCS + \
-	 sizeof(unsigned long long) / sizeof(int) * MAX_SUB_ALLOCS + \
-	 1)
-	/* A KERNEL unique identifier for any exported kernel memdesc. Each
-	 * exported kernel memdesc will have a unique stamp, but note that in
-	 * userspace, several memdescs across multiple processes could have
-	 * the same stamp. As the native_handle can be dup(2)'d, there could be
-	 * multiple handles with the same stamp but different file descriptors.
-	 */
-	unsigned long long ui64Stamp;
-
-	/* This is used for buffer usage validation */
-	int usage;
-
-	/* In order to do efficient cache flushes we need the buffer dimensions,
-	 * format and bits per pixel. There are ANativeWindow queries for the
-	 * width, height and format, but the graphics HAL might have remapped the
-	 * request to different values at allocation time. These are the 'true'
-	 * values of the buffer allocation.
-	 */
-	int iWidth;
-	int iHeight;
-	int iFormat;
-	unsigned int uiBpp;
-
-	/* Planes are not the same as the `fd' suballocs. A multi-planar YUV
-	 * allocation has different planes (interleaved = 1, semi-planar = 2,
-	 * fully-planar = 3) but might be spread across 1, 2 or 3 independent
-	 * memory allocations (or not).
-	 */
-	int iPlanes;
-
-	/* For multi-planar allocations, there will be multiple hstrides */
-	int aiStride[MAX_SUB_ALLOCS];
-
-	/* For multi-planar allocations, there will be multiple vstrides */
-	int aiVStride[MAX_SUB_ALLOCS];
-
-	/* These byte offsets are reconciled with the number of sub-allocs used
-	 * for a multi-planar allocation. If there is a 1:1 mapping between the
-	 * number of planes and the number of sub-allocs, these will all be zero.
-	 *
-	 * Otherwise, normally the zeroth entry will be zero, and the latter
-	 * entries will be non-zero.
-	 */
-	unsigned long long aulPlaneOffset[MAX_SUB_ALLOCS];
-
-	/* This records the number of MAX_SUB_ALLOCS fds actually used by the
-	 * buffer allocation. File descriptors up to fd[iNumSubAllocs - 1] are
-	 * guaranteed to be valid. (This does not have any bearing on the aiStride,
-	 * aiVStride or aulPlaneOffset fields, as `iPlanes' of those arrays should
-	 * be initialized, not `iNumSubAllocs'.)
-	 */
-	int iNumSubAllocs;
-}
-__attribute__((aligned(sizeof(int)),packed)) IMG_native_handle_t;
-
-/* Channel encoding of buffer data.
- *
- * If the buffer has only one plane, the ENCODING bits should be interpreted
- * as a definition of the interleaving pattern. Only two of the possible four
- * permutations are defined; this is because the YVYU and VYUY patterns are
- * not seen in the wild.
- *
- * If the buffer has more than one plane, the ENCODING bits should be
- * interpreted as a definition of the plane order in memory. Assuming a YUV
- * format, Y is always first, but U and V may be defined in 'V then U' or
- * 'U then V' orders.
- *
- * Some bits are not used, to maximize compatibility with older DDKs which
- * used them in semantically different ways.
- */
-#define IMG_BFF_ENCODING_MASK                (3 << 0)
-/* For uiPlanes == 1 **********************************/
-/*   Reserved for VYUY (check IsYUV if used) (0 << 0) */
-#define IMG_BFF_ENCODING_INTERLEAVED_YUYV    (1 << 0)
-/*   Reserved for YVYU                       (2 << 0) */
-#define IMG_BFF_ENCODING_INTERLEAVED_UYVY    (3 << 0)
-/* For uiPlanes > 1 ***********************************/
-/*   Unused (check IsYUV if used)            (0 << 0) */
-#define IMG_BFF_ENCODING_VUCrCb              (1 << 0)
-/*   Unused                                  (2 << 0) */
-#define IMG_BFF_ENCODING_UVCbCr              (3 << 0)
-
-/* Whether the buffer should be cleared to zero from userspace, or via the
- * PowerVR services at import time. This is deprecated functionality as most
- * platforms use dma-buf or ion now, and for security reasons these allocators
- * should never return uncleared memory.
- */
-#define IMG_BFF_CPU_CLEAR                    (1 << 2)
-
-/* Deprecated, do not use */
-#define IMG_BFF_DONT_GPU_CLEAR               (1 << 3)
-
-/* Deprecated, do not use */
-#define IMG_BFF_PARTIAL_ALLOC                (1 << 4)
-
-/* Guarantee that GPU framebuffer compression is never used for buffers in
- * this format, even if the format is supported by the compressor. This might
- * be useful if the buffer is being fed to hardware blocks that cannot handle
- * the framebuffer compression encoding, and the existing HAL overrides are
- * not sufficiently expressive.
- */
-#define IMG_BFF_NEVER_COMPRESS               (1 << 5)
-
-/* Indicates that the buffer should be mapped into the GPU 'tiling range'
- * heaps, rather than the 'linear' general heap. This implies that the raw
- * buffer data is tiled in physical memory. (The GPU BIF will de-tile it, so
- * this is distinct from 'tiled texture' support.) The graphics HAL will
- * select the correct 'tiling range' based on the buffer dimensions.
- */
-#define IMG_BFF_BIFTILED                     (1 << 6)
-
-/* YUV subsampling encoding of buffer data.
- * Many YUV formats have less chroma information than luma information. If
- * this is not the case, use SUBSAMPLING_4_4_4. If each of the U and V channel
- * data are 1/4 the size of the Y channel data, use SUBSAMPLING_4_2_0.
- * Otherwise, use SUBSAMPLING_4_2_2.
- */
-#define IMG_BFF_YUV_SUBSAMPLING_MASK         (3 << 7)
-#define IMG_BFF_YUV_SUBSAMPLING_4_2_0        (0 << 7)
-/* Unused: 4:1:1, 4:2:1, 4:1:0, 3:1:1?       (1 << 7) */
-#define IMG_BFF_YUV_SUBSAMPLING_4_2_2        (2 << 7)
-#define IMG_BFF_YUV_SUBSAMPLING_4_4_4        (3 << 7)
-
-/* Backwards compatibility */
-#define IMG_BFF_YUV             IMG_BFF_ENCODING_VUCrCb
-#define IMG_BFF_UVCbCrORDERING  IMG_BFF_ENCODING_UVCbCr
-
-/* Keep this in sync with SGX */
-typedef struct IMG_buffer_format_public_t
-{
-	/* Buffer formats are returned as a linked list */
-	struct IMG_buffer_format_public_t *psNext;
-
-	/* HAL_PIXEL_FORMAT_... enumerant */
-	int iHalPixelFormat;
-
-	/* IMG_PIXFMT_... enumerant */
-	int iIMGPixelFormat;
-
-	/* Friendly name for format */
-	const char *const szName;
-
-	/* Bits (not bytes) per pixel */
-	unsigned int uiBpp;
-
-	/* Supported HW usage bits. If this is GRALLOC_USAGE_HW_MASK, all usages
-	 * are supported. Used for HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED.
-	 */
-	int iSupportedUsage;
-
-	/* Allocation description flags */
-	unsigned int uiFlags;
-}
-IMG_buffer_format_public_t;
-
-typedef struct
-{
-	enum
-	{
-		IMG_BUFFER_HANDLE_TYPE_ION    = 0,
-		IMG_BUFFER_HANDLE_TYPE_DMABUF = 1,
-	}
-	eType;
-
-	union
-	{
-		ion_user_handle_t aiIonUserHandle[MAX_SUB_ALLOCS];
-		int aiDmaBufShareFd[MAX_SUB_ALLOCS];
-	};
-}
-IMG_buffer_handle_t;
-
-/* Public extensions, common to v0 and v1 HALs */
-
-#define GRALLOC_GET_BUFFER_FORMAT_IMG     1
-#define GRALLOC_GET_BUFFER_FORMATS_IMG    2
-#define GRALLOC_BLIT_HANDLE_TO_HANDLE_IMG 3
-#define GRALLOC_BLIT_STAMP_TO_HANDLE_IMG  4
-#define GRALLOC_SET_DATA_SPACE_IMG        5
-#define GRALLOC_GET_ION_CLIENT_IMG        6
-#define GRALLOC_GET_BUFFER_HANDLE_IMG     7
-
-#if !defined(PVR_ANDROID_HAS_SET_BUFFERS_DATASPACE)
-
-enum
-{
-	HAL_DATASPACE_SRGB_LINEAR         = 0x200,
-	HAL_DATASPACE_SRGB                = 0x201,
-	HAL_DATASPACE_BT601_625           = 0x102,
-	HAL_DATASPACE_BT601_525           = 0x103,
-	HAL_DATASPACE_BT709               = 0x104,
-};
-
-#endif /* !defined(PVR_ANDROID_HAS_SET_BUFFERS_DATASPACE) */
-
-#if !defined(PVR_ANDROID_HAS_SET_BUFFERS_DATASPACE_2)
-
-enum
-{
-	HAL_DATASPACE_STANDARD_SHIFT      = 16,
-	HAL_DATASPACE_TRANSFER_SHIFT      = 22,
-	HAL_DATASPACE_RANGE_SHIFT         = 27,
-
-	HAL_DATASPACE_STANDARD_BT2020     = 6 << HAL_DATASPACE_STANDARD_SHIFT,
-
-	HAL_DATASPACE_TRANSFER_SMPTE_170M = 3 << HAL_DATASPACE_TRANSFER_SHIFT,
-
-	HAL_DATASPACE_RANGE_MASK          = 7 << HAL_DATASPACE_RANGE_SHIFT,
-	HAL_DATASPACE_RANGE_FULL          = 1 << HAL_DATASPACE_RANGE_SHIFT,
-	HAL_DATASPACE_RANGE_LIMITED       = 2 << HAL_DATASPACE_RANGE_SHIFT,
-};
-
-#endif /* !defined(PVR_ANDROID_HAS_SET_BUFFERS_DATASPACE_2) */
-
-/* We want to add BT.2020 and 'full range' versions of the existing dataspace
- * enums. These are extensions, so define a new android_dataspace_ext_t.
- * If you only have an android_dataspace_t, you can simply cast it.
- */
-typedef enum
-{
-	/* Identical to upstream enum android_dataspace */
-	HAL_DATASPACE_EXT_UNKNOWN         = HAL_DATASPACE_UNKNOWN,
-	HAL_DATASPACE_EXT_SRGB_LINEAR     = HAL_DATASPACE_SRGB_LINEAR,
-	HAL_DATASPACE_EXT_SRGB            = HAL_DATASPACE_SRGB,
-	HAL_DATASPACE_EXT_BT601_625       = HAL_DATASPACE_BT601_625,
-	HAL_DATASPACE_EXT_BT601_525       = HAL_DATASPACE_BT601_525,
-	HAL_DATASPACE_EXT_BT709           = HAL_DATASPACE_BT709,
-
-	/* IMG extension for BT.2020 support */
-	HAL_DATASPACE_EXT_BT2020          = HAL_DATASPACE_STANDARD_BT2020     |
-	                                    HAL_DATASPACE_TRANSFER_SMPTE_170M |
-	                                    HAL_DATASPACE_RANGE_LIMITED,
-
-	/* IMG extensions for 'full range' versions of previous enums */
-	HAL_DATASPACE_EXT_BT601_625_FULL  = ( HAL_DATASPACE_BT601_625 &
-	                                     ~HAL_DATASPACE_RANGE_MASK) |
-	                                    HAL_DATASPACE_RANGE_FULL,
-	HAL_DATASPACE_EXT_BT601_525_FULL  = ( HAL_DATASPACE_BT601_525 &
-	                                     ~HAL_DATASPACE_RANGE_MASK) |
-	                                    HAL_DATASPACE_RANGE_FULL,
-	HAL_DATASPACE_EXT_BT709_FULL      = ( HAL_DATASPACE_BT709 &
-	                                     ~HAL_DATASPACE_RANGE_MASK) |
-	                                    HAL_DATASPACE_RANGE_FULL,
-	HAL_DATASPACE_EXT_BT2020_FULL     = ( HAL_DATASPACE_EXT_BT2020 &
-	                                     ~HAL_DATASPACE_RANGE_MASK) |
-	                                    HAL_DATASPACE_RANGE_FULL,
-}
-android_dataspace_ext_t;
-
-#endif /* IMG_GRALLOC_COMMON_PUBLIC_H */
diff --git a/merrifield/include/pvr/hal/img_gralloc_public.h b/merrifield/include/pvr/hal/img_gralloc_public.h
new file mode 100644
index 0000000..1b6ca50
--- /dev/null
+++ b/merrifield/include/pvr/hal/img_gralloc_public.h
@@ -0,0 +1,302 @@
+/* Copyright (c) Imagination Technologies Ltd.
+ *
+ * The contents of this file are subject to the MIT license as set out below.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#ifndef HAL_PUBLIC_H
+#define HAL_PUBLIC_H
+
+/* Authors of third party hardware composer (HWC) modules will need to include
+ * this header to access functionality in the gralloc HAL.
+ */
+
+#include <hardware/gralloc.h>
+
+#define ALIGN(x,a)	(((x) + (a) - 1L) & ~((a) - 1L))
+#define HW_ALIGN	32
+
+/* Use bits [0-3] of "vendor format" bits as real format. Customers should
+ * use *only* the unassigned bits below for custom pixel formats, YUV or RGB.
+ *
+ * If there are no bits set in this part of the field, or other bits are set
+ * in the format outside of the "vendor format" mask, the non-extension format
+ * is used instead. Reserve 0 for this purpose.
+ */
+
+#define HAL_PIXEL_FORMAT_VENDOR_EXT(fmt) (0x100 | (fmt & 0xF))
+
+/*      Reserved ** DO NOT USE **    HAL_PIXEL_FORMAT_VENDOR_EXT(0) */
+#define HAL_PIXEL_FORMAT_BGRX_8888   HAL_PIXEL_FORMAT_VENDOR_EXT(1)
+#define HAL_PIXEL_FORMAT_sBGR_A_8888 HAL_PIXEL_FORMAT_VENDOR_EXT(2)
+#define HAL_PIXEL_FORMAT_sBGR_X_8888 HAL_PIXEL_FORMAT_VENDOR_EXT(3)
+/*      HAL_PIXEL_FORMAT_RGB_565     HAL_PIXEL_FORMAT_VENDOR_EXT(4) */
+/*      HAL_PIXEL_FORMAT_BGRA_8888   HAL_PIXEL_FORMAT_VENDOR_EXT(5) */
+#define HAL_PIXEL_FORMAT_NV12        HAL_PIXEL_FORMAT_VENDOR_EXT(6)
+/*      Free for customer use        HAL_PIXEL_FORMAT_VENDOR_EXT(7) */
+/*      Free for customer use        HAL_PIXEL_FORMAT_VENDOR_EXT(8) */
+/*      Free for customer use        HAL_PIXEL_FORMAT_VENDOR_EXT(9) */
+/*      Free for customer use        HAL_PIXEL_FORMAT_VENDOR_EXT(10) */
+/*      Free for customer use        HAL_PIXEL_FORMAT_VENDOR_EXT(11) */
+/*      Free for customer use        HAL_PIXEL_FORMAT_VENDOR_EXT(12) */
+/*      Free for customer use        HAL_PIXEL_FORMAT_VENDOR_EXT(13) */
+/*      Free for customer use        HAL_PIXEL_FORMAT_VENDOR_EXT(14) */
+/*      Free for customer use        HAL_PIXEL_FORMAT_VENDOR_EXT(15) */
+
+/* One of the below compression modes is OR'ed into bits [4-6] of the 8 bit
+ * "vendor format" field. If no bits are set in this "compression mask", the
+ * normal memory format for the pixel format is used. Otherwise the pixel
+ * data will be compressed in memory with the Rogue framebuffer compressor.
+ */
+
+#define HAL_FB_COMPRESSION_NONE                0
+#define HAL_FB_COMPRESSION_DIRECT_8x8          1
+#define HAL_FB_COMPRESSION_DIRECT_16x4         2
+#define HAL_FB_COMPRESSION_DIRECT_32x2         3
+#define HAL_FB_COMPRESSION_INDIRECT_8x8        4
+#define HAL_FB_COMPRESSION_INDIRECT_16x4       5
+#define HAL_FB_COMPRESSION_INDIRECT_4TILE_8x8  6
+#define HAL_FB_COMPRESSION_INDIRECT_4TILE_16x4 7
+
+/* The memory layout is OR'ed into bit 7 (top bit) of the 8 bit "vendor
+ * format" field. Only STRIDED and TWIDDLED are supported; there is no space
+ * for PAGETILED.
+ */
+#define HAL_FB_MEMLAYOUT_STRIDED               0
+#define HAL_FB_MEMLAYOUT_TWIDDLED              1
+
+/* This can be tuned down as appropriate for the SOC.
+ *
+ * IMG formats are usually a single sub-alloc.
+ * Some OEM video formats are two sub-allocs (Y, UV planes).
+ * Future OEM video formats might be three sub-allocs (Y, U, V planes).
+ */
+#define MAX_SUB_ALLOCS (3)
+
+typedef struct
+{
+	native_handle_t base;
+
+	/* These fields can be sent cross process. They are also valid
+	 * to duplicate within the same process.
+	 *
+	 * A table is stored within psPrivateData on gralloc_module_t (this
+	 * is obviously per-process) which maps stamps to a mapped
+	 * PVRSRV_MEMDESC in that process. Each map entry has a lock
+	 * count associated with it, satisfying the requirements of the
+	 * Android API. This also prevents us from leaking maps/allocations.
+	 *
+	 * This table has entries inserted either by alloc()
+	 * (alloc_device_t) or map() (gralloc_module_t). Entries are removed
+	 * by free() (alloc_device_t) and unmap() (gralloc_module_t).
+	 */
+
+#define IMG_NATIVE_HANDLE_NUMFDS (MAX_SUB_ALLOCS)
+	/* The `fd' field is used to "export" a meminfo to another process.
+	 * Therefore, it is allocated by alloc_device_t, and consumed by
+	 * gralloc_module_t.
+	 */
+	int fd[IMG_NATIVE_HANDLE_NUMFDS];
+
+	/* This define should represent the number of packed 'int's required to
+	 * represent the fields following it. If you add a data type that is
+	 * 64-bit, for example using 'unsigned long long', you should write that
+	 * as "sizeof(unsigned long long) / sizeof(int)". Please keep the order
+	 * of the additions the same as the defined field order.
+	 */
+#define IMG_NATIVE_HANDLE_NUMINTS \
+	(sizeof(unsigned long long) / sizeof(int) + \
+	 6 + MAX_SUB_ALLOCS + MAX_SUB_ALLOCS + \
+	 sizeof(unsigned long long) / sizeof(int) * MAX_SUB_ALLOCS + \
+	 1)
+	/* A KERNEL unique identifier for any exported kernel meminfo. Each
+	 * exported kernel meminfo will have a unique stamp, but note that in
+	 * userspace, several meminfos across multiple processes could have
+	 * the same stamp. As the native_handle can be dup(2)'d, there could be
+	 * multiple handles with the same stamp but different file descriptors.
+	 */
+	unsigned long long ui64Stamp;
+
+	/* This is used for buffer usage validation */
+	int usage;
+
+	/* In order to do efficient cache flushes we need the buffer dimensions,
+	 * format and bits per pixel. There are ANativeWindow queries for the
+	 * width, height and format, but the graphics HAL might have remapped the
+	 * request to different values at allocation time. These are the 'true'
+	 * values of the buffer allocation.
+	 */
+	int iWidth;
+	int iHeight;
+	int iFormat;
+	unsigned int uiBpp;
+
+	/* Planes are not the same as the `fd' suballocs. A multi-planar YUV
+	 * allocation has different planes (interleaved = 1, semi-planar = 2,
+	 * fully-planar = 3) but might be spread across 1, 2 or 3 independent
+	 * memory allocations (or not).
+	 */
+	int iPlanes;
+
+	/* For multi-planar allocations, there will be multiple hstrides */
+	int aiStride[MAX_SUB_ALLOCS];
+
+	/* For multi-planar allocations, there will be multiple vstrides */
+	int aiVStride[MAX_SUB_ALLOCS];
+
+	/* These byte offsets are reconciled with the number of sub-allocs used
+	 * for a multi-planar allocation. If there is a 1:1 mapping between the
+	 * number of planes and the number of sub-allocs, these will all be zero.
+	 *
+	 * Otherwise, normally the zeroth entry will be zero, and the latter
+	 * entries will be non-zero.
+	 */
+	unsigned long long aulPlaneOffset[MAX_SUB_ALLOCS];
+
+	/* This records the number of MAX_SUB_ALLOCS fds actually used by the
+	 * buffer allocation. File descriptors up to fd[iNumSubAllocs - 1] are
+	 * guaranteed to be valid. (This does not have any bearing on the aiStride,
+	 * aiVStride or aulPlaneOffset fields, as `iPlanes' of those arrays should
+	 * be initialized, not `iNumSubAllocs'.)
+	 */
+	int iNumSubAllocs;
+}
+__attribute__((aligned(sizeof(int)),packed)) IMG_native_handle_t;
+
+typedef struct
+{
+	int l, t, w, h;
+}
+IMG_write_lock_rect_t;
+
+#define IMG_BFF_YUV					(1 << 0)
+#define IMG_BFF_UVCbCrORDERING		(1 << 1)
+#define IMG_BFF_CPU_CLEAR			(1 << 2)
+#define IMG_BFF_DONT_GPU_CLEAR		(1 << 3)
+#define IMG_BFF_PARTIAL_ALLOC		(1 << 4)
+#define IMG_BFF_NEVER_COMPRESS		(1 << 5)
+
+/* Keep this in sync with SGX */
+typedef struct IMG_buffer_format_public_t
+{
+	/* Buffer formats are returned as a linked list */
+	struct IMG_buffer_format_public_t *psNext;
+
+	/* HAL_PIXEL_FORMAT_... enumerant */
+	int iHalPixelFormat;
+
+	/* IMG_PIXFMT_... enumerant */
+	int iIMGPixelFormat;
+
+	/* Friendly name for format */
+	const char *const szName;
+
+	/* Bits (not bytes) per pixel */
+	unsigned int uiBpp;
+
+	/* Supported HW usage bits. If this is GRALLOC_USAGE_HW_MASK, all usages
+	 * are supported. Used for HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED.
+	 */
+	int iSupportedUsage;
+
+	/* Allocation description flags */
+	unsigned int uiFlags;
+}
+IMG_buffer_format_public_t;
+
+/* NOTE: This interface is deprecated. Use module->perform() instead. */
+typedef struct IMG_gralloc_module_public_t
+{
+	gralloc_module_t base;
+
+	/* Gets the head of the linked list of all registered formats */
+	const IMG_buffer_format_public_t *(*GetBufferFormats)(void);
+
+	/* Custom-blit components in lieu of overlay hardware */
+	int (*Blit)(struct IMG_gralloc_module_public_t const *module,
+				 buffer_handle_t src, buffer_handle_t dest,
+				 int w, int h, int x, int y, int transform,
+				 int iInputFenceFd, int *piOutputFenceFd);
+
+	int (*Blit3)(struct IMG_gralloc_module_public_t const *module,
+				 unsigned long long ui64SrcStamp, int iSrcWidth,
+				 int iSrcHeight, int iSrcFormat, int iSrcStrideInPixels,
+				 int eSrcRotation, buffer_handle_t dest, int eDestRotation,
+				 int iInputFenceFd, int *piOutputFenceFd);
+
+	/* Walk the above list and return only the specified format */
+	const IMG_buffer_format_public_t *(*GetBufferFormat)(int iFormat);
+}
+IMG_gralloc_module_public_t;
+
+/* Helpers for using the non-type-safe perform() extension functions. Use
+ * these helpers instead of calling perform() directly in your application.
+ */
+
+#define GRALLOC_MODULE_GET_BUFFER_FORMAT_IMG     1
+#define GRALLOC_MODULE_GET_BUFFER_FORMATS_IMG    2
+#define GRALLOC_MODULE_BLIT_HANDLE_TO_HANDLE_IMG 3
+#define GRALLOC_MODULE_BLIT_STAMP_TO_HANDLE_IMG  4
+
+static inline int
+gralloc_module_get_buffer_format_img(const gralloc_module_t *module,
+									 int format,
+									 const IMG_buffer_format_public_t **v)
+{
+	return module->perform(module, GRALLOC_MODULE_GET_BUFFER_FORMAT_IMG,
+						   format, v);
+}
+
+static inline int
+gralloc_module_get_buffer_formats_img(const gralloc_module_t *module,
+									  const IMG_buffer_format_public_t **v)
+{
+	return module->perform(module, GRALLOC_MODULE_GET_BUFFER_FORMATS_IMG, v);
+}
+
+static inline int
+gralloc_module_blit_handle_to_handle_img(const gralloc_module_t *module,
+										 buffer_handle_t src,
+										 buffer_handle_t dest,
+										 int w, int h, int x, int y,
+										 int transform, int input_fence,
+										 int *output_fence)
+{
+	return module->perform(module, GRALLOC_MODULE_BLIT_HANDLE_TO_HANDLE_IMG,
+						   src, dest, w, h, x, y, transform, input_fence,
+						   output_fence);
+}
+
+static inline int
+gralloc_module_blit_stamp_to_handle(const gralloc_module_t *module,
+									unsigned long long src_stamp,
+									int src_width, int src_height,
+									int src_format, int src_stride_in_pixels,
+									int src_rotation, buffer_handle_t dest,
+									int dest_rotation, int input_fence,
+									int *output_fence)
+{
+	return module->perform(module, GRALLOC_MODULE_BLIT_STAMP_TO_HANDLE_IMG,
+						   src_stamp, src_width, src_height, src_format,
+						   src_stride_in_pixels, src_rotation, dest,
+						   dest_rotation, input_fence, output_fence);
+}
+
+#endif /* HAL_PUBLIC_H */
diff --git a/merrifield/ips/tangier/TngDisplayContext.cpp b/merrifield/ips/tangier/TngDisplayContext.cpp
index 3f4fd5e..f78f20e 100644
--- a/merrifield/ips/tangier/TngDisplayContext.cpp
+++ b/merrifield/ips/tangier/TngDisplayContext.cpp
@@ -43,15 +43,15 @@
     CTRACE();
 
     // open frame buffer device
-    const hw_device_t *gralloc;
-    int err = gralloc_open_img(&gralloc);
+    gralloc_module_t const* module;
+    int err = hw_get_module(GRALLOC_HARDWARE_MODULE_ID, (hw_module_t const**)&module);
     if (err) {
         ETRACE("failed to load gralloc module, error = %d", err);
         return false;
     }
 
     // init IMG display device
-    err = gralloc_get_display_device_img(gralloc, (void **)&mIMGDisplayDevice);
+    err = module->perform(module, GRALLOC_MODULE_GET_DISPLAY_DEVICE_IMG, (void **)&mIMGDisplayDevice);
     if (err) {
         ETRACE("failed to get display device, error = %d", err);
         return false;
diff --git a/merrifield/ips/tangier/TngGrallocBufferMapper.cpp b/merrifield/ips/tangier/TngGrallocBufferMapper.cpp
index 4f7eb75..bee4f5e 100644
--- a/merrifield/ips/tangier/TngGrallocBufferMapper.cpp
+++ b/merrifield/ips/tangier/TngGrallocBufferMapper.cpp
@@ -22,10 +22,10 @@
 namespace android {
 namespace intel {
 
-TngGrallocBufferMapper::TngGrallocBufferMapper(const hw_device_t& gralloc,
-                                               DataBuffer& buffer)
+TngGrallocBufferMapper::TngGrallocBufferMapper(gralloc_module_t const& module,
+                                                    DataBuffer& buffer)
     : GrallocBufferMapperBase(buffer),
-      mGralloc(gralloc),
+      mGrallocModule(module),
       mBufferObject(0)
 {
     CTRACE();
@@ -122,7 +122,8 @@
 
     CTRACE();
     // get virtual address
-    err = gralloc_get_buffer_cpu_addresses_img(&mGralloc,
+    err = mGrallocModule.perform(&mGrallocModule,
+                                  GRALLOC_MODULE_GET_BUFFER_CPU_ADDRESSES_IMG,
                                   (buffer_handle_t)mClonedHandle,
                                   vaddr,
                                   size);
@@ -161,7 +162,8 @@
         }
     }
 
-    err = gralloc_put_buffer_cpu_addresses_img(&mGralloc,
+    err = mGrallocModule.perform(&mGrallocModule,
+                                  GRALLOC_MODULE_PUT_BUFFER_CPU_ADDRESSES_IMG,
                                   (buffer_handle_t)mClonedHandle);
     return false;
 }
@@ -182,7 +184,8 @@
         mSize[i] = 0;
     }
 
-    err = gralloc_put_buffer_cpu_addresses_img(&mGralloc,
+    err = mGrallocModule.perform(&mGrallocModule,
+                                  GRALLOC_MODULE_PUT_BUFFER_CPU_ADDRESSES_IMG,
                                   (buffer_handle_t)mClonedHandle);
     if (err) {
         ETRACE("failed to unmap. err = %d", err);
@@ -236,7 +239,8 @@
     }
 
     // get virtual address
-    err = gralloc_get_buffer_cpu_addresses_img(&mGralloc,
+    err = mGrallocModule.perform(&mGrallocModule,
+                                  GRALLOC_MODULE_GET_BUFFER_CPU_ADDRESSES_IMG,
                                   (buffer_handle_t)mClonedHandle,
                                   vaddr,
                                   size);
@@ -250,7 +254,8 @@
 
 void TngGrallocBufferMapper::putFbHandle()
 {
-    int err = gralloc_put_buffer_cpu_addresses_img(&mGralloc,
+    int err = mGrallocModule.perform(&mGrallocModule,
+                                  GRALLOC_MODULE_PUT_BUFFER_CPU_ADDRESSES_IMG,
                                   (buffer_handle_t)mClonedHandle);
     if (err) {
         ETRACE("failed to unmap. err = %d", err);
diff --git a/merrifield/ips/tangier/TngGrallocBufferMapper.h b/merrifield/ips/tangier/TngGrallocBufferMapper.h
index 1b27ae1..17f34c2 100644
--- a/merrifield/ips/tangier/TngGrallocBufferMapper.h
+++ b/merrifield/ips/tangier/TngGrallocBufferMapper.h
@@ -26,7 +26,8 @@
 
 class TngGrallocBufferMapper : public GrallocBufferMapperBase {
 public:
-    TngGrallocBufferMapper(const hw_device_t& gralloc, DataBuffer& buffer);
+    TngGrallocBufferMapper(gralloc_module_t const& module,
+                               DataBuffer& buffer);
     virtual ~TngGrallocBufferMapper();
 public:
     bool map();
@@ -40,7 +41,7 @@
     bool mapKhandle();
 
 private:
-    const hw_device_t& mGralloc;
+    gralloc_module_t const& mGrallocModule;
     void* mBufferObject;
 	native_handle_t* mClonedHandle;
 };
diff --git a/merrifield/platforms/merrifield/Android.mk b/merrifield/platforms/merrifield/Android.mk
index 9efd7fd..81086b7 100644
--- a/merrifield/platforms/merrifield/Android.mk
+++ b/merrifield/platforms/merrifield/Android.mk
@@ -131,10 +131,8 @@
 endif
 
 LOCAL_COPY_HEADERS := \
-    ../../include/pvr/hal/img_gralloc.h \
-    ../../include/pvr/hal/img_gralloc1.h \
-    ../../include/pvr/hal/img_gralloc_common_public.h \
-    ../../include/pvr/hal/hal_public.h
+    ../../include/pvr/hal/hal_public.h \
+    ../../include/pvr/hal/img_gralloc_public.h
 LOCAL_COPY_HEADERS_TO := pvr/hal
 
 ifneq ($(TARGET_BUILD_VARIANT),user)
diff --git a/merrifield/platforms/merrifield/PlatfBufferManager.cpp b/merrifield/platforms/merrifield/PlatfBufferManager.cpp
index fb9ddcd..881f79d 100644
--- a/merrifield/platforms/merrifield/PlatfBufferManager.cpp
+++ b/merrifield/platforms/merrifield/PlatfBufferManager.cpp
@@ -50,7 +50,7 @@
 
 BufferMapper* PlatfBufferManager::createBufferMapper(DataBuffer& buffer)
 {
-    return new TngGrallocBufferMapper(*mGralloc, buffer);
+    return new TngGrallocBufferMapper(*mGrallocModule, buffer);
 }
 
 bool PlatfBufferManager::blit(buffer_handle_t srcHandle, buffer_handle_t destHandle,
@@ -59,7 +59,8 @@
 {
     int fenceFd;
 
-    if (gralloc_blit_handle_to_handle_img(mGralloc,
+    if (mGrallocModule->perform(mGrallocModule,
+                                GRALLOC_MODULE_BLIT_HANDLE_TO_HANDLE_IMG,
                                 srcHandle,
                                 destHandle,
                                 destRect.w, destRect.h, destRect.x,
diff --git a/merrifield/platforms/merrifield_plus/Android.mk b/merrifield/platforms/merrifield_plus/Android.mk
index dae5335..3f8b886 100644
--- a/merrifield/platforms/merrifield_plus/Android.mk
+++ b/merrifield/platforms/merrifield_plus/Android.mk
@@ -130,10 +130,8 @@
 endif
 
 LOCAL_COPY_HEADERS := \
-    ../../include/pvr/hal/img_gralloc.h \
-    ../../include/pvr/hal/img_gralloc1.h \
-    ../../include/pvr/hal/img_gralloc_common_public.h \
-    ../../include/pvr/hal/hal_public.h
+    ../../include/pvr/hal/hal_public.h \
+    ../../include/pvr/hal/img_gralloc_public.h
 LOCAL_COPY_HEADERS_TO := pvr/hal
 
 ifneq ($(TARGET_BUILD_VARIANT),user)
diff --git a/merrifield/platforms/merrifield_plus/PlatfBufferManager.cpp b/merrifield/platforms/merrifield_plus/PlatfBufferManager.cpp
index fb9ddcd..881f79d 100644
--- a/merrifield/platforms/merrifield_plus/PlatfBufferManager.cpp
+++ b/merrifield/platforms/merrifield_plus/PlatfBufferManager.cpp
@@ -50,7 +50,7 @@
 
 BufferMapper* PlatfBufferManager::createBufferMapper(DataBuffer& buffer)
 {
-    return new TngGrallocBufferMapper(*mGralloc, buffer);
+    return new TngGrallocBufferMapper(*mGrallocModule, buffer);
 }
 
 bool PlatfBufferManager::blit(buffer_handle_t srcHandle, buffer_handle_t destHandle,
@@ -59,7 +59,8 @@
 {
     int fenceFd;
 
-    if (gralloc_blit_handle_to_handle_img(mGralloc,
+    if (mGrallocModule->perform(mGrallocModule,
+                                GRALLOC_MODULE_BLIT_HANDLE_TO_HANDLE_IMG,
                                 srcHandle,
                                 destHandle,
                                 destRect.w, destRect.h, destRect.x,
diff --git a/moorefield_hdmi/Android.mk b/moorefield_hdmi/Android.mk
index 8903585..fe6caa1 100644
--- a/moorefield_hdmi/Android.mk
+++ b/moorefield_hdmi/Android.mk
@@ -101,10 +101,8 @@
 endif
 
 LOCAL_COPY_HEADERS := \
- include/pvr/hal/img_gralloc.h \
- include/pvr/hal/img_gralloc1.h \
- include/pvr/hal/img_gralloc_common_public.h \
- include/pvr/hal/hal_public.h
+ include/pvr/hal/hal_public.h \
+ include/pvr/hal/img_gralloc_public.h
 LOCAL_COPY_HEADERS_TO := pvr/hal
 
 include $(BUILD_SHARED_LIBRARY)
diff --git a/moorefield_hdmi/common/buffers/BufferManager.cpp b/moorefield_hdmi/common/buffers/BufferManager.cpp
index 3ebda04..a426c5a 100644
--- a/moorefield_hdmi/common/buffers/BufferManager.cpp
+++ b/moorefield_hdmi/common/buffers/BufferManager.cpp
@@ -17,14 +17,14 @@
 #include <common/utils/HwcTrace.h>
 #include <hardware/hwcomposer.h>
 #include <BufferManager.h>
-#include <hal_public.h>
 #include <DrmConfig.h>
 
 namespace android {
 namespace intel {
 
 BufferManager::BufferManager()
-    : mGralloc(NULL),
+    : mGrallocModule(NULL),
+      mAllocDev(NULL),
       mFrameBuffers(),
       mBufferPool(NULL),
       mDataBuffer(NULL),
@@ -56,9 +56,16 @@
     }
 
     // init gralloc module
-    if (gralloc_open_img(&mGralloc)) {
+    hw_module_t const* module;
+    if (hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &module)) {
         DEINIT_AND_RETURN_FALSE("failed to get gralloc module");
     }
+    mGrallocModule = (gralloc_module_t const*)module;
+
+    gralloc_open(module, &mAllocDev);
+    if (!mAllocDev) {
+        WLOGTRACE("failed to open alloc device");
+    }
 
     // create a dummy data buffer
     mDataBuffer = createDataBuffer(0);
@@ -93,9 +100,9 @@
     }
     mFrameBuffers.clear();
 
-    if (mGralloc) {
-        gralloc_close_img(mGralloc);
-        mGralloc = NULL;
+    if (mAllocDev) {
+        gralloc_close(mAllocDev);
+        mAllocDev = NULL;
     }
 
     if (mDataBuffer) {
@@ -215,7 +222,7 @@
 {
     RETURN_NULL_IF_NOT_INIT();
 
-    if (!mGralloc) {
+    if (!mAllocDev) {
         WLOGTRACE("Alloc device is not available");
         return 0;
     }
@@ -227,8 +234,8 @@
 
     ILOGTRACE("size of frame buffer to create: %dx%d", width, height);
     uint32_t handle = 0;
-    status_t err = gralloc_device_alloc_img(
-            mGralloc,
+    status_t err  = mAllocDev->alloc(
+            mAllocDev,
             width,
             height,
             DrmConfig::getFrameBufferFormat(),
@@ -275,7 +282,7 @@
     if (mapper) {
         delete mapper;
     }
-    gralloc_device_free_img(mGralloc, (buffer_handle_t)handle);
+    mAllocDev->free(mAllocDev, (buffer_handle_t)handle);
     return 0;
 }
 
@@ -283,7 +290,7 @@
 {
     RETURN_VOID_IF_NOT_INIT();
 
-    if (!mGralloc) {
+    if (!mAllocDev) {
         WLOGTRACE("Alloc device is not available");
         return;
     }
@@ -299,14 +306,14 @@
     mapper->putFbHandle();
     delete mapper;
     mFrameBuffers.removeItem(fbHandle);
-    gralloc_device_free_img(mGralloc, (buffer_handle_t)handle);
+    mAllocDev->free(mAllocDev, (buffer_handle_t)handle);
 }
 
 uint32_t BufferManager::allocGrallocBuffer(uint32_t width, uint32_t height, uint32_t format, uint32_t usage)
 {
     RETURN_NULL_IF_NOT_INIT();
 
-    if (!mGralloc) {
+    if (!mAllocDev) {
         WLOGTRACE("Alloc device is not available");
         return 0;
     }
@@ -319,8 +326,8 @@
     ILOGTRACE("size of graphic buffer to create: %dx%d", width, height);
     uint32_t handle = 0;
     int stride;
-    status_t err = gralloc_device_alloc_img(
-                mGralloc,
+    status_t err  = mAllocDev->alloc(
+                mAllocDev,
                 width,
                 height,
                 format,
@@ -338,13 +345,13 @@
 void BufferManager::freeGrallocBuffer(uint32_t handle)
 {
     RETURN_VOID_IF_NOT_INIT();
-    if (!mGralloc) {
+    if (!mAllocDev) {
         WLOGTRACE("Alloc device is not available");
         return;
     }
 
     if (handle)
-        gralloc_device_free_img(mGralloc, (buffer_handle_t)handle);
+        mAllocDev->free(mAllocDev, (buffer_handle_t)handle);
 }
 
 } // namespace intel
diff --git a/moorefield_hdmi/include/BufferManager.h b/moorefield_hdmi/include/BufferManager.h
index e3ad7ae..0897310 100755
--- a/moorefield_hdmi/include/BufferManager.h
+++ b/moorefield_hdmi/include/BufferManager.h
@@ -65,7 +65,7 @@
     virtual DataBuffer* createDataBuffer(uint32_t handle) = 0;
     virtual BufferMapper* createBufferMapper(DataBuffer& buffer) = 0;
 
-    const hw_device_t *mGralloc;
+    gralloc_module_t const* mGrallocModule;
 private:
     enum {
         // make the buffer pool large enough
diff --git a/moorefield_hdmi/include/pvr/hal/hal_public.h b/moorefield_hdmi/include/pvr/hal/hal_public.h
index 19910c1..04939a0 100644
--- a/moorefield_hdmi/include/pvr/hal/hal_public.h
+++ b/moorefield_hdmi/include/pvr/hal/hal_public.h
@@ -21,195 +21,29 @@
  * THE SOFTWARE.
  */
 
-#ifndef HAL_PUBLIC_H
-#define HAL_PUBLIC_H
+#ifndef __HAL_PUBLIC_H
+#define __HAL_PUBLIC_H
 
-#define PVR_ANDROID_HAS_SET_BUFFERS_DATASPACE
-#define PVR_ANDROID_HAS_SET_BUFFERS_DATASPACE_2
+#define PVR_ANDROID_NATIVE_WINDOW_HAS_SYNC
 
-#include "img_gralloc_common_public.h"
+#include "img_gralloc_public.h"
 
-/* Extension pixel formats used by Intel components */
+#undef HAL_PIXEL_FORMAT_NV12
 
-#undef  HAL_PIXEL_FORMAT_NV12
+#define HAL_PIXEL_FORMAT_UYVY         0x107
+#define HAL_PIXEL_FORMAT_INTEL_YV12   0x108
+#define HAL_PIXEL_FORMAT_INTEL_ZSL    0x109
+#define HAL_PIXEL_FORMAT_NV12         0x3231564E
+#define HAL_PIXEL_FORMAT_NV21         0x3132564E
+#define HAL_PIXEL_FORMAT_I420         0x30323449
+#define HAL_PIXEL_FORMAT_YUY2         0x32595559
+#define HAL_PIXEL_FORMAT_NV12_VED     0x7FA00E00
+#define HAL_PIXEL_FORMAT_NV12_VEDT    0x7FA00F00
 
-#define HAL_PIXEL_FORMAT_UYVY                 0x107
-#define HAL_PIXEL_FORMAT_INTEL_YV12           0x108
-#define HAL_PIXEL_FORMAT_INTEL_ZSL            0x109
-#define HAL_PIXEL_FORMAT_NV12                 0x3231564E
-#define HAL_PIXEL_FORMAT_NV21                 0x3132564E
-#define HAL_PIXEL_FORMAT_I420                 0x30323449
-#define HAL_PIXEL_FORMAT_YUY2                 0x32595559
-#define HAL_PIXEL_FORMAT_NV12_VED             0x7FA00E00
-#define HAL_PIXEL_FORMAT_NV12_VEDT            0x7FA00F00
+#define GRALLOC_MODULE_GET_BUFFER_CPU_ADDRESSES_IMG 108
+#define GRALLOC_MODULE_PUT_BUFFER_CPU_ADDRESSES_IMG 109
 
-/* Extension API used by Intel components */
+#define GRALLOC_MODULE_GET_DISPLAY_DEVICE_IMG 1000
+#define GRALLOC_MODULE_GET_DISPLAY_STATUS_IMG 1001
 
-#define GRALLOC_GET_BUFFER_CPU_ADDRESSES_IMG  108
-#define GRALLOC_PUT_BUFFER_CPU_ADDRESSES_IMG  109
-
-#define GRALLOC_GET_DISPLAY_DEVICE_IMG        1000
-#define GRALLOC_GET_DISPLAY_STATUS_IMG        1001
-
-#include "img_gralloc.h"
-#include "img_gralloc1.h"
-
-typedef const gralloc_module_t gralloc0_t;
-typedef gralloc1_device_t      gralloc1_t;
-
-static inline int gralloc_is_v1_img(const hw_module_t *m)
-{
-	return ((m->module_api_version >> 8) & 0xff) == 1;
-}
-
-static inline int gralloc_open_img(const hw_device_t **d)
-{
-	const hw_module_t *m;
-	int err;
-
-	err = hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &m);
-	if (err)
-		return err;
-
-	if (gralloc_is_v1_img(m))
-		return gralloc1_open(m, (gralloc1_t **)d);
-	else
-		return gralloc_open(m, (alloc_device_t **)d);
-}
-
-static inline int gralloc_close_img(const hw_device_t *d)
-{
-	if (gralloc_is_v1_img(d->module))
-		return gralloc1_close((gralloc1_t *)d);
-	else
-		return gralloc_close((alloc_device_t *)d);
-}
-
-static inline int gralloc_register_img
-	(const hw_device_t *d, buffer_handle_t handle)
-{
-	if (gralloc_is_v1_img(d->module))
-		return gralloc1_register_img((gralloc1_t *)d, handle);
-	else
-		return gralloc0_register_img((gralloc0_t *)d->module, handle);
-}
-
-static inline int gralloc_unregister_img
-	(const hw_device_t *d, buffer_handle_t handle)
-{
-	if (gralloc_is_v1_img(d->module))
-		return gralloc1_unregister_img((gralloc1_t *)d, handle);
-	else
-		return gralloc0_unregister_img((gralloc0_t *)d->module, handle);
-}
-
-static inline int gralloc_device_alloc_img
-	(const hw_device_t *d, int w, int h, int format, int usage,
-	 buffer_handle_t *handle, int *stride)
-{
-	if (gralloc_is_v1_img(d->module)) {
-		usage = (usage | ((usage & 0x33) << 1)) & ~0x11;
-		return gralloc1_device_alloc_img((gralloc1_t *)d, w, h, format,
-										 usage, handle, stride);
-	} else
-		return gralloc0_device_alloc_img((alloc_device_t *)d, w, h, format,
-										 usage, handle, stride);
-}
-
-static inline int gralloc_device_free_img
-	(const hw_device_t *d, buffer_handle_t handle)
-{
-	if (gralloc_is_v1_img(d->module))
-		return gralloc1_device_free_img((gralloc1_t *)d, handle);
-	else
-		return gralloc0_device_free_img((alloc_device_t *)d, handle);
-}
-
-static inline int gralloc_lock_async_img
-	(const hw_device_t *d, buffer_handle_t handle, int usage,
-	 const gralloc1_rect_t *r, void **vaddr, int acquireFence)
-{
-	if (gralloc_is_v1_img(d->module)) {
-		usage = (usage | ((usage & 0x33) << 1)) & ~0x11;
-		return gralloc1_lock_async_img((gralloc1_t *)d,
-									   handle, usage, r, vaddr, acquireFence);
-	} else
-		return gralloc0_lock_async_img((gralloc0_t *)d->module,
-									   handle, usage, r, vaddr, acquireFence);
-}
-
-static inline int gralloc_unlock_async_img
-	(const hw_device_t *d, buffer_handle_t handle, int *releaseFence)
-{
-	if (gralloc_is_v1_img(d->module))
-		return gralloc1_unlock_async_img((gralloc1_t *)d,
-										 handle, releaseFence);
-	else
-		return gralloc0_unlock_async_img((gralloc0_t *)d->module,
-										 handle, releaseFence);
-}
-
-static inline int gralloc_blit_handle_to_handle_img
-	(const hw_device_t *d, buffer_handle_t src, buffer_handle_t dest,
-	 int w, int h, int x, int y, int transform, int input_fence,
-	 int *output_fence)
-{
-	if (gralloc_is_v1_img(d->module))
-		return gralloc1_blit_handle_to_handle_img((gralloc1_t *)d,
-												  src, dest, w, h, x, y,
-												  transform, input_fence,
-												  output_fence);
-	else
-		return gralloc0_blit_handle_to_handle_img((gralloc0_t *)d->module,
-												  src, dest, w, h, x, y,
-												  transform, input_fence,
-												  output_fence);
-}
-
-
-static inline int gralloc_get_buffer_cpu_addresses_img
-	(const hw_device_t *d, buffer_handle_t handle, void **vaddrs,
-	 size_t *sizes)
-{
-	if (gralloc_is_v1_img(d->module))
-		return gralloc1_get_buffer_cpu_addresses_img((gralloc1_t *)d,
-													 handle, vaddrs, sizes);
-	else
-		return gralloc0_get_buffer_cpu_addresses_img((gralloc0_t *)d->module,
-													 handle, vaddrs, sizes);
-}
-
-static inline int gralloc_put_buffer_cpu_addresses_img
-	(const hw_device_t *d, buffer_handle_t handle)
-{
-	if (gralloc_is_v1_img(d->module))
-		return gralloc1_put_buffer_cpu_addresses_img((gralloc1_t *)d,
-													 handle);
-	else
-		return gralloc0_put_buffer_cpu_addresses_img((gralloc0_t *)d->module,
-													 handle);
-}
-
-static inline int gralloc_get_display_device_img
-	(const hw_device_t *d, void **ppvDispDev)
-{
-	if (gralloc_is_v1_img(d->module))
-		return gralloc1_get_display_device_img((gralloc1_t *)d,
-											   ppvDispDev);
-	else
-		return gralloc0_get_display_device_img((gralloc0_t *)d->module,
-											   ppvDispDev);
-}
-
-static inline int gralloc_get_display_status_img
-	(const hw_device_t *d, buffer_handle_t handle, uint32_t *pui32Status)
-{
-	if (gralloc_is_v1_img(d->module))
-		return gralloc1_get_display_status_img((gralloc1_t *)d,
-											   handle, pui32Status);
-	else
-		return gralloc0_get_display_status_img((gralloc0_t *)d->module,
-											   handle, pui32Status);
-}
-
-#endif /* HAL_PUBLIC_H */
+#endif /* __HAL_PUBLIC_H */
diff --git a/moorefield_hdmi/include/pvr/hal/img_gralloc.h b/moorefield_hdmi/include/pvr/hal/img_gralloc.h
deleted file mode 100644
index d9560fa..0000000
--- a/moorefield_hdmi/include/pvr/hal/img_gralloc.h
+++ /dev/null
@@ -1,107 +0,0 @@
-/* Copyright (c) Imagination Technologies Ltd.
- *
- * The contents of this file are subject to the MIT license as set out below.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-#ifndef IMG_GRALLOC_H
-#define IMG_GRALLOC_H
-
-#include <hardware/gralloc.h>
-
-/* for gralloc1_rect_t */
-#include <hardware/gralloc1.h>
-
-static inline int gralloc0_register_img
-	(const gralloc_module_t *g, buffer_handle_t handle)
-{
-	return g->registerBuffer(g, handle);
-}
-
-static inline int gralloc0_unregister_img
-	(const gralloc_module_t *g, buffer_handle_t handle)
-{
-	return g->unregisterBuffer(g, handle);
-}
-
-static inline int gralloc0_device_alloc_img
-	(alloc_device_t *d, int w, int h, int format, int usage,
-	 buffer_handle_t *handle, int *stride)
-{
-	return d->alloc(d, w, h, format, usage, handle, stride);
-}
-
-static inline int gralloc0_device_free_img
-	(alloc_device_t *d, buffer_handle_t handle)
-{
-	return d->free(d, handle);
-}
-
-static inline int gralloc0_lock_async_img
-	(const gralloc_module_t *g, buffer_handle_t handle, int usage,
-	 const gralloc1_rect_t *r, void **vaddr, int acquireFence)
-{
-	return g->lockAsync(g, handle, usage,
-						r->left, r->top, r->width, r->height,
-						vaddr, acquireFence);
-}
-
-static inline int gralloc0_unlock_async_img
-	(const gralloc_module_t *g, buffer_handle_t handle, int *releaseFence)
-{
-	return g->unlockAsync(g, handle, releaseFence);
-}
-
-static inline int gralloc0_blit_handle_to_handle_img
-	(const gralloc_module_t *g, buffer_handle_t src, buffer_handle_t dest,
-	 int w, int h, int x, int y, int transform, int input_fence,
-	 int *output_fence)
-{
-	return g->perform(g, GRALLOC_BLIT_HANDLE_TO_HANDLE_IMG, src, dest, w, h,
-					  x, y, transform, input_fence, output_fence);
-}
-
-static inline int gralloc0_get_buffer_cpu_addresses_img
-	(const gralloc_module_t *g, buffer_handle_t handle, void **vaddrs,
-	 size_t *sizes)
-{
-	return g->perform(g, GRALLOC_GET_BUFFER_CPU_ADDRESSES_IMG, handle, vaddrs,
-					  sizes);
-}
-
-static inline int gralloc0_put_buffer_cpu_addresses_img
-	(const gralloc_module_t *g, buffer_handle_t handle)
-{
-	return g->perform(g, GRALLOC_PUT_BUFFER_CPU_ADDRESSES_IMG, handle);
-}
-
-static inline int gralloc0_get_display_device_img
-	(const gralloc_module_t *g, void **ppvDispDev)
-{
-	return g->perform(g, GRALLOC_GET_DISPLAY_DEVICE_IMG, ppvDispDev);
-}
-
-static inline int gralloc0_get_display_status_img
-	(const gralloc_module_t *g, buffer_handle_t handle, uint32_t *pui32Status)
-{
-	return g->perform(g, GRALLOC_GET_DISPLAY_STATUS_IMG, handle, pui32Status);
-}
-
-#endif /* IMG_GRALLOC_H */
diff --git a/moorefield_hdmi/include/pvr/hal/img_gralloc1.h b/moorefield_hdmi/include/pvr/hal/img_gralloc1.h
deleted file mode 100644
index f9f69a2..0000000
--- a/moorefield_hdmi/include/pvr/hal/img_gralloc1.h
+++ /dev/null
@@ -1,303 +0,0 @@
-/* Copyright (c) Imagination Technologies Ltd.
- *
- * The contents of this file are subject to the MIT license as set out below.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-#ifndef IMG_GRALLOC1_H
-#define IMG_GRALLOC1_H
-
-#include <hardware/gralloc1.h>
-
-#include <stdlib.h>
-
-#define GRALLOC1_FUNCTION_IMG_EXT_OFF 1000
-
-enum
-{
-	GRALLOC1_FUNCTION_BLIT_HANDLE_TO_HANDLE_IMG =
-		(GRALLOC1_FUNCTION_IMG_EXT_OFF + GRALLOC_BLIT_HANDLE_TO_HANDLE_IMG),
-	GRALLOC1_FUNCTION_GET_BUFFER_CPU_ADDRESSES_IMG =
-		(GRALLOC1_FUNCTION_IMG_EXT_OFF + GRALLOC_GET_BUFFER_CPU_ADDRESSES_IMG),
-	GRALLOC1_FUNCTION_PUT_BUFFER_CPU_ADDRESSES_IMG =
-		(GRALLOC1_FUNCTION_IMG_EXT_OFF + GRALLOC_PUT_BUFFER_CPU_ADDRESSES_IMG),
-	GRALLOC1_FUNCTION_GET_DISPLAY_DEVICE_IMG =
-		(GRALLOC1_FUNCTION_IMG_EXT_OFF + GRALLOC_GET_DISPLAY_DEVICE_IMG),
-	GRALLOC1_FUNCTION_GET_DISPLAY_STATUS_IMG =
-		(GRALLOC1_FUNCTION_IMG_EXT_OFF + GRALLOC_GET_DISPLAY_STATUS_IMG),
-};
-
-static inline int gralloc1_register_img
-	(gralloc1_device_t *g, buffer_handle_t handle)
-{
-	GRALLOC1_PFN_RETAIN f =
-		(GRALLOC1_PFN_RETAIN)
-			g->getFunction(g, GRALLOC1_FUNCTION_RETAIN);
-	int32_t err;
-
-	err = f(g, handle);
-	switch (err)
-	{
-		case GRALLOC1_ERROR_NO_RESOURCES:
-			return -EAGAIN;
-		case GRALLOC1_ERROR_NONE:
-			return 0;
-		default:
-			return -EINVAL;
-	}
-}
-
-static inline int gralloc1_unregister_img
-	(gralloc1_device_t *g, buffer_handle_t handle)
-{
-	GRALLOC1_PFN_RELEASE f =
-		(GRALLOC1_PFN_RELEASE)
-			g->getFunction(g, GRALLOC1_FUNCTION_RELEASE);
-	int32_t err;
-
-	err = f(g, handle);
-	switch (err)
-	{
-		case GRALLOC1_ERROR_NONE:
-			return 0;
-		default:
-			return -EINVAL;
-	}
-}
-
-static inline int gralloc1_device_alloc_img
-	(gralloc1_device_t *d, int w, int h, int format, int usage,
-	 buffer_handle_t *handle, int *stride)
-{
-	GRALLOC1_PFN_ALLOCATE allocate =
-		(GRALLOC1_PFN_ALLOCATE)
-			d->getFunction(d, GRALLOC1_FUNCTION_ALLOCATE);
-	GRALLOC1_PFN_CREATE_DESCRIPTOR createDescriptor =
-		(GRALLOC1_PFN_CREATE_DESCRIPTOR)
-			d->getFunction(d, GRALLOC1_FUNCTION_CREATE_DESCRIPTOR);
-	GRALLOC1_PFN_DESTROY_DESCRIPTOR destroyDescriptor =
-		(GRALLOC1_PFN_DESTROY_DESCRIPTOR)
-			d->getFunction(d, GRALLOC1_FUNCTION_DESTROY_DESCRIPTOR);
-	GRALLOC1_PFN_SET_CONSUMER_USAGE setConsumerUsage =
-		(GRALLOC1_PFN_SET_CONSUMER_USAGE)
-			d->getFunction(d, GRALLOC1_FUNCTION_SET_CONSUMER_USAGE);
-	GRALLOC1_PFN_SET_DIMENSIONS setDimensions =
-		(GRALLOC1_PFN_SET_DIMENSIONS)
-			d->getFunction(d, GRALLOC1_FUNCTION_SET_DIMENSIONS);
-	GRALLOC1_PFN_SET_FORMAT setFormat =
-		(GRALLOC1_PFN_SET_FORMAT)
-			d->getFunction(d, GRALLOC1_FUNCTION_SET_FORMAT);
-	GRALLOC1_PFN_SET_PRODUCER_USAGE setProducerUsage =
-		(GRALLOC1_PFN_SET_PRODUCER_USAGE)
-			d->getFunction(d, GRALLOC1_FUNCTION_SET_PRODUCER_USAGE);
-	GRALLOC1_PFN_GET_STRIDE getStride =
-		(GRALLOC1_PFN_GET_STRIDE)
-			d->getFunction(d, GRALLOC1_FUNCTION_GET_STRIDE);
-	uint64_t producerUsage =
-		(usage & (GRALLOC1_PRODUCER_USAGE_CPU_READ_OFTEN    |
-		          GRALLOC1_PRODUCER_USAGE_CPU_WRITE_OFTEN   |
-		          GRALLOC1_PRODUCER_USAGE_GPU_RENDER_TARGET |
-		          GRALLOC1_PRODUCER_USAGE_PROTECTED         |
-		          GRALLOC1_PRODUCER_USAGE_CAMERA            |
-		          GRALLOC1_PRODUCER_USAGE_VIDEO_DECODER));
-	uint64_t consumerUsage =
-		(usage & (GRALLOC1_CONSUMER_USAGE_CPU_READ_OFTEN    |
-		          GRALLOC1_CONSUMER_USAGE_GPU_TEXTURE       |
-		          GRALLOC1_CONSUMER_USAGE_HWCOMPOSER        |
-		          GRALLOC1_CONSUMER_USAGE_CLIENT_TARGET     |
-		          GRALLOC1_CONSUMER_USAGE_CURSOR            |
-		          GRALLOC1_CONSUMER_USAGE_VIDEO_ENCODER     |
-		          GRALLOC1_CONSUMER_USAGE_CAMERA            |
-		          GRALLOC1_CONSUMER_USAGE_RENDERSCRIPT));
-	gralloc1_buffer_descriptor_t descriptor;
-	uint32_t stride32;
-	int err = -EINVAL;
-	int32_t err32;
-
-	err32 = createDescriptor(d, &descriptor);
-	if (err32 != GRALLOC1_ERROR_NONE)
-		goto err_out;
-
-	err32 = setDimensions(d, descriptor, w, h);
-	if (err32 != GRALLOC1_ERROR_NONE)
-		goto err_destroy_descriptor;
-
-	err32 = setFormat(d, descriptor, format);
-	if (err32 != GRALLOC1_ERROR_NONE)
-		goto err_destroy_descriptor;
-
-	err32 = setConsumerUsage(d, descriptor, consumerUsage);
-	if (err32 != GRALLOC1_ERROR_NONE)
-		goto err_destroy_descriptor;
-
-	err32 = setProducerUsage(d, descriptor, producerUsage);
-	if (err32 != GRALLOC1_ERROR_NONE)
-		goto err_destroy_descriptor;
-
-	err32 = allocate(d, 1, &descriptor, handle);
-	switch (err32)
-	{
-		case GRALLOC1_ERROR_NOT_SHARED:
-		case GRALLOC1_ERROR_NONE:
-			break;
-		case GRALLOC1_ERROR_NO_RESOURCES:
-			err = -EAGAIN;
-		default:
-			goto err_destroy_descriptor;
-	}
-
-	err32 = getStride(d, *handle, &stride32);
-	if (err32 != GRALLOC1_ERROR_NONE)
-	{
-		gralloc1_unregister_img(d, *handle);
-		goto err_destroy_descriptor;
-	}
-
-	*stride = (int)stride32;
-	err = 0;
-err_destroy_descriptor:
-	destroyDescriptor(d, descriptor);
-err_out:
-	return err;
-}
-
-static inline int gralloc1_device_free_img
-	(gralloc1_device_t *d, buffer_handle_t handle)
-{
-	return gralloc1_unregister_img(d, handle);
-}
-
-static inline int gralloc1_lock_async_img
-	(gralloc1_device_t *g, buffer_handle_t handle, int usage,
-	 const gralloc1_rect_t *r, void **vaddr, int acquireFence)
-{
-	GRALLOC1_PFN_LOCK f =
-		(GRALLOC1_PFN_LOCK)
-			g->getFunction(g, GRALLOC1_FUNCTION_LOCK);
-	uint64_t producerUsage =
-		(usage & (GRALLOC1_PRODUCER_USAGE_CPU_READ_OFTEN |
-		          GRALLOC1_PRODUCER_USAGE_CPU_WRITE_OFTEN));
-	uint64_t consumerUsage =
-		(usage &  GRALLOC1_CONSUMER_USAGE_CPU_READ_OFTEN);
-	int32_t err;
-
-	err = f(g, handle, producerUsage, consumerUsage, r, vaddr, acquireFence);
-	switch (err)
-	{
-		case GRALLOC1_ERROR_NONE:
-			return 0;
-		case GRALLOC1_ERROR_NO_RESOURCES:
-			return -EAGAIN;
-		default:
-			return -EINVAL;
-	}
-}
-
-static inline int gralloc1_unlock_async_img
-	(gralloc1_device_t *g, buffer_handle_t handle, int *releaseFence)
-{
-	GRALLOC1_PFN_UNLOCK f =
-		(GRALLOC1_PFN_UNLOCK)
-			g->getFunction(g, GRALLOC1_FUNCTION_UNLOCK);
-	int32_t err, releaseFence32;
-
-	err = f(g, handle, &releaseFence32);
-	switch (err)
-	{
-		case GRALLOC1_ERROR_NONE:
-			*releaseFence = releaseFence32;
-			return 0;
-		default:
-			return -EINVAL;
-	}
-}
-
-typedef int (*GRALLOC1_PFN_BLIT_HANDLE_TO_HANDLE_IMG)
-	(gralloc1_device_t *g, buffer_handle_t src, buffer_handle_t dest,
-	 int w, int h, int x, int y, int transform, int input_fence,
-	 int *output_fence);
-
-static inline int gralloc1_blit_handle_to_handle_img
-	(gralloc1_device_t *g, buffer_handle_t src, buffer_handle_t dest,
-	 int w, int h, int x, int y, int transform, int input_fence,
-	 int *output_fence)
-{
-	GRALLOC1_PFN_BLIT_HANDLE_TO_HANDLE_IMG f =
-		(GRALLOC1_PFN_BLIT_HANDLE_TO_HANDLE_IMG)
-			g->getFunction(g, GRALLOC1_FUNCTION_BLIT_HANDLE_TO_HANDLE_IMG);
-
-	return f(g, src, dest, w, h, x, y, transform, input_fence, output_fence);
-}
-
-typedef int (*GRALLOC1_PFN_GET_BUFFER_CPU_ADDRESSES_IMG)
-	(gralloc1_device_t *g, buffer_handle_t handle, void **vaddrs,
-	 size_t *sizes);
-
-static inline int gralloc1_get_buffer_cpu_addresses_img
-	(gralloc1_device_t *g, buffer_handle_t handle, void **vaddrs,
-	 size_t *sizes)
-{
-	GRALLOC1_PFN_GET_BUFFER_CPU_ADDRESSES_IMG f =
-		(GRALLOC1_PFN_GET_BUFFER_CPU_ADDRESSES_IMG)
-			g->getFunction(g, GRALLOC1_FUNCTION_GET_BUFFER_CPU_ADDRESSES_IMG);
-
-	return f(g, handle, vaddrs, sizes);
-}
-
-typedef int (*GRALLOC1_PFN_PUT_BUFFER_CPU_ADDRESSES_IMG)
-	(gralloc1_device_t *g, buffer_handle_t handle);
-
-static inline int gralloc1_put_buffer_cpu_addresses_img
-	(gralloc1_device_t *g, buffer_handle_t handle)
-{
-	GRALLOC1_PFN_PUT_BUFFER_CPU_ADDRESSES_IMG f =
-		(GRALLOC1_PFN_PUT_BUFFER_CPU_ADDRESSES_IMG)
-			g->getFunction(g, GRALLOC1_FUNCTION_PUT_BUFFER_CPU_ADDRESSES_IMG);
-
-	return f(g, handle);
-}
-
-typedef int (*GRALLOC1_PFN_GET_DISPLAY_DEVICE_IMG)
-	(gralloc1_device_t *g, void **ppvDispDev);
-
-static inline int gralloc1_get_display_device_img
-	(gralloc1_device_t *g, void **ppvDispDev)
-{
-	GRALLOC1_PFN_GET_DISPLAY_DEVICE_IMG f =
-		(GRALLOC1_PFN_GET_DISPLAY_DEVICE_IMG)
-			g->getFunction(g, GRALLOC1_FUNCTION_GET_DISPLAY_DEVICE_IMG);
-
-	return f(g, ppvDispDev);
-}
-
-typedef int (*GRALLOC1_PFN_GET_DISPLAY_STATUS_IMG)
-	(gralloc1_device_t *g, buffer_handle_t handle, uint32_t *pui32Status);
-
-static inline int gralloc1_get_display_status_img
-	(gralloc1_device_t *g, buffer_handle_t handle, uint32_t *pui32Status)
-{
-	GRALLOC1_PFN_GET_DISPLAY_STATUS_IMG f =
-		(GRALLOC1_PFN_GET_DISPLAY_STATUS_IMG)
-			g->getFunction(g, GRALLOC1_FUNCTION_GET_DISPLAY_STATUS_IMG);
-
-	return f(g, handle, pui32Status);
-}
-
-#endif /* IMG_GRALLOC1_H */
diff --git a/moorefield_hdmi/include/pvr/hal/img_gralloc_common_public.h b/moorefield_hdmi/include/pvr/hal/img_gralloc_common_public.h
deleted file mode 100644
index 965e5a7..0000000
--- a/moorefield_hdmi/include/pvr/hal/img_gralloc_common_public.h
+++ /dev/null
@@ -1,368 +0,0 @@
-/* Copyright (c) Imagination Technologies Ltd.
- *
- * The contents of this file are subject to the MIT license as set out below.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-#ifndef IMG_GRALLOC_COMMON_PUBLIC_H
-#define IMG_GRALLOC_COMMON_PUBLIC_H
-
-#include <cutils/native_handle.h>
-#include <system/graphics.h>
-#include <linux/ion.h>
-
-#define ALIGN(x,a)	((((x) + (a) - 1L) / (a)) * (a))
-#define HW_ALIGN	32
-
-/* Use bits [0-3] of "vendor format" bits as real format. Customers should
- * use *only* the unassigned bits below for custom pixel formats, YUV or RGB.
- *
- * If there are no bits set in this part of the field, or other bits are set
- * in the format outside of the "vendor format" mask, the non-extension format
- * is used instead. Reserve 0 for this purpose.
- */
-
-#define HAL_PIXEL_FORMAT_VENDOR_EXT(fmt) (0x100 | (fmt & 0xF))
-
-/*      Reserved ** DO NOT USE **    HAL_PIXEL_FORMAT_VENDOR_EXT(0) */
-#define HAL_PIXEL_FORMAT_BGRX_8888   HAL_PIXEL_FORMAT_VENDOR_EXT(1)
-#define HAL_PIXEL_FORMAT_sBGR_A_8888 HAL_PIXEL_FORMAT_VENDOR_EXT(2)
-#define HAL_PIXEL_FORMAT_sBGR_X_8888 HAL_PIXEL_FORMAT_VENDOR_EXT(3)
-/*      HAL_PIXEL_FORMAT_RGB_565     HAL_PIXEL_FORMAT_VENDOR_EXT(4) */
-/*      HAL_PIXEL_FORMAT_BGRA_8888   HAL_PIXEL_FORMAT_VENDOR_EXT(5) */
-#define HAL_PIXEL_FORMAT_NV12        HAL_PIXEL_FORMAT_VENDOR_EXT(6)
-/*      Free for customer use        HAL_PIXEL_FORMAT_VENDOR_EXT(7) */
-/*      Free for customer use        HAL_PIXEL_FORMAT_VENDOR_EXT(8) */
-/*      Free for customer use        HAL_PIXEL_FORMAT_VENDOR_EXT(9) */
-/*      Free for customer use        HAL_PIXEL_FORMAT_VENDOR_EXT(10) */
-/*      Free for customer use        HAL_PIXEL_FORMAT_VENDOR_EXT(11) */
-/*      Free for customer use        HAL_PIXEL_FORMAT_VENDOR_EXT(12) */
-/*      Free for customer use        HAL_PIXEL_FORMAT_VENDOR_EXT(13) */
-/*      Free for customer use        HAL_PIXEL_FORMAT_VENDOR_EXT(14) */
-/*      Free for customer use        HAL_PIXEL_FORMAT_VENDOR_EXT(15) */
-
-/* One of the below compression modes is OR'ed into bits [4-6] of the 8 bit
- * "vendor format" field. If no bits are set in this "compression mask", the
- * normal memory format for the pixel format is used. Otherwise the pixel
- * data will be compressed in memory with the Rogue framebuffer compressor.
- */
-
-#define HAL_FB_COMPRESSION_NONE                0
-#define HAL_FB_COMPRESSION_DIRECT_8x8          1
-#define HAL_FB_COMPRESSION_DIRECT_16x4         2
-#define HAL_FB_COMPRESSION_DIRECT_32x2         3
-#define HAL_FB_COMPRESSION_INDIRECT_8x8        4
-#define HAL_FB_COMPRESSION_INDIRECT_16x4       5
-#define HAL_FB_COMPRESSION_INDIRECT_4TILE_8x8  6
-#define HAL_FB_COMPRESSION_INDIRECT_4TILE_16x4 7
-
-/* The memory layout is OR'ed into bit 7 (top bit) of the 8 bit "vendor
- * format" field. Only STRIDED and TWIDDLED are supported; there is no space
- * for PAGETILED.
- */
-#define HAL_FB_MEMLAYOUT_STRIDED               0
-#define HAL_FB_MEMLAYOUT_TWIDDLED              1
-
-/* This can be tuned down as appropriate for the SOC.
- *
- * IMG formats are usually a single sub-alloc.
- * Some OEM video formats are two sub-allocs (Y, UV planes).
- * Future OEM video formats might be three sub-allocs (Y, U, V planes).
- */
-#define MAX_SUB_ALLOCS (3)
-
-typedef struct
-{
-	native_handle_t base;
-
-	/* These fields can be sent cross process. They are also valid
-	 * to duplicate within the same process.
-	 *
-	 * A table is stored within the gralloc implementation's private data
-	 * structure (which is per-process) which maps stamps to a mapped
-	 * PVRSRV_MEMDESC in that process. Each map entry has a lock count
-	 * associated with it, satisfying the requirements of the gralloc API.
-	 * This also prevents us from leaking maps/allocations.
-	 */
-
-#define IMG_NATIVE_HANDLE_NUMFDS (MAX_SUB_ALLOCS)
-	/* The `fd' field is used to "export" a meminfo to another process. */
-	int fd[IMG_NATIVE_HANDLE_NUMFDS];
-
-	/* This define should represent the number of packed 'int's required to
-	 * represent the fields following it. If you add a data type that is
-	 * 64-bit, for example using 'unsigned long long', you should write that
-	 * as "sizeof(unsigned long long) / sizeof(int)". Please keep the order
-	 * of the additions the same as the defined field order.
-	 */
-#define IMG_NATIVE_HANDLE_NUMINTS \
-	(sizeof(unsigned long long) / sizeof(int) + \
-	 6 + MAX_SUB_ALLOCS + MAX_SUB_ALLOCS + \
-	 sizeof(unsigned long long) / sizeof(int) * MAX_SUB_ALLOCS + \
-	 1)
-	/* A KERNEL unique identifier for any exported kernel memdesc. Each
-	 * exported kernel memdesc will have a unique stamp, but note that in
-	 * userspace, several memdescs across multiple processes could have
-	 * the same stamp. As the native_handle can be dup(2)'d, there could be
-	 * multiple handles with the same stamp but different file descriptors.
-	 */
-	unsigned long long ui64Stamp;
-
-	/* This is used for buffer usage validation */
-	int usage;
-
-	/* In order to do efficient cache flushes we need the buffer dimensions,
-	 * format and bits per pixel. There are ANativeWindow queries for the
-	 * width, height and format, but the graphics HAL might have remapped the
-	 * request to different values at allocation time. These are the 'true'
-	 * values of the buffer allocation.
-	 */
-	int iWidth;
-	int iHeight;
-	int iFormat;
-	unsigned int uiBpp;
-
-	/* Planes are not the same as the `fd' suballocs. A multi-planar YUV
-	 * allocation has different planes (interleaved = 1, semi-planar = 2,
-	 * fully-planar = 3) but might be spread across 1, 2 or 3 independent
-	 * memory allocations (or not).
-	 */
-	int iPlanes;
-
-	/* For multi-planar allocations, there will be multiple hstrides */
-	int aiStride[MAX_SUB_ALLOCS];
-
-	/* For multi-planar allocations, there will be multiple vstrides */
-	int aiVStride[MAX_SUB_ALLOCS];
-
-	/* These byte offsets are reconciled with the number of sub-allocs used
-	 * for a multi-planar allocation. If there is a 1:1 mapping between the
-	 * number of planes and the number of sub-allocs, these will all be zero.
-	 *
-	 * Otherwise, normally the zeroth entry will be zero, and the latter
-	 * entries will be non-zero.
-	 */
-	unsigned long long aulPlaneOffset[MAX_SUB_ALLOCS];
-
-	/* This records the number of MAX_SUB_ALLOCS fds actually used by the
-	 * buffer allocation. File descriptors up to fd[iNumSubAllocs - 1] are
-	 * guaranteed to be valid. (This does not have any bearing on the aiStride,
-	 * aiVStride or aulPlaneOffset fields, as `iPlanes' of those arrays should
-	 * be initialized, not `iNumSubAllocs'.)
-	 */
-	int iNumSubAllocs;
-}
-__attribute__((aligned(sizeof(int)),packed)) IMG_native_handle_t;
-
-/* Channel encoding of buffer data.
- *
- * If the buffer has only one plane, the ENCODING bits should be interpreted
- * as a definition of the interleaving pattern. Only two of the possible four
- * permutations are defined; this is because the YVYU and VYUY patterns are
- * not seen in the wild.
- *
- * If the buffer has more than one plane, the ENCODING bits should be
- * interpreted as a definition of the plane order in memory. Assuming a YUV
- * format, Y is always first, but U and V may be defined in 'V then U' or
- * 'U then V' orders.
- *
- * Some bits are not used, to maximize compatibility with older DDKs which
- * used them in semantically different ways.
- */
-#define IMG_BFF_ENCODING_MASK                (3 << 0)
-/* For uiPlanes == 1 **********************************/
-/*   Reserved for VYUY (check IsYUV if used) (0 << 0) */
-#define IMG_BFF_ENCODING_INTERLEAVED_YUYV    (1 << 0)
-/*   Reserved for YVYU                       (2 << 0) */
-#define IMG_BFF_ENCODING_INTERLEAVED_UYVY    (3 << 0)
-/* For uiPlanes > 1 ***********************************/
-/*   Unused (check IsYUV if used)            (0 << 0) */
-#define IMG_BFF_ENCODING_VUCrCb              (1 << 0)
-/*   Unused                                  (2 << 0) */
-#define IMG_BFF_ENCODING_UVCbCr              (3 << 0)
-
-/* Whether the buffer should be cleared to zero from userspace, or via the
- * PowerVR services at import time. This is deprecated functionality as most
- * platforms use dma-buf or ion now, and for security reasons these allocators
- * should never return uncleared memory.
- */
-#define IMG_BFF_CPU_CLEAR                    (1 << 2)
-
-/* Deprecated, do not use */
-#define IMG_BFF_DONT_GPU_CLEAR               (1 << 3)
-
-/* Deprecated, do not use */
-#define IMG_BFF_PARTIAL_ALLOC                (1 << 4)
-
-/* Guarantee that GPU framebuffer compression is never used for buffers in
- * this format, even if the format is supported by the compressor. This might
- * be useful if the buffer is being fed to hardware blocks that cannot handle
- * the framebuffer compression encoding, and the existing HAL overrides are
- * not sufficiently expressive.
- */
-#define IMG_BFF_NEVER_COMPRESS               (1 << 5)
-
-/* Indicates that the buffer should be mapped into the GPU 'tiling range'
- * heaps, rather than the 'linear' general heap. This implies that the raw
- * buffer data is tiled in physical memory. (The GPU BIF will de-tile it, so
- * this is distinct from 'tiled texture' support.) The graphics HAL will
- * select the correct 'tiling range' based on the buffer dimensions.
- */
-#define IMG_BFF_BIFTILED                     (1 << 6)
-
-/* YUV subsampling encoding of buffer data.
- * Many YUV formats have less chroma information than luma information. If
- * this is not the case, use SUBSAMPLING_4_4_4. If each of the U and V channel
- * data are 1/4 the size of the Y channel data, use SUBSAMPLING_4_2_0.
- * Otherwise, use SUBSAMPLING_4_2_2.
- */
-#define IMG_BFF_YUV_SUBSAMPLING_MASK         (3 << 7)
-#define IMG_BFF_YUV_SUBSAMPLING_4_2_0        (0 << 7)
-/* Unused: 4:1:1, 4:2:1, 4:1:0, 3:1:1?       (1 << 7) */
-#define IMG_BFF_YUV_SUBSAMPLING_4_2_2        (2 << 7)
-#define IMG_BFF_YUV_SUBSAMPLING_4_4_4        (3 << 7)
-
-/* Backwards compatibility */
-#define IMG_BFF_YUV             IMG_BFF_ENCODING_VUCrCb
-#define IMG_BFF_UVCbCrORDERING  IMG_BFF_ENCODING_UVCbCr
-
-/* Keep this in sync with SGX */
-typedef struct IMG_buffer_format_public_t
-{
-	/* Buffer formats are returned as a linked list */
-	struct IMG_buffer_format_public_t *psNext;
-
-	/* HAL_PIXEL_FORMAT_... enumerant */
-	int iHalPixelFormat;
-
-	/* IMG_PIXFMT_... enumerant */
-	int iIMGPixelFormat;
-
-	/* Friendly name for format */
-	const char *const szName;
-
-	/* Bits (not bytes) per pixel */
-	unsigned int uiBpp;
-
-	/* Supported HW usage bits. If this is GRALLOC_USAGE_HW_MASK, all usages
-	 * are supported. Used for HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED.
-	 */
-	int iSupportedUsage;
-
-	/* Allocation description flags */
-	unsigned int uiFlags;
-}
-IMG_buffer_format_public_t;
-
-typedef struct
-{
-	enum
-	{
-		IMG_BUFFER_HANDLE_TYPE_ION    = 0,
-		IMG_BUFFER_HANDLE_TYPE_DMABUF = 1,
-	}
-	eType;
-
-	union
-	{
-		ion_user_handle_t aiIonUserHandle[MAX_SUB_ALLOCS];
-		int aiDmaBufShareFd[MAX_SUB_ALLOCS];
-	};
-}
-IMG_buffer_handle_t;
-
-/* Public extensions, common to v0 and v1 HALs */
-
-#define GRALLOC_GET_BUFFER_FORMAT_IMG     1
-#define GRALLOC_GET_BUFFER_FORMATS_IMG    2
-#define GRALLOC_BLIT_HANDLE_TO_HANDLE_IMG 3
-#define GRALLOC_BLIT_STAMP_TO_HANDLE_IMG  4
-#define GRALLOC_SET_DATA_SPACE_IMG        5
-#define GRALLOC_GET_ION_CLIENT_IMG        6
-#define GRALLOC_GET_BUFFER_HANDLE_IMG     7
-
-#if !defined(PVR_ANDROID_HAS_SET_BUFFERS_DATASPACE)
-
-enum
-{
-	HAL_DATASPACE_SRGB_LINEAR         = 0x200,
-	HAL_DATASPACE_SRGB                = 0x201,
-	HAL_DATASPACE_BT601_625           = 0x102,
-	HAL_DATASPACE_BT601_525           = 0x103,
-	HAL_DATASPACE_BT709               = 0x104,
-};
-
-#endif /* !defined(PVR_ANDROID_HAS_SET_BUFFERS_DATASPACE) */
-
-#if !defined(PVR_ANDROID_HAS_SET_BUFFERS_DATASPACE_2)
-
-enum
-{
-	HAL_DATASPACE_STANDARD_SHIFT      = 16,
-	HAL_DATASPACE_TRANSFER_SHIFT      = 22,
-	HAL_DATASPACE_RANGE_SHIFT         = 27,
-
-	HAL_DATASPACE_STANDARD_BT2020     = 6 << HAL_DATASPACE_STANDARD_SHIFT,
-
-	HAL_DATASPACE_TRANSFER_SMPTE_170M = 3 << HAL_DATASPACE_TRANSFER_SHIFT,
-
-	HAL_DATASPACE_RANGE_MASK          = 7 << HAL_DATASPACE_RANGE_SHIFT,
-	HAL_DATASPACE_RANGE_FULL          = 1 << HAL_DATASPACE_RANGE_SHIFT,
-	HAL_DATASPACE_RANGE_LIMITED       = 2 << HAL_DATASPACE_RANGE_SHIFT,
-};
-
-#endif /* !defined(PVR_ANDROID_HAS_SET_BUFFERS_DATASPACE_2) */
-
-/* We want to add BT.2020 and 'full range' versions of the existing dataspace
- * enums. These are extensions, so define a new android_dataspace_ext_t.
- * If you only have an android_dataspace_t, you can simply cast it.
- */
-typedef enum
-{
-	/* Identical to upstream enum android_dataspace */
-	HAL_DATASPACE_EXT_UNKNOWN         = HAL_DATASPACE_UNKNOWN,
-	HAL_DATASPACE_EXT_SRGB_LINEAR     = HAL_DATASPACE_SRGB_LINEAR,
-	HAL_DATASPACE_EXT_SRGB            = HAL_DATASPACE_SRGB,
-	HAL_DATASPACE_EXT_BT601_625       = HAL_DATASPACE_BT601_625,
-	HAL_DATASPACE_EXT_BT601_525       = HAL_DATASPACE_BT601_525,
-	HAL_DATASPACE_EXT_BT709           = HAL_DATASPACE_BT709,
-
-	/* IMG extension for BT.2020 support */
-	HAL_DATASPACE_EXT_BT2020          = HAL_DATASPACE_STANDARD_BT2020     |
-	                                    HAL_DATASPACE_TRANSFER_SMPTE_170M |
-	                                    HAL_DATASPACE_RANGE_LIMITED,
-
-	/* IMG extensions for 'full range' versions of previous enums */
-	HAL_DATASPACE_EXT_BT601_625_FULL  = ( HAL_DATASPACE_BT601_625 &
-	                                     ~HAL_DATASPACE_RANGE_MASK) |
-	                                    HAL_DATASPACE_RANGE_FULL,
-	HAL_DATASPACE_EXT_BT601_525_FULL  = ( HAL_DATASPACE_BT601_525 &
-	                                     ~HAL_DATASPACE_RANGE_MASK) |
-	                                    HAL_DATASPACE_RANGE_FULL,
-	HAL_DATASPACE_EXT_BT709_FULL      = ( HAL_DATASPACE_BT709 &
-	                                     ~HAL_DATASPACE_RANGE_MASK) |
-	                                    HAL_DATASPACE_RANGE_FULL,
-	HAL_DATASPACE_EXT_BT2020_FULL     = ( HAL_DATASPACE_EXT_BT2020 &
-	                                     ~HAL_DATASPACE_RANGE_MASK) |
-	                                    HAL_DATASPACE_RANGE_FULL,
-}
-android_dataspace_ext_t;
-
-#endif /* IMG_GRALLOC_COMMON_PUBLIC_H */
diff --git a/moorefield_hdmi/include/pvr/hal/img_gralloc_public.h b/moorefield_hdmi/include/pvr/hal/img_gralloc_public.h
new file mode 100644
index 0000000..1b6ca50
--- /dev/null
+++ b/moorefield_hdmi/include/pvr/hal/img_gralloc_public.h
@@ -0,0 +1,302 @@
+/* Copyright (c) Imagination Technologies Ltd.
+ *
+ * The contents of this file are subject to the MIT license as set out below.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#ifndef HAL_PUBLIC_H
+#define HAL_PUBLIC_H
+
+/* Authors of third party hardware composer (HWC) modules will need to include
+ * this header to access functionality in the gralloc HAL.
+ */
+
+#include <hardware/gralloc.h>
+
+#define ALIGN(x,a)	(((x) + (a) - 1L) & ~((a) - 1L))
+#define HW_ALIGN	32
+
+/* Use bits [0-3] of "vendor format" bits as real format. Customers should
+ * use *only* the unassigned bits below for custom pixel formats, YUV or RGB.
+ *
+ * If there are no bits set in this part of the field, or other bits are set
+ * in the format outside of the "vendor format" mask, the non-extension format
+ * is used instead. Reserve 0 for this purpose.
+ */
+
+#define HAL_PIXEL_FORMAT_VENDOR_EXT(fmt) (0x100 | (fmt & 0xF))
+
+/*      Reserved ** DO NOT USE **    HAL_PIXEL_FORMAT_VENDOR_EXT(0) */
+#define HAL_PIXEL_FORMAT_BGRX_8888   HAL_PIXEL_FORMAT_VENDOR_EXT(1)
+#define HAL_PIXEL_FORMAT_sBGR_A_8888 HAL_PIXEL_FORMAT_VENDOR_EXT(2)
+#define HAL_PIXEL_FORMAT_sBGR_X_8888 HAL_PIXEL_FORMAT_VENDOR_EXT(3)
+/*      HAL_PIXEL_FORMAT_RGB_565     HAL_PIXEL_FORMAT_VENDOR_EXT(4) */
+/*      HAL_PIXEL_FORMAT_BGRA_8888   HAL_PIXEL_FORMAT_VENDOR_EXT(5) */
+#define HAL_PIXEL_FORMAT_NV12        HAL_PIXEL_FORMAT_VENDOR_EXT(6)
+/*      Free for customer use        HAL_PIXEL_FORMAT_VENDOR_EXT(7) */
+/*      Free for customer use        HAL_PIXEL_FORMAT_VENDOR_EXT(8) */
+/*      Free for customer use        HAL_PIXEL_FORMAT_VENDOR_EXT(9) */
+/*      Free for customer use        HAL_PIXEL_FORMAT_VENDOR_EXT(10) */
+/*      Free for customer use        HAL_PIXEL_FORMAT_VENDOR_EXT(11) */
+/*      Free for customer use        HAL_PIXEL_FORMAT_VENDOR_EXT(12) */
+/*      Free for customer use        HAL_PIXEL_FORMAT_VENDOR_EXT(13) */
+/*      Free for customer use        HAL_PIXEL_FORMAT_VENDOR_EXT(14) */
+/*      Free for customer use        HAL_PIXEL_FORMAT_VENDOR_EXT(15) */
+
+/* One of the below compression modes is OR'ed into bits [4-6] of the 8 bit
+ * "vendor format" field. If no bits are set in this "compression mask", the
+ * normal memory format for the pixel format is used. Otherwise the pixel
+ * data will be compressed in memory with the Rogue framebuffer compressor.
+ */
+
+#define HAL_FB_COMPRESSION_NONE                0
+#define HAL_FB_COMPRESSION_DIRECT_8x8          1
+#define HAL_FB_COMPRESSION_DIRECT_16x4         2
+#define HAL_FB_COMPRESSION_DIRECT_32x2         3
+#define HAL_FB_COMPRESSION_INDIRECT_8x8        4
+#define HAL_FB_COMPRESSION_INDIRECT_16x4       5
+#define HAL_FB_COMPRESSION_INDIRECT_4TILE_8x8  6
+#define HAL_FB_COMPRESSION_INDIRECT_4TILE_16x4 7
+
+/* The memory layout is OR'ed into bit 7 (top bit) of the 8 bit "vendor
+ * format" field. Only STRIDED and TWIDDLED are supported; there is no space
+ * for PAGETILED.
+ */
+#define HAL_FB_MEMLAYOUT_STRIDED               0
+#define HAL_FB_MEMLAYOUT_TWIDDLED              1
+
+/* This can be tuned down as appropriate for the SOC.
+ *
+ * IMG formats are usually a single sub-alloc.
+ * Some OEM video formats are two sub-allocs (Y, UV planes).
+ * Future OEM video formats might be three sub-allocs (Y, U, V planes).
+ */
+#define MAX_SUB_ALLOCS (3)
+
+typedef struct
+{
+	native_handle_t base;
+
+	/* These fields can be sent cross process. They are also valid
+	 * to duplicate within the same process.
+	 *
+	 * A table is stored within psPrivateData on gralloc_module_t (this
+	 * is obviously per-process) which maps stamps to a mapped
+	 * PVRSRV_MEMDESC in that process. Each map entry has a lock
+	 * count associated with it, satisfying the requirements of the
+	 * Android API. This also prevents us from leaking maps/allocations.
+	 *
+	 * This table has entries inserted either by alloc()
+	 * (alloc_device_t) or map() (gralloc_module_t). Entries are removed
+	 * by free() (alloc_device_t) and unmap() (gralloc_module_t).
+	 */
+
+#define IMG_NATIVE_HANDLE_NUMFDS (MAX_SUB_ALLOCS)
+	/* The `fd' field is used to "export" a meminfo to another process.
+	 * Therefore, it is allocated by alloc_device_t, and consumed by
+	 * gralloc_module_t.
+	 */
+	int fd[IMG_NATIVE_HANDLE_NUMFDS];
+
+	/* This define should represent the number of packed 'int's required to
+	 * represent the fields following it. If you add a data type that is
+	 * 64-bit, for example using 'unsigned long long', you should write that
+	 * as "sizeof(unsigned long long) / sizeof(int)". Please keep the order
+	 * of the additions the same as the defined field order.
+	 */
+#define IMG_NATIVE_HANDLE_NUMINTS \
+	(sizeof(unsigned long long) / sizeof(int) + \
+	 6 + MAX_SUB_ALLOCS + MAX_SUB_ALLOCS + \
+	 sizeof(unsigned long long) / sizeof(int) * MAX_SUB_ALLOCS + \
+	 1)
+	/* A KERNEL unique identifier for any exported kernel meminfo. Each
+	 * exported kernel meminfo will have a unique stamp, but note that in
+	 * userspace, several meminfos across multiple processes could have
+	 * the same stamp. As the native_handle can be dup(2)'d, there could be
+	 * multiple handles with the same stamp but different file descriptors.
+	 */
+	unsigned long long ui64Stamp;
+
+	/* This is used for buffer usage validation */
+	int usage;
+
+	/* In order to do efficient cache flushes we need the buffer dimensions,
+	 * format and bits per pixel. There are ANativeWindow queries for the
+	 * width, height and format, but the graphics HAL might have remapped the
+	 * request to different values at allocation time. These are the 'true'
+	 * values of the buffer allocation.
+	 */
+	int iWidth;
+	int iHeight;
+	int iFormat;
+	unsigned int uiBpp;
+
+	/* Planes are not the same as the `fd' suballocs. A multi-planar YUV
+	 * allocation has different planes (interleaved = 1, semi-planar = 2,
+	 * fully-planar = 3) but might be spread across 1, 2 or 3 independent
+	 * memory allocations (or not).
+	 */
+	int iPlanes;
+
+	/* For multi-planar allocations, there will be multiple hstrides */
+	int aiStride[MAX_SUB_ALLOCS];
+
+	/* For multi-planar allocations, there will be multiple vstrides */
+	int aiVStride[MAX_SUB_ALLOCS];
+
+	/* These byte offsets are reconciled with the number of sub-allocs used
+	 * for a multi-planar allocation. If there is a 1:1 mapping between the
+	 * number of planes and the number of sub-allocs, these will all be zero.
+	 *
+	 * Otherwise, normally the zeroth entry will be zero, and the latter
+	 * entries will be non-zero.
+	 */
+	unsigned long long aulPlaneOffset[MAX_SUB_ALLOCS];
+
+	/* This records the number of MAX_SUB_ALLOCS fds actually used by the
+	 * buffer allocation. File descriptors up to fd[iNumSubAllocs - 1] are
+	 * guaranteed to be valid. (This does not have any bearing on the aiStride,
+	 * aiVStride or aulPlaneOffset fields, as `iPlanes' of those arrays should
+	 * be initialized, not `iNumSubAllocs'.)
+	 */
+	int iNumSubAllocs;
+}
+__attribute__((aligned(sizeof(int)),packed)) IMG_native_handle_t;
+
+typedef struct
+{
+	int l, t, w, h;
+}
+IMG_write_lock_rect_t;
+
+#define IMG_BFF_YUV					(1 << 0)
+#define IMG_BFF_UVCbCrORDERING		(1 << 1)
+#define IMG_BFF_CPU_CLEAR			(1 << 2)
+#define IMG_BFF_DONT_GPU_CLEAR		(1 << 3)
+#define IMG_BFF_PARTIAL_ALLOC		(1 << 4)
+#define IMG_BFF_NEVER_COMPRESS		(1 << 5)
+
+/* Keep this in sync with SGX */
+typedef struct IMG_buffer_format_public_t
+{
+	/* Buffer formats are returned as a linked list */
+	struct IMG_buffer_format_public_t *psNext;
+
+	/* HAL_PIXEL_FORMAT_... enumerant */
+	int iHalPixelFormat;
+
+	/* IMG_PIXFMT_... enumerant */
+	int iIMGPixelFormat;
+
+	/* Friendly name for format */
+	const char *const szName;
+
+	/* Bits (not bytes) per pixel */
+	unsigned int uiBpp;
+
+	/* Supported HW usage bits. If this is GRALLOC_USAGE_HW_MASK, all usages
+	 * are supported. Used for HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED.
+	 */
+	int iSupportedUsage;
+
+	/* Allocation description flags */
+	unsigned int uiFlags;
+}
+IMG_buffer_format_public_t;
+
+/* NOTE: This interface is deprecated. Use module->perform() instead. */
+typedef struct IMG_gralloc_module_public_t
+{
+	gralloc_module_t base;
+
+	/* Gets the head of the linked list of all registered formats */
+	const IMG_buffer_format_public_t *(*GetBufferFormats)(void);
+
+	/* Custom-blit components in lieu of overlay hardware */
+	int (*Blit)(struct IMG_gralloc_module_public_t const *module,
+				 buffer_handle_t src, buffer_handle_t dest,
+				 int w, int h, int x, int y, int transform,
+				 int iInputFenceFd, int *piOutputFenceFd);
+
+	int (*Blit3)(struct IMG_gralloc_module_public_t const *module,
+				 unsigned long long ui64SrcStamp, int iSrcWidth,
+				 int iSrcHeight, int iSrcFormat, int iSrcStrideInPixels,
+				 int eSrcRotation, buffer_handle_t dest, int eDestRotation,
+				 int iInputFenceFd, int *piOutputFenceFd);
+
+	/* Walk the above list and return only the specified format */
+	const IMG_buffer_format_public_t *(*GetBufferFormat)(int iFormat);
+}
+IMG_gralloc_module_public_t;
+
+/* Helpers for using the non-type-safe perform() extension functions. Use
+ * these helpers instead of calling perform() directly in your application.
+ */
+
+#define GRALLOC_MODULE_GET_BUFFER_FORMAT_IMG     1
+#define GRALLOC_MODULE_GET_BUFFER_FORMATS_IMG    2
+#define GRALLOC_MODULE_BLIT_HANDLE_TO_HANDLE_IMG 3
+#define GRALLOC_MODULE_BLIT_STAMP_TO_HANDLE_IMG  4
+
+static inline int
+gralloc_module_get_buffer_format_img(const gralloc_module_t *module,
+									 int format,
+									 const IMG_buffer_format_public_t **v)
+{
+	return module->perform(module, GRALLOC_MODULE_GET_BUFFER_FORMAT_IMG,
+						   format, v);
+}
+
+static inline int
+gralloc_module_get_buffer_formats_img(const gralloc_module_t *module,
+									  const IMG_buffer_format_public_t **v)
+{
+	return module->perform(module, GRALLOC_MODULE_GET_BUFFER_FORMATS_IMG, v);
+}
+
+static inline int
+gralloc_module_blit_handle_to_handle_img(const gralloc_module_t *module,
+										 buffer_handle_t src,
+										 buffer_handle_t dest,
+										 int w, int h, int x, int y,
+										 int transform, int input_fence,
+										 int *output_fence)
+{
+	return module->perform(module, GRALLOC_MODULE_BLIT_HANDLE_TO_HANDLE_IMG,
+						   src, dest, w, h, x, y, transform, input_fence,
+						   output_fence);
+}
+
+static inline int
+gralloc_module_blit_stamp_to_handle(const gralloc_module_t *module,
+									unsigned long long src_stamp,
+									int src_width, int src_height,
+									int src_format, int src_stride_in_pixels,
+									int src_rotation, buffer_handle_t dest,
+									int dest_rotation, int input_fence,
+									int *output_fence)
+{
+	return module->perform(module, GRALLOC_MODULE_BLIT_STAMP_TO_HANDLE_IMG,
+						   src_stamp, src_width, src_height, src_format,
+						   src_stride_in_pixels, src_rotation, dest,
+						   dest_rotation, input_fence, output_fence);
+}
+
+#endif /* HAL_PUBLIC_H */
diff --git a/moorefield_hdmi/ips/tangier/TngDisplayContext.cpp b/moorefield_hdmi/ips/tangier/TngDisplayContext.cpp
index 789d80f..e755988 100755
--- a/moorefield_hdmi/ips/tangier/TngDisplayContext.cpp
+++ b/moorefield_hdmi/ips/tangier/TngDisplayContext.cpp
@@ -42,15 +42,15 @@
     CTRACE();
 
     // open frame buffer device
-    const hw_device_t *gralloc;
-    int err = gralloc_open_img(&gralloc);
+    gralloc_module_t const* module;
+    int err = hw_get_module(GRALLOC_HARDWARE_MODULE_ID, (hw_module_t const**)&module);
     if (err) {
         ELOGTRACE("failed to load gralloc module, error = %d", err);
         return false;
     }
 
     // init IMG display device
-    err = gralloc_get_display_device_img(gralloc, (void **)&mIMGDisplayDevice);
+    err = module->perform(module, GRALLOC_MODULE_GET_DISPLAY_DEVICE_IMG, (void **)&mIMGDisplayDevice);
     if (err) {
         ELOGTRACE("failed to get display device, error = %d", err);
         return false;
diff --git a/moorefield_hdmi/ips/tangier/TngGrallocBufferMapper.cpp b/moorefield_hdmi/ips/tangier/TngGrallocBufferMapper.cpp
index 6e544e3..91e6192 100644
--- a/moorefield_hdmi/ips/tangier/TngGrallocBufferMapper.cpp
+++ b/moorefield_hdmi/ips/tangier/TngGrallocBufferMapper.cpp
@@ -22,10 +22,10 @@
 namespace android {
 namespace intel {
 
-TngGrallocBufferMapper::TngGrallocBufferMapper(const hw_device_t& gralloc,
-                                               DataBuffer& buffer)
+TngGrallocBufferMapper::TngGrallocBufferMapper(gralloc_module_t const& module,
+                                                    DataBuffer& buffer)
     : GrallocBufferMapperBase(buffer),
-      mGralloc(gralloc),
+      mGrallocModule(module),
       mBufferObject(0)
 {
     CTRACE();
@@ -122,7 +122,8 @@
 
     CTRACE();
     // get virtual address
-    err = gralloc_get_buffer_cpu_addresses_img(&mGralloc,
+    err = mGrallocModule.perform(&mGrallocModule,
+                                  GRALLOC_MODULE_GET_BUFFER_CPU_ADDRESSES_IMG,
                                   (buffer_handle_t)mClonedHandle,
                                   vaddr,
                                   size);
@@ -161,7 +162,8 @@
         }
     }
 
-    err = gralloc_put_buffer_cpu_addresses_img(&mGralloc,
+    err = mGrallocModule.perform(&mGrallocModule,
+                                  GRALLOC_MODULE_PUT_BUFFER_CPU_ADDRESSES_IMG,
                                   (buffer_handle_t)mClonedHandle);
     return false;
 }
@@ -182,7 +184,8 @@
         mSize[i] = 0;
     }
 
-    err = gralloc_put_buffer_cpu_addresses_img(&mGralloc,
+    err = mGrallocModule.perform(&mGrallocModule,
+                                  GRALLOC_MODULE_PUT_BUFFER_CPU_ADDRESSES_IMG,
                                   (buffer_handle_t)mClonedHandle);
     if (err) {
         ELOGTRACE("failed to unmap. err = %d", err);
@@ -236,7 +239,8 @@
     }
 
     // get virtual address
-    err = gralloc_get_buffer_cpu_addresses_img(&mGralloc,
+    err = mGrallocModule.perform(&mGrallocModule,
+                                  GRALLOC_MODULE_GET_BUFFER_CPU_ADDRESSES_IMG,
                                   (buffer_handle_t)mClonedHandle,
                                   vaddr,
                                   size);
@@ -250,7 +254,8 @@
 
 void TngGrallocBufferMapper::putFbHandle()
 {
-    int err = gralloc_put_buffer_cpu_addresses_img(&mGralloc,
+    int err = mGrallocModule.perform(&mGrallocModule,
+                                  GRALLOC_MODULE_PUT_BUFFER_CPU_ADDRESSES_IMG,
                                   (buffer_handle_t)mClonedHandle);
     if (err) {
         ELOGTRACE("failed to unmap. err = %d", err);
diff --git a/moorefield_hdmi/ips/tangier/TngGrallocBufferMapper.h b/moorefield_hdmi/ips/tangier/TngGrallocBufferMapper.h
index 94ed8db..aaf6d4a 100644
--- a/moorefield_hdmi/ips/tangier/TngGrallocBufferMapper.h
+++ b/moorefield_hdmi/ips/tangier/TngGrallocBufferMapper.h
@@ -25,7 +25,8 @@
 
 class TngGrallocBufferMapper : public GrallocBufferMapperBase {
 public:
-    TngGrallocBufferMapper(const hw_device_t& gralloc, DataBuffer& buffer);
+    TngGrallocBufferMapper(gralloc_module_t const& module,
+                               DataBuffer& buffer);
     virtual ~TngGrallocBufferMapper();
 public:
     bool map();
@@ -39,7 +40,7 @@
     bool mapKhandle();
 
 private:
-    const hw_device_t& mGralloc;
+    gralloc_module_t const& mGrallocModule;
     void* mBufferObject;
     native_handle_t* mClonedHandle;
 };
diff --git a/moorefield_hdmi/platforms/merrifield_plus/PlatfBufferManager.cpp b/moorefield_hdmi/platforms/merrifield_plus/PlatfBufferManager.cpp
index d1ea6e9..0a506d0 100755
--- a/moorefield_hdmi/platforms/merrifield_plus/PlatfBufferManager.cpp
+++ b/moorefield_hdmi/platforms/merrifield_plus/PlatfBufferManager.cpp
@@ -50,7 +50,7 @@
 
 BufferMapper* PlatfBufferManager::createBufferMapper(DataBuffer& buffer)
 {
-    return new TngGrallocBufferMapper(*mGralloc, buffer);
+    return new TngGrallocBufferMapper(*mGrallocModule, buffer);
 }
 
 bool PlatfBufferManager::blitGrallocBuffer(uint32_t srcHandle, uint32_t dstHandle,
@@ -59,7 +59,8 @@
 {
     int fenceFd;
 
-    if (gralloc_blit_handle_to_handle_img(mGralloc,
+    if (mGrallocModule->perform(mGrallocModule,
+                                GRALLOC_MODULE_BLIT_HANDLE_TO_HANDLE_IMG,
                                 (buffer_handle_t)srcHandle,
                                 (buffer_handle_t)dstHandle,
                                 srcCrop.w, srcCrop.h, srcCrop.x,
