diff --git a/libs/ui/Overlay.cpp b/libs/ui/Overlay.cpp
index 2267c3e..a79950c 100644
--- a/libs/ui/Overlay.cpp
+++ b/libs/ui/Overlay.cpp
@@ -16,86 +16,114 @@
 
 #include <utils/IMemory.h>
 #include <utils/Parcel.h>
+#include <utils/Errors.h>
+#include <utils/MemoryHeapBase.h>
 
 #include <ui/IOverlay.h>
 #include <ui/Overlay.h>
 
+#include <hardware/overlay.h>
+
 namespace android {
 
-Overlay::Overlay(overlay_handle_t* handle, 
-        const sp<IOverlay>& o, const sp<IMemoryHeap>& heap, 
-        uint32_t w, uint32_t h, int32_t f, uint32_t ws, uint32_t hs)
-    : mOverlay(o), mHeap(heap), mCurrentBufferOffset(0), mOverlayHandle(handle),
-      mWidth(w), mHeight(h), mFormat(f), mWidthStride(ws), mHeightStride(hs)
+Overlay::Overlay(const sp<OverlayRef>& overlayRef)
+    : mOverlayRef(overlayRef), mOverlayData(0), mStatus(NO_INIT)
 {
+    mOverlayData = NULL;
+    hw_module_t const* module;
+    if (hw_get_module(OVERLAY_HARDWARE_MODULE_ID, &module) == 0) {
+        if (overlay_data_open(module, &mOverlayData) == NO_ERROR) {
+            mStatus = mOverlayData->initialize(mOverlayData,
+                    overlayRef->mOverlayHandle);
+        }
+    }
 }
 
-Overlay::Overlay(overlay_t* overlay, 
-        const sp<IOverlay>& o, const sp<IMemoryHeap>& heap)
-    : mOverlay(o), mHeap(heap) 
-{
-    mCurrentBufferOffset = 0; 
-    mOverlayHandle = overlay->getHandleRef(overlay);
-    mWidth = overlay->w;
-    mHeight = overlay->h;
-    mFormat = overlay->format; 
-    mWidthStride = overlay->w_stride;
-    mHeightStride = overlay->h_stride;
-}
-
-
 Overlay::~Overlay() {
+    if (mOverlayData) {
+        overlay_data_close(mOverlayData);
+    }
+}
+
+overlay_buffer_t Overlay::dequeueBuffer()
+{
+    return mOverlayData->dequeueBuffer(mOverlayData);
+}
+
+int Overlay::queueBuffer(overlay_buffer_t buffer)
+{
+    return mOverlayData->queueBuffer(mOverlayData, buffer);
+}
+
+void* Overlay::getBufferAddress(overlay_buffer_t buffer)
+{
+    return mOverlayData->getBufferAddress(mOverlayData, buffer);
 }
 
 void Overlay::destroy() {  
-    mOverlay->destroy();
+    mOverlayRef->mOverlayChanel->destroy();
 }
 
-status_t Overlay::swapBuffers() {
-    ssize_t result = mOverlay->swapBuffers();
-    if (result < 0)
-        return status_t(result);
-    mCurrentBufferOffset = result;
-    return NO_ERROR;
+status_t Overlay::getStatus() const {
+    return mStatus;
 }
 
 overlay_handle_t const* Overlay::getHandleRef() const {
-    return mOverlayHandle;
-}
-
-size_t Overlay::getBufferOffset() const {
-    return mCurrentBufferOffset;
-}
-
-sp<IMemoryHeap> Overlay::getHeap() const {
-    return mHeap;
+    return mOverlayRef->mOverlayHandle;
 }
 
 uint32_t Overlay::getWidth() const {
-    return mWidth;
+    return mOverlayRef->mWidth;
 }
 
 uint32_t Overlay::getHeight() const {
-    return mHeight;
+    return mOverlayRef->mHeight;
 }
 
 int32_t Overlay::getFormat() const {
-    return mFormat;
+    return mOverlayRef->mFormat;
 }
 
 int32_t Overlay::getWidthStride() const {
-    return mWidthStride;
+    return mOverlayRef->mWidthStride;
 }
 
 int32_t Overlay::getHeightStride() const {
-    return mHeightStride;
+    return mOverlayRef->mHeightStride;
+}
+// ----------------------------------------------------------------------------
+
+OverlayRef::OverlayRef() 
+ : mOverlayHandle(0),
+    mWidth(0), mHeight(0), mFormat(0), mWidthStride(0), mHeightStride(0),
+    mOwnHandle(true)
+{    
 }
 
-sp<Overlay> Overlay::readFromParcel(const Parcel& data) {
-    sp<Overlay> result;
+OverlayRef::OverlayRef(overlay_handle_t const* handle, const sp<IOverlay>& chanel,
+         uint32_t w, uint32_t h, int32_t f, uint32_t ws, uint32_t hs)
+    : mOverlayHandle(handle), mOverlayChanel(chanel),
+    mWidth(w), mHeight(h), mFormat(f), mWidthStride(ws), mHeightStride(hs),
+    mOwnHandle(false)
+{
+}
+
+OverlayRef::~OverlayRef()
+{
+    if (mOwnHandle) {
+        /* FIXME: handles should be promoted to "real" API and be handled by 
+         * the framework */
+        for (int i=0 ; i<mOverlayHandle->numFds ; i++) {
+            close(mOverlayHandle->fds[i]);
+        }
+        free((void*)mOverlayHandle);
+    }
+}
+
+sp<OverlayRef> OverlayRef::readFromParcel(const Parcel& data) {
+    sp<OverlayRef> result;
     sp<IOverlay> overlay = IOverlay::asInterface(data.readStrongBinder());
     if (overlay != NULL) {
-        sp<IMemoryHeap> heap = IMemoryHeap::asInterface(data.readStrongBinder());
         uint32_t w = data.readInt32();
         uint32_t h = data.readInt32();
         uint32_t f = data.readInt32();
@@ -111,15 +139,21 @@
             handle->fds[i] = data.readFileDescriptor();
         for (int i=0 ; i<numint ; i++)
             handle->data[i] = data.readInt32();
-        result = new Overlay(handle, overlay, heap, w, h, f, ws, hs);
+        result = new OverlayRef();
+        result->mOverlayHandle = handle;
+        result->mOverlayChanel = overlay;
+        result->mWidth = w;
+        result->mHeight = h;
+        result->mFormat = f;
+        result->mWidthStride = ws;
+        result->mHeightStride = hs;
     }
     return result;
 }
 
-status_t Overlay::writeToParcel(Parcel* reply, const sp<Overlay>& o) {
+status_t OverlayRef::writeToParcel(Parcel* reply, const sp<OverlayRef>& o) {
     if (o != NULL) {
-        reply->writeStrongBinder(o->mOverlay->asBinder());
-        reply->writeStrongBinder(o->mHeap->asBinder());
+        reply->writeStrongBinder(o->mOverlayChanel->asBinder());
         reply->writeInt32(o->mWidth);
         reply->writeInt32(o->mHeight);
         reply->writeInt32(o->mFormat);
