diff --git a/system/gralloc/gralloc.cpp b/system/gralloc/gralloc.cpp
index 48b4079..2a5a174 100644
--- a/system/gralloc/gralloc.cpp
+++ b/system/gralloc/gralloc.cpp
@@ -331,12 +331,21 @@
     return 0;
 }
 
+static HostConnection* sHostCon = NULL;
+
+static HostConnection* createOrGetHostConnection() {
+    if (!sHostCon) {
+        sHostCon = HostConnection::createUnique();
+    }
+    return sHostCon;
+}
+
 #define DEFINE_HOST_CONNECTION \
-    HostConnection *hostCon = HostConnection::get(); \
+    HostConnection *hostCon = createOrGetHostConnection(); \
     ExtendedRCEncoderContext *rcEnc = (hostCon ? hostCon->rcEncoder() : NULL)
 
 #define DEFINE_AND_VALIDATE_HOST_CONNECTION \
-    HostConnection *hostCon = HostConnection::get(); \
+    HostConnection *hostCon = createOrGetHostConnection(); \
     if (!hostCon) { \
         ALOGE("gralloc: Failed to get host connection\n"); \
         return -EIO; \
@@ -351,7 +360,6 @@
     if (hostCon && hostCon->isGrallocOnly()) { \
         ALOGD("%s: exiting HostConnection (is buffer-handling thread)", \
               __FUNCTION__); \
-        HostConnection::exit(); \
     }
 
 #if PLATFORM_SDK_VERSION < 18
@@ -719,6 +727,8 @@
 
         cb->setFd(fd);
 
+        hostCon->lock();
+
         if (rcEnc->getDmaVersion() > 0) {
             D("%s: creating goldfish dma region of size %lu (cb fd %d)\n", __FUNCTION__, ashmem_size, cb->fd);
             init_gralloc_dmaregion();
@@ -726,6 +736,7 @@
         } else {
             cb->goldfish_dma.fd = -1;
         }
+        hostCon->unlock();
     } else {
         cb->goldfish_dma.fd = -1;
     }
@@ -741,11 +752,13 @@
             if (HAL_PIXEL_FORMAT_RGBX_8888 == format) {
                 allocFormat = GL_RGB;
             }
+            hostCon->lock();
             if (s_grdma) {
                 cb->hostHandle = rcEnc->rcCreateColorBufferDMA(rcEnc, w, h, allocFormat, cb->emuFrameworkFormat);
             } else {
                 cb->hostHandle = rcEnc->rcCreateColorBuffer(rcEnc, w, h, allocFormat);
             }
+            hostCon->unlock();
         }
 
         if (!cb->hostHandle) {
@@ -817,7 +830,9 @@
         if (*openCountPtr > 0) {
             DEFINE_AND_VALIDATE_HOST_CONNECTION;
             D("Closing host ColorBuffer 0x%x\n", cb->hostHandle);
+            hostCon->lock();
             rcEnc->rcCloseColorBuffer(rcEnc, cb->hostHandle);
+            hostCon->unlock();
         } else {
             D("A rcCloseColorBuffer is owed!!! sdk ver: %d", PLATFORM_SDK_VERSION);
             *openCountPtr = -1;
@@ -916,8 +931,10 @@
     (*postCountPtr)++;
 
     // send post request to host
+    hostCon->lock();
     rcEnc->rcFBPost(rcEnc, cb->hostHandle);
     hostCon->flush();
+    hostCon->unlock();
 
     return 0;
 }
@@ -959,8 +976,10 @@
     DEFINE_AND_VALIDATE_HOST_CONNECTION;
 
     // send request to host
+    hostCon->lock();
     rcEnc->rcFBSetSwapInterval(rcEnc, interval);
     hostCon->flush();
+    hostCon->unlock();
 
     return 0;
 }
@@ -1002,7 +1021,9 @@
     if (cb->hostHandle != 0 && !cb->hasRefcountPipe()) {
         DEFINE_AND_VALIDATE_HOST_CONNECTION;
         D("Opening host ColorBuffer 0x%x\n", cb->hostHandle);
+        hostCon->lock();
         rcEnc->rcOpenColorBuffer2(rcEnc, cb->hostHandle);
+        hostCon->unlock();
     }
 
     //
@@ -1024,10 +1045,12 @@
         }
 
         DEFINE_AND_VALIDATE_HOST_CONNECTION;
+        hostCon->lock();
         if (rcEnc->getDmaVersion() > 0) {
             init_gralloc_dmaregion();
             gralloc_dmaregion_register_ashmem(cb->ashmemSize);
         }
+        hostCon->unlock();
 
     }
 
@@ -1058,6 +1081,7 @@
     if (cb->hostHandle && !cb->hasRefcountPipe()) {
         D("Closing host ColorBuffer 0x%x\n", cb->hostHandle);
         DEFINE_AND_VALIDATE_HOST_CONNECTION;
+        hostCon->lock();
         rcEnc->rcCloseColorBuffer(rcEnc, cb->hostHandle);
 
         if (isHidlGralloc) {
@@ -1072,6 +1096,7 @@
                 }
             }
         }
+        hostCon->unlock();
         EXIT_GRALLOCONLY_HOST_CONNECTION;
 
     }
@@ -1087,7 +1112,6 @@
 
         if (!SHOULD_UNMAP) goto done;
 
-        DEFINE_AND_VALIDATE_HOST_CONNECTION;
 
         void *vaddr;
         int err = munmap((void *)cb->ashmemBase, cb->ashmemSize);
@@ -1098,7 +1122,6 @@
         cb->ashmemBase = 0;
         cb->mappedPid = 0;
         D("%s: Unregister buffer previous mapped to pid %d", __FUNCTION__, getpid());
-        EXIT_GRALLOCONLY_HOST_CONNECTION;
     }
 
 done:
@@ -1191,6 +1214,7 @@
     if (cb->hostHandle) {
         // Make sure we have host connection
         DEFINE_AND_VALIDATE_HOST_CONNECTION;
+        hostCon->lock();
 
         //
         // flush color buffer write cache on host and get its sync status.
@@ -1228,6 +1252,7 @@
                 delete [] tmpBuf;
             }
         }
+        hostCon->unlock();
     }
 
     //
@@ -1276,6 +1301,7 @@
 
         // Make sure we have host connection
         DEFINE_AND_VALIDATE_HOST_CONNECTION;
+        hostCon->lock();
 
         void *cpu_addr = (void *)(cb->ashmemBase + getAshmemColorOffset(cb));
 
@@ -1287,6 +1313,7 @@
             updateHostColorBuffer(cb, false, rgb_addr);
         }
 
+        hostCon->unlock();
         DD("gralloc_unlock success. cpu_addr: %p", cpu_addr);
     }
 
@@ -1423,8 +1450,8 @@
 
         // Create host connection and keep it in the TLS.
         // return error if connection with host can not be established
-        HostConnection *hostCon = HostConnection::get();
-        if (!hostCon) {
+        HostConnection *hostConn = createOrGetHostConnection();
+        if (!hostConn) {
             ALOGE("gralloc: failed to get host connection while opening %s\n", name);
             return -EIO;
         }
@@ -1458,6 +1485,7 @@
 
         // return error if connection with host can not be established
         DEFINE_AND_VALIDATE_HOST_CONNECTION;
+        hostCon->lock();
 
         //
         // Query the host for Framebuffer attributes
@@ -1477,6 +1505,7 @@
         D("gralloc: min_swap=%d\n", min_si);
         EGLint max_si = rcEnc->rcGetFBParam(rcEnc, FB_MAX_SWAP_INTERVAL);
         D("gralloc: max_swap=%d\n", max_si);
+        hostCon->unlock();
 
         //
         // Allocate memory for the framebuffer device
