Merge "Snap for 6198741 from 3efc6ea95c36171e12a955f6b9e8e3a6b4bf6b6c to sdk-release" into sdk-release
diff --git a/AndroidProducts.mk b/AndroidProducts.mk
index 77183bb..3310b9c 100644
--- a/AndroidProducts.mk
+++ b/AndroidProducts.mk
@@ -1,3 +1,4 @@
 PRODUCT_MAKEFILES := \
     $(LOCAL_DIR)/kernel-tests/goldfish_kernel_tests_x86_64.mk \
-    $(LOCAL_DIR)/sdk_phone_x86_vendor.mk
+    $(LOCAL_DIR)/sdk_phone_x86_vendor.mk \
+    $(LOCAL_DIR)/fvp.mk
diff --git a/MultiDisplayProvider/jni/com_android_emulator_multidisplay.cpp b/MultiDisplayProvider/jni/com_android_emulator_multidisplay.cpp
index ef4a053..54a1339 100644
--- a/MultiDisplayProvider/jni/com_android_emulator_multidisplay.cpp
+++ b/MultiDisplayProvider/jni/com_android_emulator_multidisplay.cpp
@@ -26,7 +26,6 @@
 #include <sys/epoll.h>
 
 #include "utils/Log.h"
-#include "../../include/qemu_pipe.h"
 #include "nativehelper/JNIHelp.h"
 #include <nativehelper/ScopedLocalRef.h>
 #include "jni.h"
@@ -65,14 +64,14 @@
         mConsumer->acquireBuffer(&bufferItem, 0);
         ANativeWindowBuffer* b = bufferItem.mGraphicBuffer->getNativeBuffer();
         if (b && b->handle) {
-            cb_handle_t* cb = (cb_handle_t*)(b->handle);
+            const cb_handle_t* cb = cb_handle_t::from(b->handle);
             if (mCb != cb->hostHandle) {
                 ALOGI("sent cb %d", cb->hostHandle);
                 mCb = cb->hostHandle;
                 uint32_t data[] = {mId, mCb};
                 std::vector<uint8_t> buf;
                 fillMsg(buf, BIND, (uint8_t*)data, sizeof(data));
-                WriteFully(gFd, buf.data(), buf.size());
+                qemu_pipe_write_fully(gFd, buf.data(), buf.size());
             }
         }
         else {
@@ -106,13 +105,13 @@
 
 static jint nativeOpen(JNIEnv* env, jobject obj) {
     // Open pipe
-    gFd = qemu_pipe_open("multidisplay");
+    gFd = qemu_pipe_open_ns(NULL, "multidisplay", O_RDWR);
     if (gFd < 0) {
         ALOGE("Error opening multidisplay pipe %d", gFd);
     } else {
         std::vector<uint8_t> buf;
         fillMsg(buf, QUERY, nullptr, 0);
-        WriteFully(gFd, buf.data(), buf.size());
+        qemu_pipe_write_fully(gFd, buf.data(), buf.size());
         ALOGI("multidisplay pipe connected!!!");
     }
     return gFd;
@@ -121,9 +120,9 @@
 static bool nativeReadPipe(JNIEnv* env, jobject obj, jintArray arr) {
     int* arrp = env->GetIntArrayElements(arr, 0);
     uint32_t length;
-    ReadFully(gFd, &length, sizeof(length));
+    qemu_pipe_read_fully(gFd, &length, sizeof(length));
     std::vector<uint8_t> args(length, 0);
-    ReadFully(gFd, args.data(), (size_t)length);
+    qemu_pipe_read_fully(gFd, args.data(), (size_t)length);
     switch(args[0]) {
         case ADD: {
             ALOGV("received add event");
diff --git a/arm32-vendor.mk b/arm32-vendor.mk
index d94b99c..f447325 100644
--- a/arm32-vendor.mk
+++ b/arm32-vendor.mk
@@ -2,8 +2,6 @@
 PRODUCT_PROPERTY_OVERRIDES += \
        vendor.rild.libpath=/vendor/lib/libgoldfish-ril.so
 
-DEVICE_MANIFEST_FILE := device/generic/goldfish/manifest-arm.xml
-
 # Note: the following lines need to stay at the beginning so that it can
 # take priority  and override the rules it inherit from other mk files
 # see copy file rules in core/Makefile
diff --git a/arm64-vendor.mk b/arm64-vendor.mk
index b97ccfc..6343136 100644
--- a/arm64-vendor.mk
+++ b/arm64-vendor.mk
@@ -2,8 +2,6 @@
 PRODUCT_PROPERTY_OVERRIDES += \
        vendor.rild.libpath=/vendor/lib64/libgoldfish-ril.so
 
-DEVICE_MANIFEST_FILE := device/generic/goldfish/manifest-arm.xml
-
 # Note: the following lines need to stay at the beginning so that it can
 # take priority  and override the rules it inherit from other mk files
 # see copy file rules in core/Makefile
diff --git a/audio/audio_hw.c b/audio/audio_hw.c
index 071b47f..e4db967 100644
--- a/audio/audio_hw.c
+++ b/audio/audio_hw.c
@@ -381,7 +381,7 @@
     }
 
     if (get) {
-        str = strdup(str_parms_to_str(reply));
+        str = str_parms_to_str(reply);
     }
     else {
         ALOGD("%s Unsupported paramter: %s", __FUNCTION__, keys);
@@ -917,7 +917,7 @@
     }
 
     if (get) {
-        str = strdup(str_parms_to_str(reply));
+        str = str_parms_to_str(reply);
     }
     else {
         ALOGD("%s Unsupported paramter: %s", __FUNCTION__, keys);
diff --git a/audio/audio_hw_legacy.c b/audio/audio_hw_legacy.c
index 3d6a253..d1bbbe3 100644
--- a/audio/audio_hw_legacy.c
+++ b/audio/audio_hw_legacy.c
@@ -161,7 +161,7 @@
     ret = str_parms_get_str(query, AUDIO_PARAMETER_STREAM_ROUTING, value, sizeof(value));
     if (ret >= 0) {
         str_parms_add_int(reply, AUDIO_PARAMETER_STREAM_ROUTING, out->device);
-        str = strdup(str_parms_to_str(reply));
+        str = str_parms_to_str(reply);
     } else {
         str = strdup(keys);
     }
@@ -318,7 +318,7 @@
     ret = str_parms_get_str(query, AUDIO_PARAMETER_STREAM_ROUTING, value, sizeof(value));
     if (ret >= 0) {
         str_parms_add_int(reply, AUDIO_PARAMETER_STREAM_ROUTING, in->device);
-        str = strdup(str_parms_to_str(reply));
+        str = str_parms_to_str(reply);
     } else {
         str = strdup(keys);
     }
diff --git a/camera/Android.mk b/camera/Android.mk
index e5a1b04..4a6cf7c 100644
--- a/camera/Android.mk
+++ b/camera/Android.mk
@@ -12,7 +12,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-ifneq ($(filter generic_x86 generic_x86_64 generic generic_arm64 generic_x86_arm, $(TARGET_DEVICE)),)
+ifneq ($(filter generic_x86 generic_x86_64 generic generic_arm64 generic_x86_64_arm64 generic_x86_arm, $(TARGET_DEVICE)),)
 
 LOCAL_PATH := $(call my-dir)
 
@@ -37,7 +37,8 @@
     libdl \
     libjpeg \
     libcamera_metadata \
-    libhardware
+    libcbmanager \
+    android.hardware.graphics.mapper@2.0 \
 
 emulator_camera_static_libraries := \
 	android.hardware.camera.common@1.0-helper \
@@ -48,6 +49,7 @@
 	external/libyuv/files/include \
 	frameworks/native/include/media/hardware \
 	$(LOCAL_PATH)/../include \
+	$(LOCAL_PATH)/../../goldfish-opengl/system/include \
 	$(LOCAL_PATH)/../../goldfish-opengl/system/OpenglSystemCommon \
 	$(LOCAL_PATH)/../../goldfish-opengl/shared/OpenglCodecCommon \
 	$(call include-path-for, camera)
@@ -130,6 +132,7 @@
 
 include ${CLEAR_VARS}
 
+LOCAL_VENDOR_MODULE := true
 LOCAL_MODULE_RELATIVE_PATH := ${emulator_camera_module_relative_path}
 LOCAL_CFLAGS := ${emulator_camera_cflags}
 LOCAL_CLANG_CFLAGS += ${emulator_camera_clang_flags}
diff --git a/camera/EmulatedBaseCamera.h b/camera/EmulatedBaseCamera.h
index abaed98..a487a47 100644
--- a/camera/EmulatedBaseCamera.h
+++ b/camera/EmulatedBaseCamera.h
@@ -57,6 +57,8 @@
      ***************************************************************************/
 
   public:
+    int getCameraId() const { return mCameraID; }
+
     /* Creates connection to the emulated camera device.
      * This method is called in response to hw_module_methods_t::open callback.
      * NOTE: When this method is called the object is locked.
diff --git a/camera/EmulatedCamera.cpp b/camera/EmulatedCamera.cpp
index f24da22..389ef40 100755
--- a/camera/EmulatedCamera.cpp
+++ b/camera/EmulatedCamera.cpp
@@ -98,12 +98,13 @@
 }
 
 EmulatedCamera::EmulatedCamera(int cameraId,
-                               struct hw_module_t* module)
+                               struct hw_module_t* module,
+                               CbManager* cbManager)
         : EmulatedBaseCamera(cameraId,
                 HARDWARE_DEVICE_API_VERSION(1, 0),
                 &common,
                 module),
-          mPreviewWindow(),
+          mPreviewWindow(cbManager),
           mCallbackNotifier()
 {
     /* camera_device v1 fields. */
diff --git a/camera/EmulatedCamera.h b/camera/EmulatedCamera.h
index 6df76b7..1990a47 100755
--- a/camera/EmulatedCamera.h
+++ b/camera/EmulatedCamera.h
@@ -31,6 +31,7 @@
 #include "EmulatedCameraDevice.h"
 #include "PreviewWindow.h"
 #include "CallbackNotifier.h"
+#include "cbmanager.h"
 
 using ::android::hardware::camera::common::V1_0::helper::CameraParameters;
 using ::android::hardware::camera::common::V1_0::helper::Size;
@@ -55,7 +56,8 @@
      *  module - Emulated camera HAL module descriptor.
      */
     EmulatedCamera(int cameraId,
-                   struct hw_module_t* module);
+                   struct hw_module_t* module,
+                   CbManager* cbManager);
 
     /* Destructs EmulatedCamera instance. */
     virtual ~EmulatedCamera();
diff --git a/camera/EmulatedCameraFactory.cpp b/camera/EmulatedCameraFactory.cpp
index 414289a..6815f7d 100755
--- a/camera/EmulatedCameraFactory.cpp
+++ b/camera/EmulatedCameraFactory.cpp
@@ -45,9 +45,6 @@
 
 EmulatedCameraFactory::EmulatedCameraFactory() :
         mQemuClient(),
-        mEmulatedCameras(nullptr),
-        mEmulatedCameraNum(0),
-        mFakeCameraNum(0),
         mConstructedOK(false),
         mCallbacks(nullptr) {
 
@@ -55,35 +52,28 @@
      * Figure out how many cameras need to be created, so we can allocate the
      * array of emulated cameras before populating it.
      */
-    int emulatedCamerasSize = 0;
 
     // QEMU Cameras
     std::vector<QemuCameraInfo> qemuCameras;
     if (mQemuClient.connectClient(nullptr) == NO_ERROR) {
         findQemuCameras(&qemuCameras);
-        emulatedCamerasSize += qemuCameras.size();
     }
 
+    int fakeCameraNum = 0;
     waitForQemuSfFakeCameraPropertyAvailable();
     // Fake Cameras
     if (isFakeCameraEmulationOn(/* backCamera */ true)) {
-        mFakeCameraNum++;
+        fakeCameraNum++;
     }
     if (isFakeCameraEmulationOn(/* backCamera */ false)) {
-        mFakeCameraNum++;
+        fakeCameraNum++;
     }
-    emulatedCamerasSize += mFakeCameraNum;
 
     /*
      * We have the number of cameras we need to create, now allocate space for
      * them.
      */
-    mEmulatedCameras = new EmulatedBaseCamera*[emulatedCamerasSize];
-    if (mEmulatedCameras == nullptr) {
-        ALOGE("%s: Unable to allocate emulated camera array for %d entries",
-                __FUNCTION__, mEmulatedCameraNum);
-        return;
-    }
+    mEmulatedCameras.reserve(qemuCameras.size() + fakeCameraNum);
 
     createQemuCameras(qemuCameras);
 
@@ -95,17 +85,16 @@
         createFakeCamera(/* backCamera */ false);
     }
 
-    ALOGE("%d cameras are being emulated. %d of them are fake cameras.",
-            mEmulatedCameraNum, mFakeCameraNum);
+    ALOGE("%zu cameras are being emulated. %d of them are fake cameras.",
+            mEmulatedCameras.size(), fakeCameraNum);
 
     // Create hotplug thread.
     {
-        Vector<int> cameraIdVector;
-        for (int i = 0; i < mEmulatedCameraNum; ++i) {
-            cameraIdVector.push_back(i);
+        std::vector<int> cameraIdVector;
+        for (const auto &camera: mEmulatedCameras) {
+            cameraIdVector.push_back(camera->getCameraId());
         }
-        mHotplugThread = new EmulatedCameraHotplugThread(&cameraIdVector[0],
-                                                         mEmulatedCameraNum);
+        mHotplugThread = new EmulatedCameraHotplugThread(std::move(cameraIdVector));
         mHotplugThread->run("EmulatedCameraHotplugThread");
     }
 
@@ -113,14 +102,7 @@
 }
 
 EmulatedCameraFactory::~EmulatedCameraFactory() {
-    if (mEmulatedCameras != nullptr) {
-        for (int n = 0; n < mEmulatedCameraNum; n++) {
-            if (mEmulatedCameras[n] != nullptr) {
-                delete mEmulatedCameras[n];
-            }
-        }
-        delete[] mEmulatedCameras;
-    }
+    mEmulatedCameras.clear();
 
     if (mHotplugThread != nullptr) {
         mHotplugThread->requestExit();
@@ -334,6 +316,42 @@
     }
 }
 
+std::unique_ptr<EmulatedBaseCamera>
+EmulatedCameraFactory::createQemuCameraImpl(int halVersion,
+                                            const QemuCameraInfo& camInfo,
+                                            int cameraId,
+                                            struct hw_module_t* module) {
+    status_t res;
+
+    switch (halVersion) {
+    case 1: {
+            auto camera = std::make_unique<EmulatedQemuCamera>(cameraId, module,
+                                                               &mCbManager);
+            res = camera->Initialize(camInfo.name, camInfo.frameDims, camInfo.dir);
+            if (res == NO_ERROR) {
+                return camera;
+            }
+        }
+        break;
+
+    case 3: {
+            auto camera = std::make_unique<EmulatedQemuCamera3>(cameraId, module, &mCbManager);
+            res = camera->Initialize(camInfo.name, camInfo.frameDims, camInfo.dir);
+            if (res == NO_ERROR) {
+                return camera;
+            }
+        }
+        break;
+
+    default:
+        ALOGE("%s: QEMU support for camera hal version %d is not "
+              "implemented", __func__, halVersion);
+        break;
+    }
+
+    return nullptr;
+}
+
 void EmulatedCameraFactory::createQemuCameras(
         const std::vector<QemuCameraInfo> &qemuCameras) {
     /*
@@ -352,132 +370,66 @@
          * Here, we're assuming the first webcam is intended to be the back
          * camera and any other webcams are front cameras.
          */
-        int halVersion = 0;
-        if (qemuIndex == 0) {
-            halVersion = getCameraHalVersion(/* backCamera */ true);
-        } else {
-            halVersion = getCameraHalVersion(/* backCamera */ false);
+        const bool isBackcamera = (qemuIndex == 0);
+        const int halVersion = getCameraHalVersion(isBackcamera);
+
+        std::unique_ptr<EmulatedBaseCamera> camera =
+            createQemuCameraImpl(halVersion,
+                                 cameraInfo,
+                                 mEmulatedCameras.size(),
+                                 &HAL_MODULE_INFO_SYM.common);
+        if (camera) {
+            mEmulatedCameras.push_back(std::move(camera));
         }
 
-        // Create and initialize QEMU camera.
-        EmulatedBaseCamera *qemuCam = nullptr;
-        status_t res;
-        switch (halVersion) {
-            case 1:
-                EmulatedQemuCamera *qemuCamOne;
-                qemuCamOne = new EmulatedQemuCamera(
-                        mEmulatedCameraNum, &HAL_MODULE_INFO_SYM.common);
-                if (qemuCamOne == nullptr) {
-                    ALOGE("%s: Unable to instantiate EmulatedQemuCamera",
-                            __FUNCTION__);
-                } else {
-                    /*
-                     * We have to initialize in each switch case, because
-                     * EmulatedBaseCamera::Initialize has a different method
-                     * signature.
-                     *
-                     * TODO: Having an EmulatedBaseQemuCamera class
-                     * could fix this issue.
-                     */
-                    res = qemuCamOne->Initialize(
-                            cameraInfo.name,
-                            cameraInfo.frameDims,
-                            cameraInfo.dir);
-                }
-                qemuCam = qemuCamOne;
-                break;
-            case 2:
-                ALOGE("%s: QEMU support for camera hal version %d is not "
-                        "implemented", __FUNCTION__, halVersion);
-                break;
-            case 3:
-                EmulatedQemuCamera3 *qemuCamThree;
-                qemuCamThree = new EmulatedQemuCamera3(
-                        mEmulatedCameraNum, &HAL_MODULE_INFO_SYM.common);
-                if (qemuCamThree == nullptr) {
-                    ALOGE("%s: Unable to instantiate EmulatedQemuCamera3",
-                            __FUNCTION__);
-                } else {
-                    res = qemuCamThree->Initialize(
-                            cameraInfo.name,
-                            cameraInfo.frameDims,
-                            cameraInfo.dir);
-                }
-                qemuCam = qemuCamThree;
-                break;
-            default:
-                ALOGE("%s: Unknown camera hal version requested: %d",
-                        __FUNCTION__, halVersion);
-        }
+        qemuIndex++;
+    }
+}
 
-        if (qemuCam == nullptr) {
-            ALOGE("%s: Unable to instantiate EmulatedQemuCamera",
-                    __FUNCTION__);
-        } else {
-            if (res == NO_ERROR) {
-                mEmulatedCameras[mEmulatedCameraNum] = qemuCam;
-                qemuIndex++;
-                mEmulatedCameraNum++;
+std::unique_ptr<EmulatedBaseCamera>
+EmulatedCameraFactory::createFakeCameraImpl(bool backCamera,
+                                            int halVersion,
+                                            int cameraId,
+                                            struct hw_module_t* module) {
+    switch (halVersion) {
+    case 1:
+        return std::make_unique<EmulatedFakeCamera>(cameraId, backCamera, module, &mCbManager);
+
+    case 2:
+        return std::make_unique<EmulatedFakeCamera2>(cameraId, backCamera, module, &mCbManager);
+
+    case 3: {
+            static const char key[] = "ro.kernel.qemu.camera.fake.rotating";
+            char prop[PROPERTY_VALUE_MAX];
+
+            if (property_get(key, prop, nullptr) > 0) {
+                return std::make_unique<EmulatedFakeCamera>(cameraId, backCamera, module, &mCbManager);
             } else {
-                delete qemuCam;
+                return std::make_unique<EmulatedFakeCamera3>(cameraId, backCamera, module, &mCbManager);
             }
         }
+
+    default:
+        ALOGE("%s: Unknown %s camera hal version requested: %d",
+              __func__, backCamera ? "back" : "front", halVersion);
+        return nullptr;
     }
 }
 
 void EmulatedCameraFactory::createFakeCamera(bool backCamera) {
-    int halVersion = getCameraHalVersion(backCamera);
+    const int halVersion = getCameraHalVersion(backCamera);
 
-    /*
-     * Create and initialize the fake camera, using the index into
-     * mEmulatedCameras as the camera ID.
-     */
-    switch (halVersion) {
-        case 1:
-            mEmulatedCameras[mEmulatedCameraNum] =
-                    new EmulatedFakeCamera(mEmulatedCameraNum, backCamera,
-                            &HAL_MODULE_INFO_SYM.common);
-            break;
-        case 2:
-            mEmulatedCameras[mEmulatedCameraNum] =
-                    new EmulatedFakeCamera2(mEmulatedCameraNum, backCamera,
-                            &HAL_MODULE_INFO_SYM.common);
-            break;
-        case 3:
-            {
-                const char *key = "ro.kernel.qemu.camera.fake.rotating";
-                char prop[PROPERTY_VALUE_MAX];
-                if (property_get(key, prop, nullptr) > 0) {
-                    mEmulatedCameras[mEmulatedCameraNum] =
-                        new EmulatedFakeCamera(mEmulatedCameraNum, backCamera,
-                                &HAL_MODULE_INFO_SYM.common);
-                } else {
-                    mEmulatedCameras[mEmulatedCameraNum] =
-                        new EmulatedFakeCamera3(mEmulatedCameraNum, backCamera,
-                                &HAL_MODULE_INFO_SYM.common);
-                }
-            }
-            break;
-        default:
-            ALOGE("%s: Unknown %s camera hal version requested: %d",
-                    __FUNCTION__, backCamera ? "back" : "front", halVersion);
-    }
+    std::unique_ptr<EmulatedBaseCamera> camera = createFakeCameraImpl(
+        backCamera, halVersion, mEmulatedCameras.size(),
+        &HAL_MODULE_INFO_SYM.common);
 
-    if (mEmulatedCameras[mEmulatedCameraNum] == nullptr) {
-        ALOGE("%s: Unable to instantiate fake camera class", __FUNCTION__);
+    status_t res = camera->Initialize();
+    if (res == NO_ERROR) {
+        mEmulatedCameras.push_back(std::move(camera));
     } else {
-        ALOGV("%s: %s camera device version is %d", __FUNCTION__,
-                backCamera ? "Back" : "Front", halVersion);
-        status_t res = mEmulatedCameras[mEmulatedCameraNum]->Initialize();
-        if (res == NO_ERROR) {
-            // Camera creation and initialization was successful.
-            mEmulatedCameraNum++;
-        } else {
-            ALOGE("%s: Unable to initialize %s camera %d: %s (%d)",
-                    __FUNCTION__, backCamera ? "back" : "front",
-                    mEmulatedCameraNum, strerror(-res), res);
-            delete mEmulatedCameras[mEmulatedCameraNum];
-        }
+        ALOGE("%s: Unable to initialize %s camera %zu: %s (%d)",
+              __func__, backCamera ? "back" : "front",
+              mEmulatedCameras.size(), strerror(-res), res);
     }
 }
 
@@ -546,7 +498,7 @@
 
 void EmulatedCameraFactory::onStatusChanged(int cameraId, int newStatus) {
 
-    EmulatedBaseCamera *cam = mEmulatedCameras[cameraId];
+    EmulatedBaseCamera *cam = mEmulatedCameras[cameraId].get();
     if (!cam) {
         ALOGE("%s: Invalid camera ID %d", __FUNCTION__, cameraId);
         return;
diff --git a/camera/EmulatedCameraFactory.h b/camera/EmulatedCameraFactory.h
index 4091bfc..10e759e 100755
--- a/camera/EmulatedCameraFactory.h
+++ b/camera/EmulatedCameraFactory.h
@@ -19,6 +19,7 @@
 
 #include "EmulatedBaseCamera.h"
 #include "QemuClient.h"
+#include "cbmanager.h"
 
 #include <cutils/properties.h>
 
@@ -169,7 +170,7 @@
      * Gets number of emulated cameras.
      */
     int getEmulatedCameraNum() const {
-        return mEmulatedCameraNum;
+        return mEmulatedCameras.size();
     }
 
     /*
@@ -223,6 +224,12 @@
      */
     void createQemuCameras(const std::vector<QemuCameraInfo> &qemuCameras);
 
+    std::unique_ptr<EmulatedBaseCamera> createQemuCameraImpl(
+        int halVersion,
+        const QemuCameraInfo& cameraInfo,
+        int cameraId,
+        struct hw_module_t* module);
+
     /*
      * Creates a fake camera and adds it to mEmulatedCameras. If backCamera is
      * true, it will be created as if it were a camera on the back of the phone.
@@ -230,6 +237,12 @@
      */
     void createFakeCamera(bool backCamera);
 
+    std::unique_ptr<EmulatedBaseCamera> createFakeCameraImpl(
+        bool backCamera,
+        int halVersion,
+        int cameraId,
+        struct hw_module_t* module);
+
     /*
      * Waits till qemu-props has done setup, timeout after 500ms.
      */
@@ -254,14 +267,11 @@
     // Connection to the camera service in the emulator.
     FactoryQemuClient mQemuClient;
 
+    // API to manipulate color buffers
+    CbManager mCbManager;
+
     // Array of cameras available for the emulation.
-    EmulatedBaseCamera **mEmulatedCameras;
-
-    // Number of emulated cameras (including the fake ones).
-    int mEmulatedCameraNum;
-
-    // Number of emulated fake cameras.
-    int mFakeCameraNum;
+    std::vector<std::unique_ptr<EmulatedBaseCamera>> mEmulatedCameras;
 
     // Flags whether or not constructor has succeeded.
     bool mConstructedOK;
diff --git a/camera/EmulatedCameraHotplugThread.cpp b/camera/EmulatedCameraHotplugThread.cpp
index f7782be..f80b531 100644
--- a/camera/EmulatedCameraHotplugThread.cpp
+++ b/camera/EmulatedCameraHotplugThread.cpp
@@ -24,6 +24,7 @@
 
 #include "EmulatedCameraHotplugThread.h"
 #include "EmulatedCameraFactory.h"
+#include "qemu_pipe.h"
 
 #define FAKE_HOTPLUG_FILE "/data/misc/media/emulator.camera.hotplug"
 
@@ -35,20 +36,12 @@
 namespace android {
 
 EmulatedCameraHotplugThread::EmulatedCameraHotplugThread(
-    const int* cameraIdArray,
-    size_t size) :
-        Thread(/*canCallJava*/false) {
+    std::vector<int> subscribedCameraIds) :
+        Thread(/*canCallJava*/false),
+        mSubscribedCameraIds(std::move(subscribedCameraIds)) {
 
     mRunning = true;
     mInotifyFd = 0;
-
-    for (size_t i = 0; i < size; ++i) {
-        int id = cameraIdArray[i];
-
-        if (createFileIfNotExists(id)) {
-            mSubscribedCameraIds.push_back(id);
-        }
-    }
 }
 
 EmulatedCameraHotplugThread::~EmulatedCameraHotplugThread() {
@@ -116,11 +109,7 @@
          * For each fake camera file, add a watch for when
          * the file is closed (if it was written to)
          */
-        Vector<int>::const_iterator it, end;
-        it = mSubscribedCameraIds.begin();
-        end = mSubscribedCameraIds.end();
-        for (; it != end; ++it) {
-            int cameraId = *it;
+        for (int cameraId: mSubscribedCameraIds) {
             if (!addWatch(cameraId)) {
                 mRunning = false;
                 break;
@@ -146,7 +135,7 @@
     // If requestExit was already called, mRunning will be false
     while (mRunning) {
         char buffer[EVENT_BUF_LEN];
-        int length = TEMP_FAILURE_RETRY(
+        int length = QEMU_PIPE_RETRY(
                         read(mInotifyFd, buffer, EVENT_BUF_LEN));
 
         if (length < 0) {
@@ -223,39 +212,12 @@
     return String8::format(FAKE_HOTPLUG_FILE ".%d", cameraId);
 }
 
-bool EmulatedCameraHotplugThread::createFileIfNotExists(int cameraId) const
-{
-    String8 filePath = getFilePath(cameraId);
-    // make sure this file exists and we have access to it
-    int fd = TEMP_FAILURE_RETRY(
-                open(filePath.string(), O_WRONLY | O_CREAT | O_TRUNC,
-                     /* mode = ug+rwx */ S_IRWXU | S_IRWXG ));
-    if (fd == -1) {
-        ALOGE("%s: Could not create file '%s', error: '%s' (%d)",
-             __FUNCTION__, filePath.string(), strerror(errno), errno);
-        return false;
-    }
-
-    // File has '1' by default since we are plugged in by default
-    if (TEMP_FAILURE_RETRY(write(fd, "1\n", /*count*/2)) == -1) {
-        ALOGE("%s: Could not write '1' to file '%s', error: '%s' (%d)",
-             __FUNCTION__, filePath.string(), strerror(errno), errno);
-        return false;
-    }
-
-    close(fd);
-    return true;
-}
-
 int EmulatedCameraHotplugThread::getCameraId(const String8& filePath) const {
-    Vector<int>::const_iterator it, end;
-    it = mSubscribedCameraIds.begin();
-    end = mSubscribedCameraIds.end();
-    for (; it != end; ++it) {
-        String8 camPath = getFilePath(*it);
+    for (int cameraId: mSubscribedCameraIds) {
+        String8 camPath = getFilePath(cameraId);
 
         if (camPath == filePath) {
-            return *it;
+            return cameraId;
         }
     }
 
@@ -337,7 +299,7 @@
 
 int EmulatedCameraHotplugThread::readFile(const String8& filePath) const {
 
-    int fd = TEMP_FAILURE_RETRY(
+    int fd = QEMU_PIPE_RETRY(
                 open(filePath.string(), O_RDONLY, /*mode*/0));
     if (fd == -1) {
         ALOGE("%s: Could not open file '%s', error: '%s' (%d)",
@@ -348,7 +310,7 @@
     char buffer[1];
     int length;
 
-    length = TEMP_FAILURE_RETRY(
+    length = QEMU_PIPE_RETRY(
                     read(fd, buffer, sizeof(buffer)));
 
     int retval;
diff --git a/camera/EmulatedCameraHotplugThread.h b/camera/EmulatedCameraHotplugThread.h
index d286ff6..dfedb86 100644
--- a/camera/EmulatedCameraHotplugThread.h
+++ b/camera/EmulatedCameraHotplugThread.h
@@ -25,6 +25,7 @@
  * Refer to FAKE_HOTPLUG_FILE in EmulatedCameraHotplugThread.cpp
  */
 
+#include <vector>
 #include "EmulatedCamera2.h"
 #include <utils/String8.h>
 #include <utils/Vector.h>
@@ -32,7 +33,7 @@
 namespace android {
 class EmulatedCameraHotplugThread : public Thread {
   public:
-    EmulatedCameraHotplugThread(const int* cameraIdArray, size_t size);
+    EmulatedCameraHotplugThread(std::vector<int> subscribedCameraIds);
     ~EmulatedCameraHotplugThread();
 
     virtual void requestExit();
@@ -59,10 +60,8 @@
     String8 getFilePath(int cameraId) const;
     int readFile(const String8& filePath) const;
 
-    bool createFileIfNotExists(int cameraId) const;
-
     int mInotifyFd;
-    Vector<int> mSubscribedCameraIds;
+    std::vector<int> mSubscribedCameraIds;
     Vector<SubscriberInfo> mSubscribers;
 
     // variables above are unguarded:
diff --git a/camera/EmulatedFakeCamera.cpp b/camera/EmulatedFakeCamera.cpp
index bf41fb6..7d3f500 100755
--- a/camera/EmulatedFakeCamera.cpp
+++ b/camera/EmulatedFakeCamera.cpp
@@ -32,8 +32,9 @@
 
 EmulatedFakeCamera::EmulatedFakeCamera(int cameraId,
                                        bool facingBack,
-                                       struct hw_module_t* module)
-        : EmulatedCamera(cameraId, module),
+                                       struct hw_module_t* module,
+                                       CbManager* cbManager)
+        : EmulatedCamera(cameraId, module, cbManager),
           mFacingBack(facingBack),
           mFakeCameraDevice(nullptr)
 {
diff --git a/camera/EmulatedFakeCamera.h b/camera/EmulatedFakeCamera.h
index 00b340b..1ef8a79 100755
--- a/camera/EmulatedFakeCamera.h
+++ b/camera/EmulatedFakeCamera.h
@@ -24,6 +24,7 @@
  */
 
 #include "EmulatedCamera.h"
+#include "cbmanager.h"
 
 namespace android {
 
@@ -34,7 +35,7 @@
 class EmulatedFakeCamera : public EmulatedCamera {
 public:
     /* Constructs EmulatedFakeCamera instance. */
-    EmulatedFakeCamera(int cameraId, bool facingBack, struct hw_module_t* module);
+    EmulatedFakeCamera(int cameraId, bool facingBack, struct hw_module_t* module, CbManager* cbManager);
 
     /* Destructs EmulatedFakeCamera instance. */
     ~EmulatedFakeCamera();
diff --git a/camera/EmulatedFakeCamera2.cpp b/camera/EmulatedFakeCamera2.cpp
index 6bff5eb..7870e73 100644
--- a/camera/EmulatedFakeCamera2.cpp
+++ b/camera/EmulatedFakeCamera2.cpp
@@ -27,7 +27,7 @@
 
 #include "EmulatedFakeCamera2.h"
 #include "EmulatedCameraFactory.h"
-#include "GrallocModule.h"
+#include "cbmanager.h"
 
 #define ERROR_CAMERA_NOT_PRESENT (-EPIPE)
 
@@ -88,10 +88,12 @@
 
 EmulatedFakeCamera2::EmulatedFakeCamera2(int cameraId,
         bool facingBack,
-        struct hw_module_t* module)
+        struct hw_module_t* module,
+        CbManager* cbManager)
         : EmulatedCamera2(cameraId,module),
           mFacingBack(facingBack),
-          mIsConnected(false)
+          mIsConnected(false),
+          mCbManager(cbManager)
 {
     ALOGD("Constructing emulated fake camera 2 facing %s",
             facingBack ? "back" : "front");
@@ -173,7 +175,7 @@
     mReadoutThread = new ReadoutThread(this);
     mControlThread = new ControlThread(this);
     mSensor = new Sensor(mSensorWidth, mSensorHeight);
-    mJpegCompressor = new JpegCompressor();
+    mJpegCompressor = new JpegCompressor(mCbManager);
 
     mNextStreamId = 1;
     mNextReprocessStreamId = 1;
@@ -1068,8 +1070,8 @@
             }
 
             /* Lock the buffer from the perspective of the graphics mapper */
-            res = GrallocModule::getInstance().lock(*(b.buffer),
-                    GRALLOC_USAGE_HW_CAMERA_WRITE,
+            res = mParent->mCbManager->lockBuffer(*(b.buffer),
+                    (CbManager::BufferUsage::CAMERA_OUTPUT | 0),
                     0, 0, s.width, s.height,
                     (void**)&(b.img));
 
@@ -1096,8 +1098,8 @@
             }
 
             /* Lock the buffer from the perspective of the graphics mapper */
-            res = GrallocModule::getInstance().lock(*(b.buffer),
-                    GRALLOC_USAGE_HW_CAMERA_READ,
+            res = mParent->mCbManager->lockBuffer(*(b.buffer),
+                    (CbManager::BufferUsage::CAMERA_INPUT | 0),
                     0, 0, s.width, s.height,
                     (void**)&(b.img) );
             if (res != NO_ERROR) {
@@ -1375,7 +1377,7 @@
             } else {
                 ALOGV("Readout:    Sending image buffer %zu (%p) to output stream %d",
                         i, (void*)*(b.buffer), b.streamId);
-                GrallocModule::getInstance().unlock(*(b.buffer));
+                mParent->mCbManager->unlockBuffer(*(b.buffer));
                 const Stream &s = mParent->getStreamInfo(b.streamId);
                 res = s.ops->enqueue_buffer(s.ops, captureTime, b.buffer);
                 if (res != OK) {
@@ -1419,7 +1421,7 @@
     ALOGV("%s: Compression complete, pushing to stream %d", __FUNCTION__,
             jpegBuffer.streamId);
 
-    GrallocModule::getInstance().unlock(*(jpegBuffer.buffer));
+    mParent->mCbManager->unlockBuffer(*(jpegBuffer.buffer));
     const Stream &s = mParent->getStreamInfo(jpegBuffer.streamId);
     res = s.ops->enqueue_buffer(s.ops, mJpegTimestamp, jpegBuffer.buffer);
 }
@@ -1427,7 +1429,7 @@
 void EmulatedFakeCamera2::ReadoutThread::onJpegInputDone(
         const StreamBuffer &inputBuffer) {
     status_t res;
-    GrallocModule::getInstance().unlock(*(inputBuffer.buffer));
+    mParent->mCbManager->unlockBuffer(*(inputBuffer.buffer));
     const ReprocessStream &s =
             mParent->getReprocessStreamInfo(-inputBuffer.streamId);
     res = s.ops->release_buffer(s.ops, inputBuffer.buffer);
diff --git a/camera/EmulatedFakeCamera2.h b/camera/EmulatedFakeCamera2.h
index b695016..d652d33 100644
--- a/camera/EmulatedFakeCamera2.h
+++ b/camera/EmulatedFakeCamera2.h
@@ -27,6 +27,7 @@
 #include "fake-pipeline2/Base.h"
 #include "fake-pipeline2/Sensor.h"
 #include "fake-pipeline2/JpegCompressor.h"
+#include "cbmanager.h"
 #include <utils/Condition.h>
 #include <utils/KeyedVector.h>
 #include <utils/String8.h>
@@ -40,7 +41,7 @@
 class EmulatedFakeCamera2 : public EmulatedCamera2 {
 public:
     /* Constructs EmulatedFakeCamera instance. */
-    EmulatedFakeCamera2(int cameraId, bool facingBack, struct hw_module_t* module);
+    EmulatedFakeCamera2(int cameraId, bool facingBack, struct hw_module_t* module, CbManager* cbManager);
 
     /* Destructs EmulatedFakeCamera instance. */
     ~EmulatedFakeCamera2();
@@ -415,6 +416,7 @@
 
     KeyedVector<uint32_t, Stream> mStreams;
     KeyedVector<uint32_t, ReprocessStream> mReprocessStreams;
+    CbManager* mCbManager;
 
     /** Simulated hardware interfaces */
     sp<Sensor> mSensor;
diff --git a/camera/EmulatedFakeCamera3.cpp b/camera/EmulatedFakeCamera3.cpp
index 16d4d13..6e918a7 100644
--- a/camera/EmulatedFakeCamera3.cpp
+++ b/camera/EmulatedFakeCamera3.cpp
@@ -30,7 +30,7 @@
 #include "EmulatedFakeCamera3.h"
 #include "EmulatedCameraFactory.h"
 #include <ui/Fence.h>
-#include "GrallocModule.h"
+#include "cbmanager.h"
 
 #include "fake-pipeline2/Sensor.h"
 #include "fake-pipeline2/JpegCompressor.h"
@@ -94,9 +94,9 @@
  */
 
 EmulatedFakeCamera3::EmulatedFakeCamera3(int cameraId, bool facingBack,
-        struct hw_module_t* module) :
+        struct hw_module_t* module, CbManager* cbManager) :
         EmulatedCamera3(cameraId, module),
-        mFacingBack(facingBack) {
+        mFacingBack(facingBack), mCbManager(cbManager) {
     ALOGI("Constructing emulated fake camera 3: ID %d, facing %s",
             mCameraID, facingBack ? "back" : "front");
 
@@ -156,7 +156,7 @@
     if (res != NO_ERROR) return res;
 
     mReadoutThread = new ReadoutThread(this);
-    mJpegCompressor = new JpegCompressor();
+    mJpegCompressor = new JpegCompressor(mCbManager);
 
     res = mReadoutThread->run("EmuCam3::readoutThread");
     if (res != NO_ERROR) return res;
@@ -949,10 +949,10 @@
             // Lock buffer for writing
             if (srcBuf.stream->format == HAL_PIXEL_FORMAT_YCbCr_420_888) {
                 if (destBuf.format == HAL_PIXEL_FORMAT_YCbCr_420_888) {
-                    android_ycbcr ycbcr = android_ycbcr();
-                    res = GrallocModule::getInstance().lock_ycbcr(
+                    CbManager::YCbCrLayout ycbcr = {};
+                    res = mCbManager->lockYCbCrBuffer(
                         *(destBuf.buffer),
-                        GRALLOC_USAGE_HW_CAMERA_WRITE,
+                        (CbManager::BufferUsage::CAMERA_OUTPUT | 0),
                         0, 0, destBuf.width, destBuf.height,
                         &ycbcr);
                     // This is only valid because we know that emulator's
@@ -964,9 +964,9 @@
                     res = INVALID_OPERATION;
                 }
             } else {
-                res = GrallocModule::getInstance().lock(
+                res = mCbManager->lockBuffer(
                     *(destBuf.buffer),
-                    GRALLOC_USAGE_HW_CAMERA_WRITE,
+                    (CbManager::BufferUsage::CAMERA_OUTPUT | 0),
                     0, 0, destBuf.width, destBuf.height,
                     (void**)&(destBuf.img));
 
@@ -985,8 +985,7 @@
             // Either waiting or locking failed. Unlock locked buffers and bail
             // out.
             for (size_t j = 0; j < i; j++) {
-                GrallocModule::getInstance().unlock(
-                        *(request->output_buffers[i].buffer));
+                mCbManager->unlockBuffer(*(request->output_buffers[i].buffer));
             }
             delete sensorBuffers;
             delete buffers;
@@ -2566,7 +2565,7 @@
                         __FUNCTION__, strerror(-res), res);
             // fallthrough for cleanup
         }
-        GrallocModule::getInstance().unlock(*(buf->buffer));
+        mParent->mCbManager->unlockBuffer(*(buf->buffer));
 
         buf->status = goodBuffer ? CAMERA3_BUFFER_STATUS_OK :
                 CAMERA3_BUFFER_STATUS_ERROR;
@@ -2668,7 +2667,7 @@
         const StreamBuffer &jpegBuffer, bool success) {
     Mutex::Autolock jl(mJpegLock);
 
-    GrallocModule::getInstance().unlock(*(jpegBuffer.buffer));
+    mParent->mCbManager->unlockBuffer(*(jpegBuffer.buffer));
 
     mJpegHalBuffer.status = success ?
             CAMERA3_BUFFER_STATUS_OK : CAMERA3_BUFFER_STATUS_ERROR;
diff --git a/camera/EmulatedFakeCamera3.h b/camera/EmulatedFakeCamera3.h
index 3093aef..bac12a7 100644
--- a/camera/EmulatedFakeCamera3.h
+++ b/camera/EmulatedFakeCamera3.h
@@ -27,6 +27,7 @@
 #include "fake-pipeline2/Base.h"
 #include "fake-pipeline2/Sensor.h"
 #include "fake-pipeline2/JpegCompressor.h"
+#include "cbmanager.h"
 #include <CameraMetadata.h>
 #include <utils/SortedVector.h>
 #include <utils/List.h>
@@ -50,7 +51,7 @@
 public:
 
     EmulatedFakeCamera3(int cameraId, bool facingBack,
-            struct hw_module_t* module);
+            struct hw_module_t* module, CbManager* cbManager);
 
     virtual ~EmulatedFakeCamera3();
 
@@ -161,6 +162,8 @@
 
     SortedVector<AvailableCapabilities> mCapabilities;
 
+    CbManager* mCbManager;
+
     /**
      * Cache for default templates. Once one is requested, the pointer must be
      * valid at least until close() is called on the device
diff --git a/camera/EmulatedFakeRotatingCameraDevice.cpp b/camera/EmulatedFakeRotatingCameraDevice.cpp
index fc1951e..84f1b88 100755
--- a/camera/EmulatedFakeRotatingCameraDevice.cpp
+++ b/camera/EmulatedFakeRotatingCameraDevice.cpp
@@ -26,7 +26,7 @@
 #include <log/log.h>
 #include "EmulatedFakeCamera.h"
 #include "EmulatedFakeRotatingCameraDevice.h"
-#include "qemud.h"
+#include "qemu_pipe.h"
 
 #include <EGL/egl.h>
 #include <GLES/gl.h>
@@ -284,7 +284,7 @@
 void EmulatedFakeRotatingCameraDevice::init_sensor() {
     if (mSensorPipe >=0) return;
     // create a sensor pipe
-    mSensorPipe = qemu_pipe_open(FAKE_CAMERA_SENSOR);
+    mSensorPipe = qemu_pipe_open_ns(NULL, FAKE_CAMERA_SENSOR, O_RDWR);
     if (mSensorPipe < 0) {
         ALOGE("cannot open %s", FAKE_CAMERA_SENSOR);
     } else {
@@ -296,10 +296,10 @@
     if (mSensorPipe < 0) return;
     char get[] = "get";
     int pipe_command_length = sizeof(get);
-    WriteFully(mSensorPipe, &pipe_command_length, sizeof(pipe_command_length));
-    WriteFully(mSensorPipe, get, pipe_command_length);
-    ReadFully(mSensorPipe, &pipe_command_length, sizeof(pipe_command_length));
-    ReadFully(mSensorPipe, &mSensorValues, pipe_command_length);
+    qemu_pipe_write_fully(mSensorPipe, &pipe_command_length, sizeof(pipe_command_length));
+    qemu_pipe_write_fully(mSensorPipe, get, pipe_command_length);
+    qemu_pipe_read_fully(mSensorPipe, &pipe_command_length, sizeof(pipe_command_length));
+    qemu_pipe_read_fully(mSensorPipe, &mSensorValues, pipe_command_length);
     assert(pipe_command_length == 9*sizeof(float));
     ALOGD("accel: %g %g %g; magnetic %g %g %g orientation %g %g %g",
             mSensorValues[SENSOR_VALUE_ACCEL_X], mSensorValues[SENSOR_VALUE_ACCEL_Y],
diff --git a/camera/EmulatedQemuCamera.cpp b/camera/EmulatedQemuCamera.cpp
index d08baad..2d581f1 100755
--- a/camera/EmulatedQemuCamera.cpp
+++ b/camera/EmulatedQemuCamera.cpp
@@ -33,8 +33,9 @@
 
 namespace android {
 
-EmulatedQemuCamera::EmulatedQemuCamera(int cameraId, struct hw_module_t* module)
-        : EmulatedCamera(cameraId, module),
+EmulatedQemuCamera::EmulatedQemuCamera(int cameraId, struct hw_module_t* module,
+                                       CbManager* cbManager)
+        : EmulatedCamera(cameraId, module, cbManager),
           mQemuCameraDevice(this)
 {
 }
diff --git a/camera/EmulatedQemuCamera.h b/camera/EmulatedQemuCamera.h
index 83397ef..975165a 100755
--- a/camera/EmulatedQemuCamera.h
+++ b/camera/EmulatedQemuCamera.h
@@ -24,6 +24,7 @@
 
 #include "EmulatedCamera.h"
 #include "EmulatedQemuCameraDevice.h"
+#include "cbmanager.h"
 
 namespace android {
 
@@ -32,7 +33,8 @@
 class EmulatedQemuCamera : public EmulatedCamera {
 public:
     /* Constructs EmulatedQemuCamera instance. */
-    EmulatedQemuCamera(int cameraId, struct hw_module_t* module);
+    EmulatedQemuCamera(int cameraId, struct hw_module_t* module,
+                       CbManager* cbManager);
 
     /* Destructs EmulatedQemuCamera instance. */
     ~EmulatedQemuCamera();
diff --git a/camera/EmulatedQemuCamera3.cpp b/camera/EmulatedQemuCamera3.cpp
index 7cc3d86..a6f7088 100644
--- a/camera/EmulatedQemuCamera3.cpp
+++ b/camera/EmulatedQemuCamera3.cpp
@@ -34,8 +34,8 @@
 #endif
 
 #include "EmulatedCameraFactory.h"
-#include "GrallocModule.h"
 #include "EmulatedQemuCamera3.h"
+#include "cbmanager.h"
 
 #include <cmath>
 #include <cutils/properties.h>
@@ -84,8 +84,8 @@
  * Constructor/Destructor
  ****************************************************************************/
 
-EmulatedQemuCamera3::EmulatedQemuCamera3(int cameraId, struct hw_module_t* module) :
-        EmulatedCamera3(cameraId, module) {
+EmulatedQemuCamera3::EmulatedQemuCamera3(int cameraId, struct hw_module_t* module, CbManager *cbManager) :
+        EmulatedCamera3(cameraId, module), mCbManager(cbManager) {
     ALOGI("Constructing emulated qemu camera 3: ID %d", mCameraID);
 
     for (size_t i = 0; i < CAMERA3_TEMPLATE_COUNT; ++i) {
@@ -229,7 +229,7 @@
     /*
      * Initialize sensor.
      */
-    mSensor = new QemuSensor(mDeviceName, mSensorWidth, mSensorHeight);
+    mSensor = new QemuSensor(mDeviceName, mSensorWidth, mSensorHeight, mCbManager);
     mSensor->setQemuSensorListener(this);
     res = mSensor->startUp();
     if (res != NO_ERROR) {
@@ -237,7 +237,7 @@
     }
 
     mReadoutThread = new ReadoutThread(this);
-    mJpegCompressor = new JpegCompressor();
+    mJpegCompressor = new JpegCompressor(mCbManager);
 
     res = mReadoutThread->run("EmuCam3::readoutThread");
     if (res != NO_ERROR) return res;
@@ -416,7 +416,7 @@
         if (newStream->format == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED) {
             if (newStream->usage & GRALLOC_USAGE_HW_CAMERA_WRITE) {
                 if (newStream->usage & GRALLOC_USAGE_HW_TEXTURE) {
-                    newStream->format = HAL_PIXEL_FORMAT_RGBA_8888;
+                    newStream->format = HAL_PIXEL_FORMAT_YCbCr_420_888;
                 }
                 else if (newStream->usage & GRALLOC_USAGE_HW_VIDEO_ENCODER) {
                     newStream->format = HAL_PIXEL_FORMAT_YCbCr_420_888;
@@ -904,7 +904,7 @@
         if (srcBuf.stream->format == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED) {
             if (srcBuf.stream->usage & GRALLOC_USAGE_HW_CAMERA_WRITE) {
                 if (srcBuf.stream->usage & GRALLOC_USAGE_HW_TEXTURE) {
-                    destBuf.format = HAL_PIXEL_FORMAT_RGBA_8888;
+                    destBuf.format = HAL_PIXEL_FORMAT_YCbCr_420_888;
                 }
                 else if (srcBuf.stream->usage & GRALLOC_USAGE_HW_VIDEO_ENCODER) {
                     destBuf.format = HAL_PIXEL_FORMAT_YCbCr_420_888;
@@ -938,10 +938,10 @@
             // Lock buffer for writing.
             if (srcBuf.stream->format == HAL_PIXEL_FORMAT_YCbCr_420_888) {
                 if (destBuf.format == HAL_PIXEL_FORMAT_YCbCr_420_888) {
-                    android_ycbcr ycbcr = android_ycbcr();
-                    res = GrallocModule::getInstance().lock_ycbcr(
+                    CbManager::YCbCrLayout ycbcr = {};
+                    res = mCbManager->lockYCbCrBuffer(
                             *(destBuf.buffer),
-                            GRALLOC_USAGE_HW_CAMERA_WRITE,
+                            (CbManager::BufferUsage::CAMERA_OUTPUT | 0),
                             0, 0, destBuf.width, destBuf.height,
                             &ycbcr);
                     /*
@@ -955,9 +955,9 @@
                     res = INVALID_OPERATION;
                 }
             } else {
-                res = GrallocModule::getInstance().lock(
+                res = mCbManager->lockBuffer(
                     *(destBuf.buffer),
-                    GRALLOC_USAGE_HW_CAMERA_WRITE,
+                    (CbManager::BufferUsage::CAMERA_OUTPUT | 0),
                     0, 0, destBuf.width, destBuf.height,
                     (void**)&(destBuf.img));
 
@@ -974,8 +974,7 @@
              * out.
              */
             for (size_t j = 0; j < i; j++) {
-                GrallocModule::getInstance().unlock(
-                        *(request->output_buffers[i].buffer));
+                mCbManager->unlockBuffer(*(request->output_buffers[i].buffer));
             }
             delete sensorBuffers;
             delete buffers;
@@ -2024,7 +2023,7 @@
                     __FUNCTION__, strerror(-res), res);
             // Fallthrough for cleanup.
         }
-        GrallocModule::getInstance().unlock(*(buf->buffer));
+        mParent->mCbManager->unlockBuffer(*(buf->buffer));
 
         buf->status = goodBuffer ? CAMERA3_BUFFER_STATUS_OK :
                 CAMERA3_BUFFER_STATUS_ERROR;
@@ -2107,7 +2106,7 @@
         const StreamBuffer &jpegBuffer, bool success) {
     Mutex::Autolock jl(mJpegLock);
 
-    GrallocModule::getInstance().unlock(*(jpegBuffer.buffer));
+    mParent->mCbManager->unlockBuffer(*(jpegBuffer.buffer));
 
     mJpegHalBuffer.status = success ?
             CAMERA3_BUFFER_STATUS_OK : CAMERA3_BUFFER_STATUS_ERROR;
diff --git a/camera/EmulatedQemuCamera3.h b/camera/EmulatedQemuCamera3.h
index 5656f53..fa47dc7 100644
--- a/camera/EmulatedQemuCamera3.h
+++ b/camera/EmulatedQemuCamera3.h
@@ -26,6 +26,7 @@
 #include "EmulatedCamera3.h"
 #include "fake-pipeline2/JpegCompressor.h"
 #include "qemu-pipeline3/QemuSensor.h"
+#include "cbmanager.h"
 
 #include <CameraMetadata.h>
 #include <utils/SortedVector.h>
@@ -48,7 +49,7 @@
 class EmulatedQemuCamera3 : public EmulatedCamera3,
         private QemuSensor::QemuSensorListener {
 public:
-    EmulatedQemuCamera3(int cameraId, struct hw_module_t* module);
+    EmulatedQemuCamera3(int cameraId, struct hw_module_t* module, CbManager* cbmanager);
     virtual ~EmulatedQemuCamera3();
 
     /*
@@ -170,6 +171,7 @@
 
     // Shortcut to the input stream.
     camera3_stream_t* mInputStream;
+    CbManager* mCbManager;
 
     typedef List<camera3_stream_t*> StreamList;
     typedef List<camera3_stream_t*>::iterator StreamIterator;
diff --git a/camera/EmulatorCameraTest.cpp b/camera/EmulatorCameraTest.cpp
index 684e6d7..8f9a70a 100644
--- a/camera/EmulatorCameraTest.cpp
+++ b/camera/EmulatorCameraTest.cpp
@@ -3,79 +3,292 @@
 #include <vector>
 
 #include "fake-pipeline2/Base.h"
+#include "fake-pipeline2/Scene.h"
 #include "QemuClient.h"
+#include "cbmanager.h"
+#include "gralloc_cb.h"
 
 #include <linux/videodev2.h>
 #include <utils/Timers.h>
 
 using namespace android;
 
+
+const nsecs_t kExposureTimeRange[2] =
+    {1000L, 300000000L} ; // 1 us - 0.3 sec
+const nsecs_t kFrameDurationRange[2] =
+    {33331760L, 300000000L}; // ~1/30 s - 0.3 sec
+
+const nsecs_t kMinVerticalBlank = 10000L;
+
+const uint8_t kColorFilterArrangement =
+    ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_RGGB;
+
+// Output image data characteristics
+const uint32_t kMaxRawValue = 4000;
+const uint32_t kBlackLevel  = 1000;
+
+// Sensor sensitivity
+const float kSaturationVoltage      = 0.520f;
+const uint32_t kSaturationElectrons = 2000;
+const float kVoltsPerLuxSecond      = 0.100f;
+
+const float kElectronsPerLuxSecond =
+        kSaturationElectrons / kSaturationVoltage
+        * kVoltsPerLuxSecond;
+
+const float kBaseGainFactor = (float)kMaxRawValue /
+            kSaturationElectrons;
+
+const float kReadNoiseStddevBeforeGain = 1.177; // in electrons
+const float kReadNoiseStddevAfterGain =  2.100; // in digital counts
+const float kReadNoiseVarBeforeGain =
+            kReadNoiseStddevBeforeGain *
+            kReadNoiseStddevBeforeGain;
+const float kReadNoiseVarAfterGain =
+            kReadNoiseStddevAfterGain *
+            kReadNoiseStddevAfterGain;
+
+const int32_t kSensitivityRange[2] = {100, 1600};
+const uint32_t kDefaultSensitivity = 100;
+
+void captureRGBA(uint8_t *img, uint32_t gain, uint32_t width, uint32_t height, Scene& scene, uint32_t sWidth, uint32_t sHeight) {
+    float totalGain = gain/100.0 * kBaseGainFactor;
+    // In fixed-point math, calculate total scaling from electrons to 8bpp
+    int scale64x = 64 * totalGain * 255 / kMaxRawValue;
+    unsigned int DivH= (float)sHeight/height * (0x1 << 10);
+    unsigned int DivW = (float)sWidth/width * (0x1 << 10);
+
+    for (unsigned int outY = 0; outY < height; outY++) {
+        unsigned int y = outY * DivH >> 10;
+        uint8_t *px = img + outY * width * 4;
+        scene.setReadoutPixel(0, y);
+        unsigned int lastX = 0;
+        const uint32_t *pixel = scene.getPixelElectrons();
+        for (unsigned int outX = 0; outX < width; outX++) {
+            uint32_t rCount, gCount, bCount;
+            unsigned int x = outX * DivW >> 10;
+            if (x - lastX > 0) {
+                for (unsigned int k = 0; k < (x-lastX); k++) {
+                     pixel = scene.getPixelElectrons();
+                }
+            }
+            lastX = x;
+            // TODO: Perfect demosaicing is a cheat
+            rCount = pixel[Scene::R]  * scale64x;
+            gCount = pixel[Scene::Gr] * scale64x;
+            bCount = pixel[Scene::B]  * scale64x;
+
+            *px++ = rCount < 255*64 ? rCount / 64 : 255;
+            *px++ = gCount < 255*64 ? gCount / 64 : 255;
+            *px++ = bCount < 255*64 ? bCount / 64 : 255;
+            *px++ = 255;
+         }
+        // TODO: Handle this better
+        //simulatedTime += mRowReadoutTime;
+    }
+}
+
+void captureYU12(uint8_t *img, uint32_t gain, uint32_t width, uint32_t height, Scene& scene, uint32_t sWidth, uint32_t sHeight) {
+    float totalGain = gain/100.0 * kBaseGainFactor;
+    // Using fixed-point math with 6 bits of fractional precision.
+    // In fixed-point math, calculate total scaling from electrons to 8bpp
+    const int scale64x = 64 * totalGain * 255 / kMaxRawValue;
+    // In fixed-point math, saturation point of sensor after gain
+    const int saturationPoint = 64 * 255;
+    // Fixed-point coefficients for RGB-YUV transform
+    // Based on JFIF RGB->YUV transform.
+    // Cb/Cr offset scaled by 64x twice since they're applied post-multiply
+    float rgbToY[]  = {19.0, 37.0, 7.0, 0.0};
+    float rgbToCb[] = {-10.0,-21.0, 32.0, 524288.0};
+    float rgbToCr[] = {32.0,-26.0, -5.0, 524288.0};
+    // Scale back to 8bpp non-fixed-point
+    const int scaleOut = 64;
+    const int scaleOutSq = scaleOut * scaleOut; // after multiplies
+    const double invscaleOutSq = 1.0/scaleOutSq;
+    for (int i=0; i < 4; ++i) {
+        rgbToY[i] *= invscaleOutSq;
+        rgbToCb[i] *= invscaleOutSq;
+        rgbToCr[i] *= invscaleOutSq;
+    }
+
+    unsigned int DivH= (float)sHeight/height * (0x1 << 10);
+    unsigned int DivW = (float)sWidth/width * (0x1 << 10);
+    for (unsigned int outY = 0; outY < height; outY++) {
+        unsigned int y = outY * DivH >> 10;
+        uint8_t *pxY = img + outY * width;
+        uint8_t *pxVU = img + (height + outY / 2) * width;
+        uint8_t *pxU = img + height * width + (outY / 2) * (width / 2);
+        uint8_t *pxV = pxU + (height / 2) * (width / 2);
+        scene.setReadoutPixel(0, y);
+        unsigned int lastX = 0;
+        const uint32_t *pixel = scene.getPixelElectrons();
+         for (unsigned int outX = 0; outX < width; outX++) {
+            int32_t rCount, gCount, bCount;
+            unsigned int x = outX * DivW >> 10;
+            if (x - lastX > 0) {
+                for (unsigned int k = 0; k < (x-lastX); k++) {
+                     pixel = scene.getPixelElectrons();
+                }
+            }
+            lastX = x;
+            rCount = pixel[Scene::R]  * scale64x;
+            rCount = rCount < saturationPoint ? rCount : saturationPoint;
+            gCount = pixel[Scene::Gr] * scale64x;
+            gCount = gCount < saturationPoint ? gCount : saturationPoint;
+            bCount = pixel[Scene::B]  * scale64x;
+            bCount = bCount < saturationPoint ? bCount : saturationPoint;
+            *pxY++ = (rgbToY[0] * rCount + rgbToY[1] * gCount + rgbToY[2] * bCount);
+            if (outY % 2 == 0 && outX % 2 == 0) {
+                *pxV++ = (rgbToCr[0] * rCount + rgbToCr[1] * gCount + rgbToCr[2] * bCount + rgbToCr[3]);
+                *pxU++ = (rgbToCb[0] * rCount + rgbToCb[1] * gCount + rgbToCb[2] * bCount + rgbToCb[3]);
+            }
+        }
+    }
+}
+
 // Test the capture speed of qemu camera, e.g., webcam and virtual scene
 int main(int argc, char* argv[]) {
     uint32_t pixFmt;
+    CbManager::PixelFormat cbFmt;
+    bool v1 = false;
+    bool fake = false;
+    std::vector<nsecs_t> report;
+    uint32_t sceneWidth;
+    uint32_t sceneHeight;
+
+    CbManager cbmanager;
+
     if (!strncmp(argv[1], "RGB", 3)) {
         pixFmt = V4L2_PIX_FMT_RGB32;
+        cbFmt = CbManager::PixelFormat::RGBA_8888;
     } else if (!strncmp(argv[1], "NV21", 3)) {
         pixFmt = V4L2_PIX_FMT_NV21;
+        cbFmt = CbManager::PixelFormat::YCBCR_420_888;
     } else if (!strncmp(argv[1], "YV12", 3)) {
         pixFmt = V4L2_PIX_FMT_YVU420;
+        cbFmt = CbManager::PixelFormat::YCBCR_420_888;
+    } else if (!strncmp(argv[1], "YU12", 3)) {
+        pixFmt = V4L2_PIX_FMT_YUV420;
+        cbFmt = CbManager::PixelFormat::YCBCR_420_888;
     } else {
-        printf("format error, use RGB, NV21 or YV12");
+        printf("format error, use RGB, NV21, YV12 or YU12");
         return -1;
     }
     uint32_t width = atoi(argv[2]);
     uint32_t height = atoi(argv[3]);
+    uint32_t repeated = atoi(argv[4]);
     std::string deviceName;
-    if (!strncmp(argv[4], "web", 3)) {
+    if (!strncmp(argv[5], "web", 3)) {
         deviceName = "name=/dev/video0";
-    } else if (!strncmp(argv[4], "vir", 3)) {
+    } else if (!strncmp(argv[5], "vir", 3)) {
         deviceName = "name=virtualscene";
+    } else if (!strncmp(argv[5], "fak", 3)){
+        fake = true;
+        sceneWidth = atoi(argv[6]);
+        sceneHeight = atoi(argv[7]);
     } else {
         printf("device error, use web or virtual");
         return -1;
     }
 
-    // Open qemu pipe
-    CameraQemuClient client;
-    int ret = client.connectClient(deviceName.c_str());
-    if (ret != NO_ERROR) {
-        printf("Failed to connect device\n");
-        return -1;
+    if (fake) {
+        std::vector<uint8_t> buf(width * height * 4);
+        Scene scene(width, height, kElectronsPerLuxSecond);
+        for (int i = 0 ; i < repeated; i++) {
+            nsecs_t start = systemTime();
+            if (pixFmt == V4L2_PIX_FMT_RGB32) {
+                captureRGBA(buf.data(), 0, width, height, scene, sceneWidth, sceneHeight);
+            } else {
+                captureYU12(buf.data(), 0, width, height, scene, sceneWidth, sceneHeight);
+            }
+            nsecs_t end = systemTime();
+            report.push_back(end - start);
+        }
     }
-    ret = client.queryConnect();
-    if (ret == NO_ERROR) {
-        printf("Connected to device\n");
-    } else {
-        printf("Failed to connect device\n");
-        return -1;
-    }
+    else {
+        if (argc > 6 && !strncmp(argv[6], "v1", 2)) {
+            v1 = true;
+        }
+        // Open qemu pipe
+        CameraQemuClient client;
+        int ret = client.connectClient(deviceName.c_str());
+        if (ret != NO_ERROR) {
+            printf("Failed to connect device\n");
+            return -1;
+        }
+        ret = client.queryConnect();
+        if (ret == NO_ERROR) {
+            printf("Connected to device\n");
+        } else {
+            printf("Failed to connect device\n");
+            return -1;
+        }
+        // Caputre ASAP
+        if (v1) {
+            //ret = client.queryStart();
+            ret = client.queryStart(pixFmt, width, height);
+        } else {
+            ret = client.queryStart(pixFmt, width, height);
+        }
+        if (ret != NO_ERROR) {
+            printf("Failed to configure device for query\n");
+            return -1;
+        }
+        if (v1) {
+            const CbManager::BufferUsageBits usage =
+                CbManager::BufferUsage::CAMERA_OUTPUT |
+                CbManager::BufferUsage::CAMERA_INPUT |
+                CbManager::BufferUsage::GPU_TEXTURE;
 
-    // Caputre ASAP
-    ret = client.queryStart(pixFmt, width, height);
-    if (ret != NO_ERROR) {
-        printf("Failed to configure device for query\n");
-        return -1;
+            native_handle_t* handle;
+            CbManager::YCbCrLayout ycbcr;
+            handle = cbmanager.allocateBuffer(width, height, cbFmt, usage);
+            void* addr;
+            if (cbFmt == CbManager::PixelFormat::RGBA_8888) {
+                cbmanager.lockBuffer(*handle, (CbManager::BufferUsage::CAMERA_OUTPUT | 0),
+                               0, 0,
+                               width, height, &addr);
+            } else {
+                cbmanager.lockYCbCrBuffer(*handle,
+                                          (CbManager::BufferUsage::CAMERA_OUTPUT | 0),
+                                          0, 0,
+                                          width, height,
+                                          &ycbcr);
+            }
+            uint64_t offset = ((cb_handle_t*)handle)->getMmapedOffset();
+            printf("offset is 0x%llx\n", offset);
+            float whiteBalance[] = {1.0f, 1.0f, 1.0f};
+            float exposureCompensation = 1.0f;
+            for (int i = 0 ; i < repeated; i++) {
+                nsecs_t start = systemTime();
+                client.queryFrame(width, height, pixFmt, offset,
+                                  whiteBalance[0], whiteBalance[1], whiteBalance[2],
+                                  exposureCompensation, nullptr);
+                nsecs_t end = systemTime();
+                report.push_back(end - start);
+            }
+            cbmanager.unlockBuffer(handle);
+        } else {
+            size_t bufferSize;
+            if (pixFmt == V4L2_PIX_FMT_RGB32) {
+                bufferSize = width * height * 4;
+            } else {
+                bufferSize = width * height * 12 / 8;
+            }
+            std::vector<char> buffer(bufferSize, 0);
+            float whiteBalance[] = {1.0f, 1.0f, 1.0f};
+            float exposureCompensation = 1.0f;
+            for (int i = 0 ; i < repeated; i++) {
+                nsecs_t start = systemTime();
+                client.queryFrame(buffer.data(), nullptr, 0, bufferSize,
+                                  whiteBalance[0], whiteBalance[1], whiteBalance[2],
+                                  exposureCompensation, nullptr);
+                nsecs_t end = systemTime();
+                report.push_back(end - start);
+            }
+        }
     }
-    size_t bufferSize;
-    if (pixFmt == V4L2_PIX_FMT_RGB32) {
-        bufferSize = width * height * 4;
-    } else {
-        bufferSize = width * height * 12 / 8;
-    }
-    std::vector<char> buffer(bufferSize, 0);
-    float whiteBalance[] = {1.0f, 1.0f, 1.0f};
-    float exposureCompensation = 1.0f;
-    std::vector<nsecs_t> report;
-    size_t repeated = 100;
-    for (int i = 0 ; i < repeated; i++) {
-        nsecs_t start = systemTime();
-        client.queryFrame(buffer.data(), nullptr, 0, bufferSize,
-                          whiteBalance[0], whiteBalance[1], whiteBalance[2],
-                          exposureCompensation, nullptr);
-        nsecs_t end = systemTime();
-        report.push_back(end - start);
-    }
-
     // Report
     nsecs_t average, sum = 0;
     for (int i = 0; i < repeated; i++) {
diff --git a/camera/GrallocModule.h b/camera/GrallocModule.h
deleted file mode 100644
index c6d4840..0000000
--- a/camera/GrallocModule.h
+++ /dev/null
@@ -1,44 +0,0 @@
-#ifndef EMU_CAMERA_GRALLOC_MODULE_H
-#define EMU_CAMERA_GRALLOC_MODULE_H
-
-#include <hardware/gralloc.h>
-#include <log/log.h>
-
-class GrallocModule
-{
-public:
-  static GrallocModule &getInstance() {
-    static GrallocModule instance;
-    return instance;
-  }
-
-  int lock(buffer_handle_t handle,
-      int usage, int l, int t, int w, int h, void **vaddr) {
-    return mModule->lock(mModule, handle, usage, l, t, w, h, vaddr);
-  }
-
-#ifdef GRALLOC_MODULE_API_VERSION_0_2
-  int lock_ycbcr(buffer_handle_t handle,
-      int usage, int l, int t, int w, int h,
-      struct android_ycbcr *ycbcr) {
-    return mModule->lock_ycbcr(mModule, handle, usage, l, t, w, h, ycbcr);
-  }
-#endif
-
-  int unlock(buffer_handle_t handle) {
-    return mModule->unlock(mModule, handle);
-  }
-
-private:
-  GrallocModule() {
-    const hw_module_t *module = NULL;
-    int ret = hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &module);
-    if (ret) {
-      ALOGE("%s: Failed to get gralloc module: %d", __FUNCTION__, ret);
-    }
-    mModule = reinterpret_cast<const gralloc_module_t*>(module);
-  }
-  const gralloc_module_t *mModule;
-};
-
-#endif
diff --git a/camera/PreviewWindow.cpp b/camera/PreviewWindow.cpp
index aad54e2..63ab4e9 100755
--- a/camera/PreviewWindow.cpp
+++ b/camera/PreviewWindow.cpp
@@ -24,12 +24,12 @@
 #include <log/log.h>
 #include "EmulatedCameraDevice.h"
 #include "PreviewWindow.h"
-#include "GrallocModule.h"
 
 namespace android {
 
-PreviewWindow::PreviewWindow()
+PreviewWindow::PreviewWindow(CbManager* cbManager)
     : mPreviewWindow(NULL),
+      mCbManager(cbManager),
       mPreviewFrameWidth(0),
       mPreviewFrameHeight(0),
       mPreviewEnabled(false)
@@ -149,9 +149,11 @@
     /* Now let the graphics framework to lock the buffer, and provide
      * us with the framebuffer data address. */
     void* img = NULL;
-    res = GrallocModule::getInstance().lock(
-        *buffer, GRALLOC_USAGE_SW_WRITE_OFTEN,
-        0, 0, mPreviewFrameWidth, mPreviewFrameHeight, &img);
+    res = mCbManager->lockBuffer(
+        *cb_handle_t::from_unconst(*buffer),
+        (CbManager::BufferUsage::CPU_WRITE_OFTEN | 0),
+        0, 0, mPreviewFrameWidth, mPreviewFrameHeight,
+        &img);
     if (res != NO_ERROR) {
         ALOGE("%s: gralloc.lock failure: %d -> %s",
              __FUNCTION__, res, strerror(res));
@@ -172,7 +174,7 @@
         ALOGE("%s: Unable to obtain preview frame: %d", __FUNCTION__, res);
         mPreviewWindow->cancel_buffer(mPreviewWindow, buffer);
     }
-    GrallocModule::getInstance().unlock(*buffer);
+    mCbManager->unlockBuffer(*cb_handle_t::from_unconst(*buffer));
 }
 
 /***************************************************************************
diff --git a/camera/PreviewWindow.h b/camera/PreviewWindow.h
index ef988e5..22e9d03 100755
--- a/camera/PreviewWindow.h
+++ b/camera/PreviewWindow.h
@@ -17,6 +17,8 @@
 #ifndef HW_EMULATOR_CAMERA_PREVIEW_WINDOW_H
 #define HW_EMULATOR_CAMERA_PREVIEW_WINDOW_H
 
+#include "cbmanager.h"
+
 /*
  * Contains declaration of a class PreviewWindow that encapsulates functionality
  * of a preview window set via set_preview_window camera HAL API.
@@ -35,7 +37,7 @@
 class PreviewWindow {
 public:
     /* Constructs PreviewWindow instance. */
-    PreviewWindow();
+    PreviewWindow(CbManager* cbManager);
 
     /* Destructs PreviewWindow instance. */
     ~PreviewWindow();
@@ -133,6 +135,9 @@
     /* Preview window instance. */
     preview_stream_ops*             mPreviewWindow;
 
+    /* API to manipulate color buffers */
+    CbManager*                      mCbManager;
+
     /*
      * Cached preview window frame dimensions.
      */
diff --git a/camera/QemuClient.cpp b/camera/QemuClient.cpp
index 18beb69..6259043 100755
--- a/camera/QemuClient.cpp
+++ b/camera/QemuClient.cpp
@@ -34,7 +34,7 @@
 #endif  // LOG_QUERIES
 
 #define QEMU_PIPE_DEBUG  LOGQ
-#include "qemu_pipe.h"
+#include "qemud.h"
 
 namespace android {
 
@@ -226,20 +226,11 @@
 
     /* Select one of the two: 'factory', or 'emulated camera' service */
     if (param == NULL || *param == '\0') {
-        /* No parameters: connect to the factory service. */
-        char pipe_name[512];
-        snprintf(pipe_name, sizeof(pipe_name), "qemud:%s",
-                 mCameraServiceName);
-        mPipeFD = qemu_pipe_open(pipe_name);
+        mPipeFD = qemud_channel_open(mCameraServiceName);
     } else {
-        /* One extra char ':' that separates service name and parameters + six
-         * characters for 'pipe:qemud:'. This is required by pipe protocol. */
-        char* connection_str = new char[strlen(mCameraServiceName) +
-                                        strlen(param) + 8];
-        sprintf(connection_str, "qemud:%s:%s", mCameraServiceName, param);
-
-        mPipeFD = qemu_pipe_open(connection_str);
-        delete[] connection_str;
+        char buf[256];
+        snprintf(buf, sizeof(buf), "%s:%s", mCameraServiceName, param);
+        mPipeFD = qemud_channel_open(buf);
     }
     if (mPipeFD < 0) {
         ALOGE("%s: Unable to connect to the camera service '%s': %s",
@@ -267,13 +258,12 @@
         return EINVAL;
     }
 
-    const size_t written = TEMP_FAILURE_RETRY(write(mPipeFD, data, data_size));
-    if (written == data_size) {
-        return NO_ERROR;
-    } else {
+    if (qemu_pipe_write_fully(mPipeFD, data, data_size)) {
         ALOGE("%s: Error sending data via qemu pipe: '%s'",
              __FUNCTION__, strerror(errno));
         return errno ? errno : EIO;
+    } else {
+        return NO_ERROR;
     }
 }
 
@@ -293,8 +283,7 @@
      * value. Note also, that the string doesn't contain zero-terminator. */
     size_t payload_size;
     char payload_size_str[9];
-    int rd_res = TEMP_FAILURE_RETRY(read(mPipeFD, payload_size_str, 8));
-    if (rd_res != 8) {
+    if (qemu_pipe_read_fully(mPipeFD, payload_size_str, 8)) {
         ALOGE("%s: Unable to obtain payload size: %s",
              __FUNCTION__, strerror(errno));
         return errno ? errno : EIO;
@@ -316,16 +305,15 @@
              __FUNCTION__, payload_size);
         return ENOMEM;
     }
-    rd_res = TEMP_FAILURE_RETRY(read(mPipeFD, *data, payload_size));
-    if (static_cast<size_t>(rd_res) == payload_size) {
-        *data_size = payload_size;
-        return NO_ERROR;
-    } else {
-        ALOGE("%s: Read size %d doesnt match expected payload size %zu: %s",
-             __FUNCTION__, rd_res, payload_size, strerror(errno));
+    if (qemu_pipe_read_fully(mPipeFD, *data, payload_size)) {
+        ALOGE("%s: qemu_pipe_read_fully coud not read %zu bytes: %s",
+             __FUNCTION__, payload_size, strerror(errno));
         free(*data);
         *data = NULL;
         return errno ? errno : EIO;
+    } else {
+        *data_size = payload_size;
+        return NO_ERROR;
     }
 }
 
@@ -470,6 +458,17 @@
     return res;
 }
 
+status_t CameraQemuClient::queryStart() {
+    ALOGV("%s", __FUNCTION__);
+    QemuQuery query(mQueryStart);
+    doQuery(&query);
+    const status_t res = query.getCompletionStatus();
+    ALOGE_IF(res != NO_ERROR, "%s: Query failed: %s",
+            __FUNCTION__, query.mReplyData ? query.mReplyData :
+                                             "No error message");
+    return res;
+}
+
 status_t CameraQemuClient::queryStart(uint32_t pixel_format,
                                       int width,
                                       int height)
@@ -566,4 +565,44 @@
     return NO_ERROR;
 }
 
+status_t CameraQemuClient::queryFrame(int width,
+                                      int height,
+                                      uint32_t pixel_format,
+                                      uint64_t offset,
+                                      float r_scale,
+                                      float g_scale,
+                                      float b_scale,
+                                      float exposure_comp,
+                                      int64_t* frame_time)
+{
+    ALOGV("%s: w %d h %d %.4s offset 0x%llx", __FUNCTION__, width, height,
+          (char*)(&pixel_format), offset);
+
+    char query_str[256];
+    snprintf(query_str, sizeof(query_str), "%s dim=%dx%d pix=%d offset=%llu whiteb=%g,%g,%g expcomp=%g time=%d",
+             mQueryFrame, width, height, pixel_format, offset,
+             r_scale, g_scale, b_scale,
+             exposure_comp, frame_time != nullptr ? 1 : 0);
+    QemuQuery query(query_str);
+    doQuery(&query);
+    const status_t res = query.getCompletionStatus();
+    if( res != NO_ERROR) {
+        ALOGE("%s: Query failed: %s",
+             __FUNCTION__, query.mReplyData ? query.mReplyData :
+                                              "No error message");
+        return res;
+    }
+
+    /* Copy requested frames. */
+    const uint8_t* frame = reinterpret_cast<const uint8_t*>(query.mReplyData);
+    if (frame_time != nullptr) {
+        if (query.mReplyDataSize >= 8) {
+            *frame_time = *reinterpret_cast<const int64_t*>(frame);
+        } else {
+            *frame_time = 0L;
+        }
+    }
+
+    return NO_ERROR;
+}
 }; /* namespace android */
diff --git a/camera/QemuClient.h b/camera/QemuClient.h
index ff39608..f3f7b6d 100755
--- a/camera/QemuClient.h
+++ b/camera/QemuClient.h
@@ -385,6 +385,8 @@
      */
     status_t queryStart(uint32_t pixel_format, int width, int height);
 
+    status_t queryStart();
+
     /* Queries camera to stop capturing video.
      * Return:
      *  NO_ERROR on success, or an appropriate error status on failure.
@@ -419,6 +421,16 @@
      * Names of the queries available for the emulated camera.
      ***************************************************************************/
 
+    status_t queryFrame(int wdith,
+                        int height,
+                        uint32_t pixel_format,
+                        uint64_t offset,
+                        float r_scale,
+                        float g_scale,
+                        float b_scale,
+                        float exposure_comp,
+                        int64_t* frame_time);
+
 private:
     /* Connect to the camera. */
     static const char mQueryConnect[];
diff --git a/camera/Thumbnail.cpp b/camera/Thumbnail.cpp
index 8f901a3..d3472a4 100644
--- a/camera/Thumbnail.cpp
+++ b/camera/Thumbnail.cpp
@@ -27,40 +27,14 @@
 #include <vector>
 
 /*
- * The NV21 format is a YUV format with an 8-bit Y-component and the U and V
+ * The YU12 format is a YUV format with an 8-bit Y-component and the U and V
  * components are stored as 8 bits each but they are shared between a block of
  * 2x2 pixels. So when calculating bits per pixel the 16 bits of U and V are
  * shared between 4 pixels leading to 4 bits of U and V per pixel. Together
  * with the 8 bits of Y this gives us 12 bits per pixel..
  *
- * The components are not grouped by pixels but separated into one Y-plane and
- * one interleaved U and V-plane. The first half of the byte sequence is all of
- * the Y data laid out in a linear fashion. After that the interleaved U and V-
- * plane starts with one byte of V followed by one byte of U followed by one
- * byte of V and so on. Each byte of U or V is associated with a 2x2 pixel block
- * in a linear fashion.
- *
- * For an 8 by 4 pixel image the layout would be:
- *
- * +-----+-----+-----+-----+-----+-----+-----+-----+
- * | Y0  | Y1  | Y2  | Y3  | Y4  | Y5  | Y6  | Y7  |
- * +-----+-----+-----+-----+-----+-----+-----+-----+
- * | Y8  | Y9  | Y10 | Y11 | Y12 | Y13 | Y14 | Y15 |
- * +-----+-----+-----+-----+-----+-----+-----+-----+
- * | Y16 | Y17 | Y18 | Y19 | Y20 | Y21 | Y22 | Y23 |
- * +-----+-----+-----+-----+-----+-----+-----+-----+
- * | Y24 | Y25 | Y26 | Y27 | Y28 | Y29 | Y30 | Y31 |
- * +-----+-----+-----+-----+-----+-----+-----+-----+
- * | V0  | U0  | V1  | U1  | V2  | U2  | V3  | U3  |
- * +-----+-----+-----+-----+-----+-----+-----+-----+
- * | V4  | U4  | V5  | U5  | V6  | U6  | V7  | U7  |
- * +-----+-----+-----+-----+-----+-----+-----+-----+
- *
- * In this image V0 and U0 are the V and U components for the 2x2 block of
- * pixels whose Y components are Y0, Y1, Y8 and Y9. V1 and U1 are matched with
- * the Y components Y2, Y3, Y10, Y11, and so on for that row. For the next row
- * of V and U the V4 and U4 components would be paired with Y16, Y17, Y24 and
- * Y25.
+ * The components are not grouped by pixels but separated into one Y-plane, one
+ * U-plane and one V-plane.
  */
 
 namespace android {
@@ -69,20 +43,9 @@
                                int sourceWidth, int sourceHeight,
                                int thumbnailWidth, int thumbnailHeight,
                                std::vector<unsigned char>* thumbnail) {
-    // Deinterleave the U and V planes into separate planes, this is because
-    // libyuv requires the planes to be separate when scaling
-    const size_t sourceUVPlaneSize = (sourceWidth * sourceHeight) / 4;
-    // Put both U and V planes in one buffer, one after the other, to reduce
-    // memory fragmentation and number of allocations
-    std::vector<unsigned char> sourcePlanes(sourceUVPlaneSize * 2);
     const unsigned char* ySourcePlane = sourceImage;
-    unsigned char* uSourcePlane = &sourcePlanes[0];
-    unsigned char* vSourcePlane = &sourcePlanes[sourceUVPlaneSize];
-
-    for (size_t i = 0; i < sourceUVPlaneSize; ++i) {
-        vSourcePlane[i] = sourceImage[sourceWidth * sourceHeight + i * 2 + 0];
-        uSourcePlane[i] = sourceImage[sourceWidth * sourceHeight + i * 2 + 1];
-    }
+    const unsigned char* uSourcePlane = sourceImage + sourceWidth * sourceHeight;
+    const unsigned char* vSourcePlane = uSourcePlane + sourceWidth * sourceHeight / 4;
 
     // Create enough space in the output vector for the result
     thumbnail->resize((thumbnailWidth * thumbnailHeight * 12) / 8);
@@ -92,8 +55,8 @@
     const size_t destUVPlaneSize = (thumbnailWidth * thumbnailHeight) / 4;
     std::vector<unsigned char> destPlanes(destUVPlaneSize * 2);
     unsigned char* yDestPlane = &(*thumbnail)[0];
-    unsigned char* uDestPlane = &destPlanes[0];
-    unsigned char* vDestPlane = &destPlanes[destUVPlaneSize];
+    unsigned char* uDestPlane = yDestPlane + thumbnailWidth * thumbnailHeight;
+    unsigned char* vDestPlane = uDestPlane + thumbnailWidth * thumbnailHeight / 4;
 
     // The strides for the U and V planes are half the width because the U and V
     // components are common to 2x2 pixel blocks
@@ -112,14 +75,6 @@
         return false;
     }
 
-    // Now we need to interleave the downscaled U and V planes into the
-    // output buffer to make it NV21 encoded
-    const size_t uvPlanesOffset = thumbnailWidth * thumbnailHeight;
-    for (size_t i = 0; i < destUVPlaneSize; ++i) {
-        (*thumbnail)[uvPlanesOffset + i * 2 + 0] = vDestPlane[i];
-        (*thumbnail)[uvPlanesOffset + i * 2 + 1] = uDestPlane[i];
-    }
-
     return true;
 }
 
diff --git a/camera/fake-pipeline2/JpegCompressor.cpp b/camera/fake-pipeline2/JpegCompressor.cpp
index 51de0c0..08d1570 100644
--- a/camera/fake-pipeline2/JpegCompressor.cpp
+++ b/camera/fake-pipeline2/JpegCompressor.cpp
@@ -29,12 +29,13 @@
 
 namespace android {
 
-JpegCompressor::JpegCompressor():
+JpegCompressor::JpegCompressor(CbManager* cbManager):
         Thread(false),
         mIsBusy(false),
         mSynchronous(false),
         mBuffers(NULL),
-        mListener(NULL) {
+        mListener(NULL),
+        mCbManager(cbManager) {
 }
 
 JpegCompressor::~JpegCompressor() {
@@ -187,7 +188,7 @@
     // Refer to /hardware/libhardware/include/hardware/camera3.h
     // Transport header for compressed JPEG buffers in output streams.
     camera3_jpeg_blob_t jpeg_blob;
-    cb_handle_t *cb = (cb_handle_t *)(*mJpegBuffer.buffer);
+    const cb_handle_t *cb = cb_handle_t::from(*mJpegBuffer.buffer);
     jpeg_blob.jpeg_blob_id = CAMERA3_JPEG_BLOB_ID;
     jpeg_blob.jpeg_size = nV21JpegCompressor.getCompressedSize();
     memcpy(mJpegBuffer.img + cb->width - sizeof(camera3_jpeg_blob_t),
@@ -227,7 +228,14 @@
 
     if (mFoundAux) {
         if (mAuxBuffer.streamId == 0) {
-            delete[] mAuxBuffer.img;
+            if (mAuxBuffer.buffer == nullptr) {
+                delete[] mAuxBuffer.img;
+            } else {
+                cb_handle_t* cb = cb_handle_t::from_unconst(*mAuxBuffer.buffer);
+
+                mCbManager->unlockBuffer(*cb);
+                mCbManager->freeBuffer(cb);
+            }
         } else if (!mSynchronous) {
             mListener->onJpegInputDone(mAuxBuffer);
         }
diff --git a/camera/fake-pipeline2/JpegCompressor.h b/camera/fake-pipeline2/JpegCompressor.h
index 7a78ef7..2d6e80a 100644
--- a/camera/fake-pipeline2/JpegCompressor.h
+++ b/camera/fake-pipeline2/JpegCompressor.h
@@ -30,6 +30,7 @@
 
 #include "Base.h"
 #include "../JpegCompressor.h"
+#include "cbmanager.h"
 #include <CameraMetadata.h>
 
 #include <stdio.h>
@@ -45,7 +46,7 @@
 class JpegCompressor: private Thread, public virtual RefBase {
   public:
 
-    JpegCompressor();
+    JpegCompressor(CbManager* cbManager);
     ~JpegCompressor();
 
     struct JpegListener {
@@ -89,6 +90,7 @@
 
     Buffers *mBuffers;
     JpegListener *mListener;
+    CbManager *mCbManager;
 
     StreamBuffer mJpegBuffer, mAuxBuffer;
     bool mFoundJpeg, mFoundAux;
diff --git a/camera/fake-pipeline2/Scene.cpp b/camera/fake-pipeline2/Scene.cpp
index 11beee7..1bfd216 100644
--- a/camera/fake-pipeline2/Scene.cpp
+++ b/camera/fake-pipeline2/Scene.cpp
@@ -42,8 +42,8 @@
 
 const int Scene::kSceneWidth = 20;
 const int Scene::kSceneHeight = 20;
-const int Scene::kMaxWidth = 640;
-const int Scene::kMaxHeight = 480;
+const int Scene::kMaxWidth = 20;
+const int Scene::kMaxHeight = 20;
 
 const uint8_t Scene::kScene[Scene::kSceneWidth * Scene::kSceneHeight] = {
     //      5         10        15        20
@@ -343,13 +343,13 @@
 
 // Handshake model constants.
 // Frequencies measured in a nanosecond timebase
-const float Scene::kHorizShakeFreq1 = 2 * M_PI * 2  / 1e9; // 2 Hz
-const float Scene::kHorizShakeFreq2 = 2 * M_PI * 13 / 1e9; // 13 Hz
-const float Scene::kVertShakeFreq1  = 2 * M_PI * 3  / 1e9; // 3 Hz
-const float Scene::kVertShakeFreq2  = 2 * M_PI * 11 / 1e9; // 1 Hz
+const float Scene::kHorizShakeFreq1 = 2 * M_PI * 1  / 1e9; // 1 Hz
+const float Scene::kHorizShakeFreq2 = 2 * M_PI * 1 / 1e9; // 1 Hz
+const float Scene::kVertShakeFreq1  = 2 * M_PI * 1  / 1e9; // 1 Hz
+const float Scene::kVertShakeFreq2  = 2 * M_PI * 1 / 1e9; // 1 Hz
 const float Scene::kFreq1Magnitude  = 5;
 const float Scene::kFreq2Magnitude  = 1;
-const float Scene::kShakeFraction   = 0.03; // As a fraction of a scene tile
+const float Scene::kShakeFraction   = 0.2; // As a fraction of a scene tile
 
 // RGB->YUV, Jpeg standard
 const float Scene::kRgb2Yuv[12] = {
diff --git a/camera/fake-pipeline2/Sensor.cpp b/camera/fake-pipeline2/Sensor.cpp
index fcbc4cd..064f48f 100644
--- a/camera/fake-pipeline2/Sensor.cpp
+++ b/camera/fake-pipeline2/Sensor.cpp
@@ -17,6 +17,7 @@
 //#define LOG_NDEBUG 0
 //#define LOG_NNDEBUG 0
 #define LOG_TAG "EmulatedCamera2_Sensor"
+#define ATRACE_TAG ATRACE_TAG_CAMERA
 
 #ifdef LOG_NNDEBUG
 #define ALOGVV(...) ALOGV(__VA_ARGS__)
@@ -25,6 +26,7 @@
 #endif
 
 #include <log/log.h>
+#include <utils/Trace.h>
 
 #include "../EmulatedFakeCamera2.h"
 #include "Sensor.h"
@@ -227,6 +229,7 @@
 }
 
 bool Sensor::threadLoop() {
+    ATRACE_CALL();
     /**
      * Sensor capture operation main loop.
      *
@@ -387,6 +390,7 @@
 };
 
 void Sensor::captureRaw(uint8_t *img, uint32_t gain, uint32_t stride) {
+    ATRACE_CALL();
     float totalGain = gain/100.0 * kBaseGainFactor;
     float noiseVarGain =  totalGain * totalGain;
     float readNoiseVar = kReadNoiseVarBeforeGain * noiseVarGain
@@ -428,6 +432,7 @@
 }
 
 void Sensor::captureRGBA(uint8_t *img, uint32_t gain, uint32_t width, uint32_t height) {
+    ATRACE_CALL();
     float totalGain = gain/100.0 * kBaseGainFactor;
     // In fixed-point math, calculate total scaling from electrons to 8bpp
     int scale64x = 64 * totalGain * 255 / kMaxRawValue;
@@ -466,6 +471,7 @@
 }
 
 void Sensor::captureRGB(uint8_t *img, uint32_t gain, uint32_t width, uint32_t height) {
+    ATRACE_CALL();
     float totalGain = gain/100.0 * kBaseGainFactor;
     // In fixed-point math, calculate total scaling from electrons to 8bpp
     int scale64x = 64 * totalGain * 255 / kMaxRawValue;
@@ -501,6 +507,7 @@
 }
 
 void Sensor::captureYU12(uint8_t *img, uint32_t gain, uint32_t width, uint32_t height) {
+    ATRACE_CALL();
     float totalGain = gain/100.0 * kBaseGainFactor;
     // Using fixed-point math with 6 bits of fractional precision.
     // In fixed-point math, calculate total scaling from electrons to 8bpp
@@ -528,7 +535,6 @@
     for (unsigned int outY = 0; outY < height; outY++) {
         unsigned int y = outY * DivH >> 10;
         uint8_t *pxY = img + outY * width;
-        uint8_t *pxVU = img + (height + outY / 2) * width;
         uint8_t *pxU = img + height * width + (outY / 2) * (width / 2);
         uint8_t *pxV = pxU + (height / 2) * (width / 2);
         mScene.setReadoutPixel(0, y);
@@ -560,6 +566,7 @@
 }
 
 void Sensor::captureDepth(uint8_t *img, uint32_t gain, uint32_t width, uint32_t height) {
+    ATRACE_CALL();
     float totalGain = gain/100.0 * kBaseGainFactor;
     // In fixed-point math, calculate scaling factor to 13bpp millimeters
     int scale64x = 64 * totalGain * 8191 / kMaxRawValue;
@@ -591,7 +598,7 @@
 }
 
 void Sensor::captureDepthCloud(uint8_t *img) {
-
+    ATRACE_CALL();
     android_depth_points *cloud = reinterpret_cast<android_depth_points*>(img);
 
     cloud->num_points = 16;
diff --git a/camera/jpeg-stub/Compressor.cpp b/camera/jpeg-stub/Compressor.cpp
index 3fe0bd6..02a05fd 100644
--- a/camera/jpeg-stub/Compressor.cpp
+++ b/camera/jpeg-stub/Compressor.cpp
@@ -33,7 +33,6 @@
         // provide here so just return.
         return false;
     }
-
     return compressData(data, exifData);
 }
 
@@ -80,24 +79,6 @@
     return true;
 }
 
-static void deinterleave(const uint8_t* vuPlanar, std::vector<uint8_t>& uRows,
-                         std::vector<uint8_t>& vRows, int rowIndex, int width,
-                         int height, int stride) {
-    int numRows = (height - rowIndex) / 2;
-    if (numRows > 8) numRows = 8;
-    for (int row = 0; row < numRows; ++row) {
-        int offset = ((rowIndex >> 1) + row) * stride;
-        const uint8_t* vu = vuPlanar + offset;
-        for (int i = 0; i < (width >> 1); ++i) {
-            int index = row * (width >> 1) + i;
-            uRows[index] = vu[1];
-            vRows[index] = vu[0];
-            vu += 2;
-        }
-    }
-}
-
-
 bool Compressor::compressData(const unsigned char* data, ExifData* exifData) {
     const uint8_t* y[16];
     const uint8_t* cb[8];
@@ -108,9 +89,8 @@
     int width = mCompressInfo.image_width;
     int height = mCompressInfo.image_height;
     const uint8_t* yPlanar = data;
-    const uint8_t* vuPlanar = data + (width * height);
-    std::vector<uint8_t> uRows(8 * (width >> 1));
-    std::vector<uint8_t> vRows(8 * (width >> 1));
+    const uint8_t* uPlanar = yPlanar + width * height;
+    const uint8_t* vPlanar = uPlanar + width * height / 4;
 
     // NOTE! DANGER! Do not construct any non-trivial objects below setjmp!
     // The compiler will not generate code to destroy them during the return
@@ -128,10 +108,6 @@
 
     // process 16 lines of Y and 8 lines of U/V each time.
     while (mCompressInfo.next_scanline < mCompressInfo.image_height) {
-        //deinterleave u and v
-        deinterleave(vuPlanar, uRows, vRows, mCompressInfo.next_scanline,
-                     width, height, width);
-
         // Jpeg library ignores the rows whose indices are greater than height.
         for (i = 0; i < 16; i++) {
             // y row
@@ -140,11 +116,10 @@
             // construct u row and v row
             if ((i & 1) == 0) {
                 // height and width are both halved because of downsampling
-                offset = (i >> 1) * (width >> 1);
-                cb[i/2] = &uRows[offset];
-                cr[i/2] = &vRows[offset];
+                cb[i/2] = uPlanar + (mCompressInfo.next_scanline + i) * width / 4;
+                cr[i/2] = vPlanar + (mCompressInfo.next_scanline + i) * width / 4;
             }
-          }
+        }
         jpeg_write_raw_data(&mCompressInfo, const_cast<JSAMPIMAGE>(planes), 16);
     }
 
diff --git a/camera/media_codecs_google_video_default.xml b/camera/media_codecs_google_video_default.xml
index 75f4264..d8b40a5 100644
--- a/camera/media_codecs_google_video_default.xml
+++ b/camera/media_codecs_google_video_default.xml
@@ -35,6 +35,26 @@
             <Limit name="performance-point-1920x1080" value="30" />
             <Feature name="adaptive-playback" />
         </MediaCodec>
+        <MediaCodec name="OMX.android.goldfish.h264.decoder" type="video/avc">
+            <!-- profiles and levels:  ProfileHigh : Level41 -->
+            <Limit name="size" min="16x16" max="1920x1088" />
+            <Limit name="alignment" value="2x2" />
+            <Limit name="block-size" value="16x16" />
+            <Limit name="blocks-per-second" range="1-244800" />
+            <Limit name="bitrate" range="1-12000000" />
+            <Limit name="performance-point-1920x1080" value="30" />
+            <Feature name="adaptive-playback" />
+        </MediaCodec>
+        <MediaCodec name="OMX.google.goldfish.h264.decoder" type="video/avc">
+            <!-- profiles and levels:  ProfileHigh : Level41 -->
+            <Limit name="size" min="16x16" max="1920x1088" />
+            <Limit name="alignment" value="2x2" />
+            <Limit name="block-size" value="16x16" />
+            <Limit name="blocks-per-second" range="1-244800" />
+            <Limit name="bitrate" range="1-12000000" />
+            <Limit name="performance-point-1920x1080" value="30" />
+            <Feature name="adaptive-playback" />
+        </MediaCodec>
         <MediaCodec name="OMX.google.h264.decoder" type="video/avc">
             <!-- profiles and levels:  ProfileHigh : Level41 -->
             <Limit name="size" min="16x16" max="1920x1088" />
@@ -56,6 +76,26 @@
             <Limit name="performance-point-1920x1080" value="30" />
             <Feature name="adaptive-playback" />
         </MediaCodec>
+        <MediaCodec name="OMX.google.goldfish.vp8.decoder" type="video/x-vnd.on2.vp8">
+            <Limit name="size" min="2x2" max="2560x2560" />
+            <Limit name="alignment" value="2x2" />
+            <Limit name="block-size" value="16x16" />
+            <Limit name="block-count" range="1-25600" />
+            <Limit name="blocks-per-second" range="1-1536000" />
+            <Limit name="bitrate" range="1-40000000" />
+            <Limit name="performance-point-1920x1080" value="30" />
+            <Feature name="adaptive-playback" />
+        </MediaCodec>
+        <MediaCodec name="OMX.google.goldfish.vp9.decoder" type="video/x-vnd.on2.vp9">
+            <Limit name="size" min="2x2" max="2560x2560" />
+            <Limit name="alignment" value="2x2" />
+            <Limit name="block-size" value="16x16" />
+            <Limit name="block-count" range="1-25600" />
+            <Limit name="blocks-per-second" range="1-768000" />
+            <Limit name="bitrate" range="1-40000000" />
+            <Limit name="performance-point-1920x1080" value="30" />
+            <Feature name="adaptive-playback" />
+        </MediaCodec>
         <MediaCodec name="OMX.google.vp8.decoder" type="video/x-vnd.on2.vp8">
             <Limit name="size" min="2x2" max="2048x2048" />
             <Limit name="alignment" value="2x2" />
diff --git a/camera/qemu-pipeline3/QemuSensor.cpp b/camera/qemu-pipeline3/QemuSensor.cpp
index f4560d0..5a20ed2 100644
--- a/camera/qemu-pipeline3/QemuSensor.cpp
+++ b/camera/qemu-pipeline3/QemuSensor.cpp
@@ -21,6 +21,7 @@
 //#define LOG_NNDEBUG 0
 
 #define LOG_TAG "EmulatedCamera3_QemuSensor"
+#define ATRACE_TAG ATRACE_TAG_CAMERA
 
 #ifdef LOG_NNDEBUG
 #define ALOGVV(...) ALOGV(__VA_ARGS__)
@@ -28,6 +29,7 @@
 #define ALOGVV(...) ((void)0)
 #endif
 
+#include "cbmanager.h"
 #include "qemu-pipeline3/QemuSensor.h"
 #include "system/camera_metadata.h"
 
@@ -35,6 +37,8 @@
 #include <cstdlib>
 #include <linux/videodev2.h>
 #include <log/log.h>
+#include <cutils/properties.h>
+#include <utils/Trace.h>
 
 namespace android {
 
@@ -47,7 +51,10 @@
 const int32_t QemuSensor::kSensitivityRange[2] = {100, 1600};
 const uint32_t QemuSensor::kDefaultSensitivity = 100;
 
-QemuSensor::QemuSensor(const char *deviceName, uint32_t width, uint32_t height):
+const char QemuSensor::kHostCameraVerString[] = "ro.kernel.qemu.camera_protocol_ver";
+
+QemuSensor::QemuSensor(const char *deviceName, uint32_t width, uint32_t height,
+                       CbManager* cbManager):
         Thread(false),
         mWidth(width),
         mHeight(height),
@@ -56,12 +63,14 @@
         mLastRequestHeight(-1),
         mCameraQemuClient(),
         mDeviceName(deviceName),
+        mCbManager(cbManager),
         mGotVSync(false),
         mFrameDuration(kFrameDurationRange[0]),
         mNextBuffers(nullptr),
         mFrameNumber(0),
         mCapturedBuffers(nullptr),
         mListener(nullptr) {
+    mHostCameraVer = property_get_int32(kHostCameraVerString, 0);
     ALOGV("QemuSensor created with pixel array %d x %d", width, height);
 }
 
@@ -187,6 +196,7 @@
 }
 
 bool QemuSensor::threadLoop() {
+    ATRACE_CALL();
     /*
      * Stages are out-of-order relative to a single frame's processing, but
      * in-order in time.
@@ -280,7 +290,11 @@
                     captureRGB(b.img, b.width, b.height, b.stride, &timestamp);
                     break;
                 case HAL_PIXEL_FORMAT_RGBA_8888:
-                    captureRGBA(b.img, b.width, b.height, b.stride, &timestamp);
+                    if (mHostCameraVer == 1) {
+                        captureRGBA(b.width, b.height, b.stride, &timestamp, b.buffer);
+                    } else {
+                        captureRGBA(b.img, b.width, b.height, b.stride, &timestamp);
+                    }
                     break;
                 case HAL_PIXEL_FORMAT_BLOB:
                     if (b.dataSpace == HAL_DATASPACE_DEPTH) {
@@ -296,14 +310,40 @@
                         bAux.height = b.height;
                         bAux.format = HAL_PIXEL_FORMAT_YCbCr_420_888;
                         bAux.stride = b.width;
-                        bAux.buffer = nullptr;
-                        // TODO: Reuse these.
-                        bAux.img = new uint8_t[b.width * b.height * 3];
+                        if (mHostCameraVer == 1) {
+                            const CbManager::BufferUsageBits usage =
+                                CbManager::BufferUsage::CAMERA_OUTPUT |
+                                CbManager::BufferUsage::CAMERA_INPUT |
+                                CbManager::BufferUsage::GPU_TEXTURE;
+
+                            cb_handle_t *cb_handle = (cb_handle_t*)mCbManager->allocateBuffer(
+                                bAux.width, bAux.height,
+                                CbManager::PixelFormat(bAux.format), usage);
+
+                            CbManager::YCbCrLayout ycbcr = {};
+                            mCbManager->lockYCbCrBuffer(*(native_handle_t*)cb_handle,
+                                                        (CbManager::BufferUsage::CAMERA_OUTPUT | 0),
+                                                        0, 0,
+                                                        bAux.width, bAux.height,
+                                                        &ycbcr);
+
+                            bAux.buffer = new buffer_handle_t;
+                            *bAux.buffer = cb_handle;
+                            bAux.img = (uint8_t*)ycbcr.y;
+                        } else {
+                            bAux.buffer = nullptr;
+                            // TODO: Reuse these.
+                            bAux.img = new uint8_t[b.width * b.height * 3];
+                        }
                         mNextCapturedBuffers->push_back(bAux);
                     }
                     break;
                 case HAL_PIXEL_FORMAT_YCbCr_420_888:
-                    captureYU12(b.img, b.width, b.height, b.stride, &timestamp);
+                    if (mHostCameraVer == 1) {
+                        captureYU12(b.width, b.height, b.stride, &timestamp, b.buffer);
+                    } else {
+                        captureYU12(b.img, b.width, b.height, b.stride, &timestamp);
+                    }
                     break;
                 default:
                     ALOGE("%s: Unknown/unsupported format %x, no output",
@@ -343,6 +383,7 @@
 
 void QemuSensor::captureRGBA(uint8_t *img, uint32_t width, uint32_t height,
         uint32_t stride, int64_t *timestamp) {
+    ATRACE_CALL();
     status_t res;
     if (width != (uint32_t)mLastRequestWidth ||
         height != (uint32_t)mLastRequestHeight) {
@@ -395,14 +436,52 @@
     }
 
     // Since the format is V4L2_PIX_FMT_RGB32, we need 4 bytes per pixel.
-    size_t bufferSize = width * height * 4;
-    // Apply no white balance or exposure compensation.
+      size_t bufferSize = width * height * 4;
+      // Apply no white balance or exposure compensation.
+      float whiteBalance[] = {1.0f, 1.0f, 1.0f};
+      float exposureCompensation = 1.0f;
+      // Read from webcam.
+      mCameraQemuClient.queryFrame(nullptr, img, 0, bufferSize, whiteBalance[0],
+              whiteBalance[1], whiteBalance[2],
+              exposureCompensation, timestamp);
+
+    ALOGVV("RGBA sensor image captured");
+}
+
+void QemuSensor::captureRGBA(uint32_t width, uint32_t height,
+        uint32_t stride, int64_t *timestamp, buffer_handle_t* handle) {
+    ATRACE_CALL();
+    status_t res;
+    if (mLastRequestWidth == -1 || mLastRequestHeight == -1) {
+        uint32_t pixFmt = V4L2_PIX_FMT_YUV420;
+        res = mCameraQemuClient.queryStart();
+        if (res == NO_ERROR) {
+            mLastRequestWidth = width;
+            mLastRequestHeight = height;
+            ALOGV("%s: Qemu camera device '%s' is started for %.4s[%dx%d] frames",
+                    __FUNCTION__, (const char*) mDeviceName,
+                    reinterpret_cast<const char*>(&pixFmt),
+                    mWidth, mHeight);
+            mState = ECDS_STARTED;
+        } else {
+            ALOGE("%s: Unable to start device '%s' for %.4s[%dx%d] frames",
+                    __FUNCTION__, (const char*) mDeviceName,
+                    reinterpret_cast<const char*>(&pixFmt),
+                    mWidth, mHeight);
+            return;
+        }
+    }
+    if (width != stride) {
+        ALOGW("%s: expect stride (%d), actual stride (%d)", __FUNCTION__,
+              width, stride);
+    }
+
     float whiteBalance[] = {1.0f, 1.0f, 1.0f};
     float exposureCompensation = 1.0f;
-    // Read from webcam.
-    mCameraQemuClient.queryFrame(nullptr, img, 0, bufferSize, whiteBalance[0],
-            whiteBalance[1], whiteBalance[2],
-            exposureCompensation, timestamp);
+    const uint64_t offset = CbManager::getOffset(*handle);
+    mCameraQemuClient.queryFrame(width, height, V4L2_PIX_FMT_RGB32, offset,
+                                 whiteBalance[0], whiteBalance[1], whiteBalance[2],
+                                 exposureCompensation, timestamp);
 
     ALOGVV("RGBA sensor image captured");
 }
@@ -411,7 +490,9 @@
     ALOGE("%s: Not implemented", __FUNCTION__);
 }
 
-void QemuSensor::captureYU12(uint8_t *img, uint32_t width, uint32_t height, uint32_t stride, int64_t *timestamp) {
+void QemuSensor::captureYU12(uint8_t *img, uint32_t width, uint32_t height, uint32_t stride,
+                             int64_t *timestamp) {
+    ATRACE_CALL();
     status_t res;
     if (width != (uint32_t)mLastRequestWidth ||
         height != (uint32_t)mLastRequestHeight) {
@@ -422,7 +503,6 @@
 
         if (mLastRequestWidth != -1 || mLastRequestHeight != -1) {
             // We only need to stop the camera if this isn't the first request.
-
             // Stop the camera device.
             res = mCameraQemuClient.queryStop();
             if (res == NO_ERROR) {
@@ -476,4 +556,41 @@
     ALOGVV("YUV420 sensor image captured");
 }
 
+void QemuSensor::captureYU12(uint32_t width, uint32_t height, uint32_t stride,
+                             int64_t *timestamp, buffer_handle_t* handle) {
+    ATRACE_CALL();
+    status_t res;
+    if (mLastRequestWidth == -1 || mLastRequestHeight == -1) {
+        uint32_t pixFmt = V4L2_PIX_FMT_YUV420;
+        res = mCameraQemuClient.queryStart();
+        if (res == NO_ERROR) {
+            mLastRequestWidth = width;
+            mLastRequestHeight = height;
+            ALOGV("%s: Qemu camera device '%s' is started for %.4s[%dx%d] frames",
+                    __FUNCTION__, (const char*) mDeviceName,
+                    reinterpret_cast<const char*>(&pixFmt),
+                    mWidth, mHeight);
+            mState = ECDS_STARTED;
+        } else {
+            ALOGE("%s: Unable to start device '%s' for %.4s[%dx%d] frames",
+                    __FUNCTION__, (const char*) mDeviceName,
+                    reinterpret_cast<const char*>(&pixFmt),
+                    mWidth, mHeight);
+            return;
+        }
+    }
+    if (width != stride) {
+        ALOGW("%s: expect stride (%d), actual stride (%d)", __FUNCTION__,
+              width, stride);
+    }
+
+    float whiteBalance[] = {1.0f, 1.0f, 1.0f};
+    float exposureCompensation = 1.0f;
+    const uint64_t offset = CbManager::getOffset(*handle);
+    mCameraQemuClient.queryFrame(width, height, V4L2_PIX_FMT_YUV420, offset,
+                                 whiteBalance[0], whiteBalance[1], whiteBalance[2],
+                                 exposureCompensation, timestamp);
+    ALOGVV("YUV420 sensor image captured");
+}
+
 }; // end of namespace android
diff --git a/camera/qemu-pipeline3/QemuSensor.h b/camera/qemu-pipeline3/QemuSensor.h
index a39d3e5..ce88b3c 100644
--- a/camera/qemu-pipeline3/QemuSensor.h
+++ b/camera/qemu-pipeline3/QemuSensor.h
@@ -28,6 +28,7 @@
 
 #include "fake-pipeline2/Base.h"
 #include "QemuClient.h"
+#include "cbmanager.h"
 
 #include <utils/Mutex.h>
 #include <utils/Thread.h>
@@ -46,7 +47,8 @@
     *     width: Width of pixel array.
     *     height: Height of pixel array.
     */
-    QemuSensor(const char *deviceName, uint32_t width, uint32_t height);
+    QemuSensor(const char *deviceName, uint32_t width, uint32_t height,
+               CbManager* cbManager);
     ~QemuSensor();
 
     /*
@@ -123,6 +125,8 @@
     static const int32_t kSensitivityRange[2];
     static const uint32_t kDefaultSensitivity;
 
+    static const char kHostCameraVerString[];
+
   private:
     int32_t mLastRequestWidth, mLastRequestHeight;
 
@@ -144,6 +148,7 @@
 
     CameraQemuClient mCameraQemuClient;
     const char *mDeviceName;
+    CbManager* mCbManager;
 
     // Always lock before accessing control parameters.
     Mutex mControlMutex;
@@ -169,6 +174,7 @@
 
     // Time of sensor startup (used for simulation zero-time point).
     nsecs_t mStartupTime;
+    int32_t mHostCameraVer;
 
   private:
     /*
@@ -186,12 +192,16 @@
     nsecs_t mNextCaptureTime;
     Buffers *mNextCapturedBuffers;
 
+    void captureRGBA(uint32_t width, uint32_t height, uint32_t stride,
+                     int64_t *timestamp, buffer_handle_t* handle);
+    void captureYU12(uint32_t width, uint32_t height, uint32_t stride,
+                     int64_t *timestamp, buffer_handle_t* handle);
     void captureRGBA(uint8_t *img, uint32_t width, uint32_t height,
-            uint32_t stride, int64_t *timestamp);
-    void captureRGB(uint8_t *img, uint32_t width, uint32_t height,
-            uint32_t stride, int64_t *timestamp);
+                     uint32_t stride, int64_t *timestamp);
     void captureYU12(uint8_t *img, uint32_t width, uint32_t height,
-            uint32_t stride, int64_t *timestamp);
+                     uint32_t stride, int64_t *timestamp);
+    void captureRGB(uint8_t *img, uint32_t width, uint32_t height,
+                    uint32_t stride, int64_t *timestamp);
 };
 
 }; // end of namespace android
diff --git a/data/etc/advancedFeatures.ini b/data/etc/advancedFeatures.ini
index 731e3f5..56ff712 100644
--- a/data/etc/advancedFeatures.ini
+++ b/data/etc/advancedFeatures.ini
@@ -12,3 +12,6 @@
 DynamicPartition = on
 YUVCache = on
 MultiDisplay = on
+GLDirectMem = on
+VulkanNullOptionalStrings = on
+VulkanIgnoredHandles = on
diff --git a/data/etc/permissions/privapp-permissions-goldfish.xml b/data/etc/permissions/privapp-permissions-goldfish.xml
index 8f9643b..ad537d0 100644
--- a/data/etc/permissions/privapp-permissions-goldfish.xml
+++ b/data/etc/permissions/privapp-permissions-goldfish.xml
@@ -22,11 +22,6 @@
 -->
 
 <permissions>
-    <privapp-permissions package="com.android.sdksetup">
-        <permission name="android.permission.BACKUP"/>
-        <permission name="android.permission.MANAGE_USERS"/>
-        <permission name="android.permission.WRITE_SECURE_SETTINGS"/>
-    </privapp-permissions>
     <privapp-permissions package="com.android.dialer">
         <permission name="android.permission.STATUS_BAR"/>
     </privapp-permissions>
diff --git a/data/etc/user/advancedFeatures.ini b/data/etc/user/advancedFeatures.ini
index 6c45030..2c6e877 100644
--- a/data/etc/user/advancedFeatures.ini
+++ b/data/etc/user/advancedFeatures.ini
@@ -11,3 +11,6 @@
 RefCountPipe = on
 VirtioInput = on
 DynamicPartition = on
+GLDirectMem = on
+VulkanNullOptionalStrings = on
+VulkanIgnoredHandles = on
diff --git a/emulator-info.txt b/emulator-info.txt
index 5235a63..c2f1fdc 100644
--- a/emulator-info.txt
+++ b/emulator-info.txt
@@ -1,2 +1,2 @@
 # Emulator (stable) version
-require version-emulator=5924900
+require version-emulator=6185563
diff --git a/fingerprint/Android.mk b/fingerprint/Android.mk
index e282578..610b281 100644
--- a/fingerprint/Android.mk
+++ b/fingerprint/Android.mk
@@ -17,21 +17,11 @@
 include $(CLEAR_VARS)
 
 LOCAL_VENDOR_MODULE := true
-LOCAL_MODULE := fingerprint.goldfish
-LOCAL_MODULE_RELATIVE_PATH := hw
-LOCAL_C_INCLUDES += $(LOCAL_PATH)/../include
-LOCAL_SRC_FILES := fingerprint.c
-LOCAL_SHARED_LIBRARIES := liblog libcutils
-LOCAL_HEADER_LIBRARIES := libhardware_headers
-
-include $(BUILD_SHARED_LIBRARY)
-
-include $(CLEAR_VARS)
-
-LOCAL_VENDOR_MODULE := true
 LOCAL_MODULE := fingerprint.ranchu
 LOCAL_MODULE_RELATIVE_PATH := hw
-LOCAL_C_INCLUDES += $(LOCAL_PATH)/../include
+LOCAL_C_INCLUDES += \
+	$(LOCAL_PATH)/../include \
+	$(LOCAL_PATH)/../../goldfish-opengl/shared/OpenglCodecCommon
 LOCAL_SRC_FILES := fingerprint.c
 LOCAL_SHARED_LIBRARIES := liblog libcutils
 LOCAL_HEADER_LIBRARIES := libhardware_headers
diff --git a/fvp.mk b/fvp.mk
new file mode 100644
index 0000000..ed2c9b5
--- /dev/null
+++ b/fvp.mk
@@ -0,0 +1,100 @@
+#
+# Copyright 2019 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+PRODUCT_USE_DYNAMIC_PARTITIONS := true
+PRODUCT_FULL_TREBLE_OVERRIDE := true
+
+#
+# All components inherited here go to system image
+#
+$(call inherit-product, $(SRC_TARGET_DIR)/product/core_64_bit.mk)
+$(call inherit-product, $(SRC_TARGET_DIR)/product/mainline_system.mk)
+
+#
+# All components inherited here go to system_ext image
+#
+$(call inherit-product, $(SRC_TARGET_DIR)/product/handheld_system_ext.mk)
+$(call inherit-product, $(SRC_TARGET_DIR)/product/telephony_system_ext.mk)
+
+#
+# All components inherited here go to product image
+#
+$(call inherit-product, $(SRC_TARGET_DIR)/product/aosp_product.mk)
+
+#
+# All components inherited here go to vendor image
+#
+$(call inherit-product, $(SRC_TARGET_DIR)/product/media_vendor.mk)
+
+PRODUCT_PACKAGES += \
+    android.hardware.audio@2.0-service \
+    android.hardware.audio@4.0-impl:32 \
+    android.hardware.audio.effect@4.0-impl:32 \
+    android.hardware.drm@1.0-service \
+    android.hardware.drm@1.0-impl \
+    android.hardware.drm@1.2-service.clearkey \
+    android.hardware.gatekeeper@1.0-service.software \
+    android.hardware.graphics.allocator@2.0-service \
+    android.hardware.graphics.allocator@2.0-impl \
+    android.hardware.graphics.composer@2.1-service \
+    android.hardware.graphics.composer@2.1-impl \
+    android.hardware.graphics.mapper@2.0-impl \
+    android.hardware.health@2.0-service \
+    android.hardware.keymaster@4.0-service \
+    android.hardware.keymaster@4.0-impl \
+    libEGL_swiftshader \
+    libGLESv1_CM_swiftshader \
+    libGLESv2_swiftshader \
+
+PRODUCT_PACKAGE_OVERLAYS := device/generic/goldfish/overlay
+
+PRODUCT_NAME := fvp
+PRODUCT_DEVICE := fvpbase
+PRODUCT_BRAND := Android
+PRODUCT_MODEL := AOSP on FVP
+
+PRODUCT_COPY_FILES += \
+    device/generic/goldfish/data/etc/handheld_core_hardware.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/handheld_core_hardware.xml \
+    frameworks/native/data/etc/android.hardware.ethernet.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.ethernet.xml \
+    device/generic/goldfish/fvpbase/fstab.fvpbase:$(TARGET_COPY_OUT_VENDOR)/etc/fstab.fvpbase \
+    device/generic/goldfish/fvpbase/fstab.fvpbase.initrd:$(TARGET_COPY_OUT_RAMDISK)/fstab.fvpbase \
+    device/generic/goldfish/fvpbase/init.fvpbase.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/hw/init.fvpbase.rc \
+    frameworks/av/services/audiopolicy/config/audio_policy_configuration_generic.xml:$(TARGET_COPY_OUT_VENDOR)/etc/audio_policy_configuration.xml \
+    frameworks/av/services/audiopolicy/config/primary_audio_policy_configuration.xml:$(TARGET_COPY_OUT_VENDOR)/etc/primary_audio_policy_configuration.xml \
+    frameworks/av/services/audiopolicy/config/r_submix_audio_policy_configuration.xml:$(TARGET_COPY_OUT_VENDOR)/etc/r_submix_audio_policy_configuration.xml \
+    frameworks/av/services/audiopolicy/config/audio_policy_volumes.xml:$(TARGET_COPY_OUT_VENDOR)/etc/audio_policy_volumes.xml \
+    frameworks/av/services/audiopolicy/config/default_volume_tables.xml:$(TARGET_COPY_OUT_VENDOR)/etc/default_volume_tables.xml \
+    frameworks/av/services/audiopolicy/config/surround_sound_configuration_5_0.xml:$(TARGET_COPY_OUT_VENDOR)/etc/surround_sound_configuration_5_0.xml \
+
+PRODUCT_DEFAULT_PROPERTY_OVERRIDES += \
+    ro.hardware.egl=swiftshader \
+    debug.sf.nobootanimation=1 \
+
+PRODUCT_REQUIRES_INSECURE_EXECMEM_FOR_SWIFTSHADER := true
+
+# It's almost always faster to dexopt on the host even in eng builds.
+WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY := false
+
+DEVICE_MANIFEST_FILE := device/generic/goldfish/fvpbase/manifest.xml
+
+# Normally, the bootloader is supposed to concatenate the Android initramfs
+# and the initramfs for the kernel modules and let the kernel combine
+# them. However, the bootloader that we're using with FVP (U-Boot) doesn't
+# support concatenation, so we implement it in the build system.
+droid: $(OUT_DIR)/target/product/$(PRODUCT_DEVICE)/boot/ramdisk.img
+
+$(OUT_DIR)/target/product/$(PRODUCT_DEVICE)/boot/ramdisk.img: $(OUT_DIR)/target/product/$(PRODUCT_DEVICE)/ramdisk.img $(OUT_DIR)/target/product/$(PRODUCT_DEVICE)/boot/initramfs.img
+	gzip -dc $^ > $@
diff --git a/fvpbase/BoardConfig.mk b/fvpbase/BoardConfig.mk
new file mode 100644
index 0000000..234645e
--- /dev/null
+++ b/fvpbase/BoardConfig.mk
@@ -0,0 +1,51 @@
+# Copyright (C) 2019 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+TARGET_ARCH := arm64
+TARGET_ARCH_VARIANT := armv8-a
+TARGET_CPU_VARIANT := generic
+TARGET_CPU_ABI := arm64-v8a
+
+TARGET_2ND_ARCH := arm
+TARGET_2ND_CPU_ABI := armeabi-v7a
+TARGET_2ND_CPU_ABI2 := armeabi
+TARGET_2ND_ARCH_VARIANT := armv8-a
+TARGET_2ND_CPU_VARIANT := generic
+
+include build/make/target/board/BoardConfigMainlineCommon.mk
+
+TARGET_NO_KERNEL := true
+
+BOARD_USES_SYSTEM_OTHER_ODEX :=
+
+BUILD_QEMU_IMAGES := true
+TARGET_USERIMAGES_SPARSE_EXT_DISABLED := true
+
+BOARD_BUILD_SUPER_IMAGE_BY_DEFAULT := true
+
+BOARD_SUPER_PARTITION_SIZE := 3229614080
+BOARD_SUPER_PARTITION_GROUPS := fvp_dynamic_partitions
+BOARD_FVP_DYNAMIC_PARTITIONS_SIZE := 3221225472
+BOARD_FVP_DYNAMIC_PARTITIONS_PARTITION_LIST := system vendor
+TARGET_COPY_OUT_PRODUCT := system/product
+TARGET_COPY_OUT_SYSTEM_EXT := system/system_ext
+
+BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE := ext4
+
+BOARD_USERDATAIMAGE_PARTITION_SIZE := 576716800
+
+BOARD_SEPOLICY_DIRS += device/generic/goldfish/fvpbase/sepolicy
+
+TARGET_EXPERIMENTAL_MTE := true
diff --git a/fvpbase/README.md b/fvpbase/README.md
new file mode 100644
index 0000000..d98edb0
--- /dev/null
+++ b/fvpbase/README.md
@@ -0,0 +1,119 @@
+This document describes how to build and run an Android system image targeting
+the ARM Fixed Virtual Platform.
+
+### Building userspace
+
+```
+. build/envsetup.sh
+lunch fvp-eng # or fvp-userdebug
+m
+```
+
+Note that running ``m`` requires that the kernel is built first following
+the instructions below.
+
+### Building the kernel
+
+```
+mkdir android-kernel-mainline
+cd android-kernel-mainline
+repo init -u https://android.googlesource.com/kernel/manifest -b common-android-mainline
+repo sync
+BUILD_CONFIG=common/build.config.fvp build/build.sh
+```
+
+The resulting kernel image and DTB must then be copied into the product output directory:
+
+```
+mkdir -p $ANDROID_PRODUCT_OUT/boot
+cp out/android-mainline/dist/Image out/android-mainline/dist/initramfs.img $ANDROID_PRODUCT_OUT/boot/
+cp out/android-mainline/dist/fvp-base-revc.dtb $ANDROID_PRODUCT_OUT/boot/devtree.dtb
+```
+
+### Building the firmware (ARM Trusted Firmware and U-Boot)
+
+First, install ``dtc``, the device tree compiler. On Debian, this is in the
+``device-tree-compiler`` package. Then run:
+```
+mkdir platform
+cd platform
+repo init -u https://git.linaro.org/landing-teams/working/arm/manifest.git -m pinned-ack.xml -b 19.10
+repo sync
+
+mkdir -p tools/gcc
+cd tools/gcc
+wget https://releases.linaro.org/components/toolchain/binaries/6.2-2016.11/aarch64-linux-gnu/gcc-linaro-6.2.1-2016.11-x86_64_aarch64-linux-gnu.tar.xz
+tar -xJf gcc-linaro-6.2.1-2016.11-x86_64_aarch64-linux-gnu.tar.xz
+wget https://releases.linaro.org/components/toolchain/binaries/6.2-2016.11/arm-linux-gnueabihf/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf.tar.xz
+tar -xJf gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf.tar.xz
+cd ../..
+
+CFLAGS=-w build-scripts/build-all.sh -p fvp -f busybox build
+build-scripts/build-all.sh -p fvp -f busybox package
+```
+
+These components must then be copied into the product output directory:
+
+```
+cp output/fvp/fvp-busybox/uboot/bl1.bin output/fvp/fvp-busybox/uboot/fip.bin $ANDROID_PRODUCT_OUT/boot/
+```
+
+### Obtaining the model
+
+The model may be obtained from [ARM's
+website](https://developer.arm.com/tools-and-software/simulation-models/fixed-virtual-platforms)
+(under "Armv8-A Base Platform FVP").
+
+### Running the model
+
+From a lunched environment, first set the value of the ``MODEL_BIN``
+environment variable to the path to the model executable. Then run the
+following command to launch the model:
+```
+device/generic/goldfish/fvpbase/run_model
+```
+Additional model parameters may be passed by appending them to the
+``run_model`` command.
+
+To terminate the model, press ``Ctrl-] Ctrl-D`` to terminate the telnet
+connection.
+
+### MTE support
+
+**WARNING**: The kernel MTE support patches are experimental and the userspace
+interface is subject to change.
+
+To launch the model with MTE support, the following additional parameters
+must be used:
+```
+-C cluster0.has_arm_v8-5=1 \
+-C cluster0.memory_tagging_support_level=2 \
+-C bp.dram_metadata.is_enabled=1
+```
+MTE in userspace requires a patched common kernel with MTE support. To build
+the kernel, follow the kernel instructions above, but before running the
+``build.sh`` command, run:
+```
+cd common
+git fetch https://github.com/pcc/linux android-experimental-mte
+git checkout FETCH_HEAD
+cd ..
+```
+Then replace the prebuilt binutils with binutils 2.33.1:
+```
+cd binutils-2.33.1
+./configure --prefix=$PWD/inst --target=aarch64-linux-gnu
+make
+make install
+for i in $PWD/inst/bin/*; do
+  ln -sf $i /path/to/android-kernel-mainline/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/$(basename $i)
+  ln -sf $i /path/to/android-kernel-mainline/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/$(basename $i | sed -e 's/gnu/android/g')
+done
+```
+
+### Accessing the model via adb
+
+To connect to the model on the host:
+```
+adb connect localhost:5555
+```
diff --git a/fvpbase/fstab.fvpbase b/fvpbase/fstab.fvpbase
new file mode 100644
index 0000000..6c62809
--- /dev/null
+++ b/fvpbase/fstab.fvpbase
@@ -0,0 +1,8 @@
+# Android fstab file.
+#<src>                                                  <mnt_point>         <type>    <mnt_flags and options>                              <fs_mgr_flags>
+# The filesystem that contains the filesystem checker binary (typically /system) cannot
+# specify MF_CHECK, and must come before any filesystems that do specify MF_CHECK
+system   /system     ext4    ro,barrier=1     wait,logical,first_stage_mount
+vendor   /vendor     ext4    ro,barrier=1     wait,logical,first_stage_mount
+/dev/block/mmcblk0  /data    ext4      noatime,nosuid,nodev,nomblk_io_submit,errors=panic   wait,check,quota
+/devices/*/block/vde  auto  auto      defaults voldmanaged=sdcard:auto,encryptable=userdata
diff --git a/fvpbase/fstab.fvpbase.initrd b/fvpbase/fstab.fvpbase.initrd
new file mode 100644
index 0000000..5605663
--- /dev/null
+++ b/fvpbase/fstab.fvpbase.initrd
@@ -0,0 +1,4 @@
+# Android fstab file.
+#<dev>  <mnt_point> <type>  <mnt_flags options> <fs_mgr_flags>
+system   /system     ext4    ro,barrier=1     wait,logical,first_stage_mount
+vendor   /vendor     ext4    ro,barrier=1     wait,logical,first_stage_mount
diff --git a/fvpbase/init.fvpbase.rc b/fvpbase/init.fvpbase.rc
new file mode 100644
index 0000000..4d3db00
--- /dev/null
+++ b/fvpbase/init.fvpbase.rc
@@ -0,0 +1,2 @@
+on fs
+    mount_all /vendor/etc/fstab.fvpbase
diff --git a/fvpbase/manifest.xml b/fvpbase/manifest.xml
new file mode 100644
index 0000000..bd369ae
--- /dev/null
+++ b/fvpbase/manifest.xml
@@ -0,0 +1,102 @@
+<manifest version="1.0" type="device" target-level="3">
+    <hal format="hidl">
+        <name>android.hardware.audio</name>
+        <transport>hwbinder</transport>
+        <version>4.0</version>
+        <interface>
+            <name>IDevicesFactory</name>
+            <instance>default</instance>
+        </interface>
+    </hal>
+    <hal format="hidl">
+        <name>android.hardware.audio.effect</name>
+        <transport>hwbinder</transport>
+        <version>4.0</version>
+        <interface>
+            <name>IEffectsFactory</name>
+            <instance>default</instance>
+        </interface>
+    </hal>
+    <hal format="hidl">
+        <name>android.hardware.configstore</name>
+        <transport>hwbinder</transport>
+        <version>1.1</version>
+        <interface>
+            <name>ISurfaceFlingerConfigs</name>
+            <instance>default</instance>
+        </interface>
+    </hal>
+    <hal format="hidl">
+        <name>android.hardware.drm</name>
+        <transport>hwbinder</transport>
+        <version>1.0</version>
+        <interface>
+            <name>ICryptoFactory</name>
+            <instance>default</instance>
+        </interface>
+        <interface>
+            <name>IDrmFactory</name>
+            <instance>default</instance>
+        </interface>
+        <fqname>@1.2::ICryptoFactory/clearkey</fqname>
+        <fqname>@1.2::IDrmFactory/clearkey</fqname>
+    </hal>
+    <hal format="hidl">
+        <name>android.hardware.graphics.allocator</name>
+        <transport>hwbinder</transport>
+        <version>2.0</version>
+        <interface>
+            <name>IAllocator</name>
+            <instance>default</instance>
+        </interface>
+    </hal>
+    <hal format="hidl">
+        <name>android.hardware.graphics.composer</name>
+        <transport>hwbinder</transport>
+        <version>2.1</version>
+        <interface>
+            <name>IComposer</name>
+            <instance>default</instance>
+        </interface>
+    </hal>
+    <hal format="hidl">
+        <name>android.hardware.graphics.mapper</name>
+        <transport arch="32+64">passthrough</transport>
+        <version>2.0</version>
+        <interface>
+            <name>IMapper</name>
+            <instance>default</instance>
+        </interface>
+    </hal>
+    <hal format="hidl">
+        <name>android.hardware.health</name>
+        <transport>hwbinder</transport>
+        <version>2.0</version>
+        <interface>
+            <name>IHealth</name>
+            <instance>default</instance>
+        </interface>
+    </hal>
+    <hal format="hidl">
+        <name>android.hardware.keymaster</name>
+        <transport>hwbinder</transport>
+        <version>4.0</version>
+        <interface>
+            <name>IKeymasterDevice</name>
+            <instance>default</instance>
+        </interface>
+    </hal>
+    <hal format="hidl">
+        <name>android.hardware.media.omx</name>
+        <transport>hwbinder</transport>
+        <version>1.0</version>
+        <interface>
+            <name>IOmx</name>
+            <instance>default</instance>
+        </interface>
+        <interface>
+            <name>IOmxStore</name>
+            <instance>default</instance>
+        </interface>
+    </hal>
+</manifest>
diff --git a/fvpbase/run_model b/fvpbase/run_model
new file mode 100755
index 0000000..3e2a798
--- /dev/null
+++ b/fvpbase/run_model
@@ -0,0 +1,49 @@
+#!/bin/sh -eu
+#
+# Copyright 2019 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+tmp="$(mktemp -d)"
+trap "rm -rf $tmp" EXIT
+mkfifo $tmp/port
+
+"$MODEL_BIN" \
+  -C bp.secureflashloader.fname="$ANDROID_PRODUCT_OUT/boot/bl1.bin" \
+  -C bp.flashloader0.fname="$ANDROID_PRODUCT_OUT/boot/fip.bin" \
+  -C cluster0.cpu0.semihosting-cwd="$ANDROID_PRODUCT_OUT/boot" \
+  -C bp.virtioblockdevice.image_path="$ANDROID_PRODUCT_OUT/system-qemu.img" \
+  -C bp.mmc.p_mmc_file="$ANDROID_PRODUCT_OUT/userdata.img" \
+  -C bp.secure_memory=0 \
+  -C cache_state_modelled=0 \
+  -C bp.pl011_uart0.unbuffered_output=1 \
+  -C bp.pl011_uart0.out_file="$ANDROID_PRODUCT_OUT/uart0.log" \
+  -C bp.pl011_uart1.out_file="$ANDROID_PRODUCT_OUT/uart1.log" \
+  -C bp.terminal_0.terminal_command="echo %port > $tmp/port" \
+  -C bp.terminal_1.start_telnet=0 \
+  -C bp.ve_sysregs.mmbSiteDefault=0 \
+  -C bp.ve_sysregs.exit_on_shutdown=1 \
+  -C bp.virtio_net.hostbridge.userNetworking=1 \
+  -C bp.virtio_net.hostbridge.userNetPorts=5555=5555 \
+  -C bp.virtio_net.enabled=1 \
+  -C cluster0.NUM_CORES=1 \
+  -C cluster0.cpu0.clock_multiplier=20 \
+  -C cluster0.cpu0.enable_crc32=1 \
+  -C cluster1.NUM_CORES=0 \
+  "$@" &
+
+read port < $tmp/port
+telnet localhost $port
+kill -INT %%
+wait
diff --git a/fvpbase/sepolicy/file.te b/fvpbase/sepolicy/file.te
new file mode 100644
index 0000000..b3bd582
--- /dev/null
+++ b/fvpbase/sepolicy/file.te
@@ -0,0 +1 @@
+type varrun_file, file_type, data_file_type, mlstrustedobject;
diff --git a/fvpbase/sepolicy/file_contexts b/fvpbase/sepolicy/file_contexts
new file mode 100644
index 0000000..0c5f7b5
--- /dev/null
+++ b/fvpbase/sepolicy/file_contexts
@@ -0,0 +1,6 @@
+/data/vendor/var/run(/.*)?                       u:object_r:varrun_file:s0
+/dev/block/mmcblk0                               u:object_r:userdata_block_device:s0
+/vendor/bin/hw/android\.hardware\.gatekeeper@1\.0-service.software u:object_r:hal_gatekeeper_default_exec:s0
+/vendor/lib(64)?/libEGL_swiftshader\.so          u:object_r:same_process_hal_file:s0
+/vendor/lib(64)?/libGLESv1_CM_swiftshader\.so    u:object_r:same_process_hal_file:s0
+/vendor/lib(64)?/libGLESv2_swiftshader\.so       u:object_r:same_process_hal_file:s0
diff --git a/fvpbase/sepolicy/hal_graphics_allocator_default.te b/fvpbase/sepolicy/hal_graphics_allocator_default.te
new file mode 100644
index 0000000..6676f57
--- /dev/null
+++ b/fvpbase/sepolicy/hal_graphics_allocator_default.te
@@ -0,0 +1,4 @@
+allow hal_graphics_allocator_default graphics_device:dir search;
+allow hal_graphics_allocator_default graphics_device:chr_file { ioctl open read write map rw_file_perms };
+allow hal_graphics_allocator_default dumpstate:fd use;
+allow hal_graphics_allocator_default dumpstate:fifo_file write;
diff --git a/fvpbase/sepolicy/property.te b/fvpbase/sepolicy/property.te
new file mode 100644
index 0000000..f014ad5
--- /dev/null
+++ b/fvpbase/sepolicy/property.te
@@ -0,0 +1 @@
+type vendor_device_prop, property_type;
diff --git a/fvpbase/sepolicy/property_contexts b/fvpbase/sepolicy/property_contexts
new file mode 100644
index 0000000..c389bdd
--- /dev/null
+++ b/fvpbase/sepolicy/property_contexts
@@ -0,0 +1 @@
+vendor.all.modules.ready u:object_r:vendor_device_prop:s0
diff --git a/fvpbase/sepolicy/surfaceflinger.te b/fvpbase/sepolicy/surfaceflinger.te
new file mode 100644
index 0000000..9523630
--- /dev/null
+++ b/fvpbase/sepolicy/surfaceflinger.te
@@ -0,0 +1 @@
+allow surfaceflinger self:process execmem;
diff --git a/gps/Android.mk b/gps/Android.mk
index d1b593a..7196f5f 100644
--- a/gps/Android.mk
+++ b/gps/Android.mk
@@ -28,7 +28,9 @@
 LOCAL_MODULE_RELATIVE_PATH := hw
 LOCAL_CFLAGS += -DQEMU_HARDWARE
 LOCAL_SHARED_LIBRARIES := liblog libcutils libhardware
-LOCAL_C_INCLUDES += $(LOCAL_PATH)/../include
+LOCAL_C_INCLUDES += \
+	$(LOCAL_PATH)/../include \
+	$(LOCAL_PATH)/../../goldfish-opengl/shared/OpenglCodecCommon
 LOCAL_SRC_FILES := gps_qemu.c
 ifeq ($(TARGET_PRODUCT),vbox_x86)
 LOCAL_MODULE := gps.vbox_x86
@@ -44,7 +46,9 @@
 LOCAL_MODULE_RELATIVE_PATH := hw
 LOCAL_CFLAGS += -DQEMU_HARDWARE
 LOCAL_SHARED_LIBRARIES := liblog libcutils libhardware
-LOCAL_C_INCLUDES += $(LOCAL_PATH)/../include
+LOCAL_C_INCLUDES += \
+	$(LOCAL_PATH)/../include \
+	$(LOCAL_PATH)/../../goldfish-opengl/shared/OpenglCodecCommon
 LOCAL_SRC_FILES := gps_qemu.c
 LOCAL_MODULE := gps.ranchu
 
diff --git a/gps/gps_qemu.c b/gps/gps_qemu.c
index 59d2f4e..cfb8e36 100644
--- a/gps/gps_qemu.c
+++ b/gps/gps_qemu.c
@@ -36,10 +36,10 @@
 #include <cutils/sockets.h>
 #include <cutils/properties.h>
 #include <hardware/gps.h>
-#include "qemu_pipe.h"
+#include "qemud.h"
 
 /* the name of the qemu-controlled pipe */
-#define  QEMU_CHANNEL_NAME  "qemud:gps"
+#define  QEMUD_CHANNEL_NAME  "gps"
 
 #define  GPS_DEBUG  0
 
@@ -773,15 +773,18 @@
     int         control_fd = state->control[1];
     GpsStatus gps_status;
     gps_status.size = sizeof(gps_status);
-    GpsSvStatus  gps_sv_status;
-    memset(&gps_sv_status, 0, sizeof(gps_sv_status));
-    gps_sv_status.size = sizeof(gps_sv_status);
-    gps_sv_status.num_svs = 1;
-    gps_sv_status.sv_list[0].size = sizeof(gps_sv_status.sv_list[0]);
-    gps_sv_status.sv_list[0].prn = 17;
-    gps_sv_status.sv_list[0].snr = 60.0;
-    gps_sv_status.sv_list[0].elevation = 30.0;
-    gps_sv_status.sv_list[0].azimuth = 30.0;
+
+    GnssSvStatus  gnss_sv_status;
+    memset(&gnss_sv_status, 0, sizeof(gnss_sv_status));
+    gnss_sv_status.size = sizeof(gnss_sv_status);
+    gnss_sv_status.num_svs = 1;
+    gnss_sv_status.gnss_sv_list[0].size = sizeof(gnss_sv_status.gnss_sv_list[0]);
+    gnss_sv_status.gnss_sv_list[0].svid = 17;
+    gnss_sv_status.gnss_sv_list[0].constellation = GNSS_CONSTELLATION_GPS;
+    gnss_sv_status.gnss_sv_list[0].c_n0_dbhz = 60.0;
+    gnss_sv_status.gnss_sv_list[0].elevation = 30.0;
+    gnss_sv_status.gnss_sv_list[0].azimuth = 30.0;
+    gnss_sv_status.gnss_sv_list[0].flags = GNSS_SV_FLAGS_HAS_CARRIER_FREQUENCY;
 
     nmea_reader_init( reader );
 
@@ -801,8 +804,8 @@
             timeout = 10 * 1000; // 10 seconds
         }
         nevents = epoll_wait( epoll_fd, events, 2, timeout );
-        if (state->callbacks.sv_status_cb) {
-            state->callbacks.sv_status_cb(&gps_sv_status);
+        if (state->callbacks.gnss_sv_status_cb) {
+            state->callbacks.gnss_sv_status_cb(&gnss_sv_status);
         }
         // update satilite info
         if (nevents < 0) {
@@ -907,14 +910,14 @@
     state->control[1] = -1;
     state->fd         = -1;
 
-    state->fd = qemu_pipe_open(QEMU_CHANNEL_NAME);
+    state->fd = qemud_channel_open(QEMUD_CHANNEL_NAME);
 
     if (state->fd < 0) {
         D("no gps emulation detected");
         return;
     }
 
-    D("gps emulation will read from '%s' qemu pipe", QEMU_CHANNEL_NAME );
+    D("gps emulation will read from '%s' qemud channel", QEMUD_CHANNEL_NAME );
 
     if ( socketpair( AF_LOCAL, SOCK_STREAM, 0, state->control ) < 0 ) {
         ALOGE("could not create thread control socket pair: %s", strerror(errno));
diff --git a/health/Android.bp b/health/Android.bp
deleted file mode 100644
index 11a7a8d..0000000
--- a/health/Android.bp
+++ /dev/null
@@ -1,32 +0,0 @@
-cc_binary {
-    name: "android.hardware.health@2.0-service.goldfish",
-    init_rc: ["android.hardware.health@2.0-service.goldfish.rc"],
-    proprietary: true,
-    relative_install_path: "hw",
-    srcs: [
-        "HealthService.cpp",
-    ],
-    cflags: [
-        "-Wall",
-        "-Werror",
-    ],
-    static_libs: [
-        "android.hardware.health@2.0-impl",
-        "android.hardware.health@1.0-convert",
-        "libhealthservice",
-        "libbatterymonitor",
-        "libhealthstoragedefault",
-    ],
-    shared_libs: [
-        "libbase",
-        "libcutils",
-        "libhidlbase",
-        "libutils",
-        "android.hardware.health@2.0",
-    ],
-    header_libs: ["libhealthd_headers"],
-
-    overrides: [
-        "healthd",
-    ],
-}
diff --git a/health/HealthService.cpp b/health/HealthService.cpp
deleted file mode 100644
index 2498a5c..0000000
--- a/health/HealthService.cpp
+++ /dev/null
@@ -1,12 +0,0 @@
-#include <health2/service.h>
-#include <healthd/healthd.h>
-
-int main() {
-    return health_service_main();
-}
-
-void healthd_board_init(struct healthd_config*) {}
-
-int healthd_board_battery_update(struct android::BatteryProperties*) {
-    return 0;
-}
diff --git a/health/android.hardware.health@2.0-service.goldfish.rc b/health/android.hardware.health@2.0-service.goldfish.rc
deleted file mode 100644
index ecd42e4..0000000
--- a/health/android.hardware.health@2.0-service.goldfish.rc
+++ /dev/null
@@ -1,5 +0,0 @@
-service vendor.health-hal-2-0 /vendor/bin/hw/android.hardware.health@2.0-service.goldfish
-    class hal
-    user system
-    group system
-    file /dev/kmsg w
diff --git a/include/Android.bp b/include/Android.bp
deleted file mode 100644
index 2f09676..0000000
--- a/include/Android.bp
+++ /dev/null
@@ -1,5 +0,0 @@
-cc_library_headers {
-    name: "goldfish_headers",
-    vendor_available: true,
-    export_include_dirs: ["."],
-}
diff --git a/include/qemu.h b/include/qemu.h
deleted file mode 100644
index b5ba463..0000000
--- a/include/qemu.h
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _libs_hardware_qemu_h
-#define _libs_hardware_qemu_h
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* returns 1 iff we're running in the emulator */
-extern int  qemu_check(void);
-
-/* a structure used to hold enough state to connect to a given
- * QEMU communication channel, either through a qemud socket or
- * a serial port.
- *
- * initialize the structure by zero-ing it out
- */
-typedef struct {
-    char   is_inited;
-    char   is_available;
-    char   is_qemud;
-    char   is_qemud_old;
-    char   is_tty;
-    int    fd;
-    char   device[32];
-} QemuChannel;
-
-/* try to open a qemu communication channel.
- * returns a file descriptor on success, or -1 in case of
- * error.
- *
- * 'channel' must be a QemuChannel structure that is empty
- * on the first call. You can call this function several
- * time to re-open the channel using the same 'channel'
- * object to speed things a bit.
- */
-extern int  qemu_channel_open( QemuChannel*  channel,
-                               const char*   name,
-                               int           mode );
-
-/* create a command made of a 4-hexchar prefix followed
- * by the content. the prefix contains the content's length
- * in hexadecimal coding.
- *
- * 'buffer' must be at last 6 bytes
- * returns -1 in case of overflow, or the command's total length
- * otherwise (i.e. content length + 4)
- */
-extern int  qemu_command_format( char*        buffer, 
-                                 int          buffer_size,
-                                 const char*  format,
-                                 ... );
-
-/* directly sends a command through the 'hw-control' channel.
- * this will open the channel, send the formatted command, then
- * close the channel automatically.
- * returns 0 on success, or -1 on error.
- */
-extern int  qemu_control_command( const char*  fmt, ... );
-
-/* sends a question to the hw-control channel, then receive an answer in
- * a user-allocated buffer. returns the length of the answer, or -1
- * in case of error.
- *
- * 'question' *must* have been formatted through qemu_command_format
- */
-extern int  qemu_control_query( const char*  question, int  questionlen,
-                                char*        answer,   int  answersize );
-
-/* use QEMU_FALLBACK(call) to call a QEMU-specific callback  */
-/* use QEMU_FALLBACK_VOID(call) if the function returns void */
-#  define  QEMU_FALLBACK(x)  \
-    do { \
-        if (qemu_check()) \
-            return qemu_ ## x ; \
-    } while (0)
-#  define  QEMU_FALLBACK_VOID(x)  \
-    do { \
-        if (qemu_check()) { \
-            qemu_ ## x ; \
-            return; \
-        } \
-    } while (0)
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _libs_hardware_qemu_h */
diff --git a/include/qemu_pipe.h b/include/qemu_pipe.h
deleted file mode 100644
index d585ba1..0000000
--- a/include/qemu_pipe.h
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef ANDROID_INCLUDE_HARDWARE_QEMU_PIPE_H
-#define ANDROID_INCLUDE_HARDWARE_QEMU_PIPE_H
-
-#include <sys/cdefs.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <sys/mman.h>
-#include <pthread.h>  /* for pthread_once() */
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-
-#ifndef D
-#  define  D(...)   do{}while(0)
-#endif
-
-typedef int QEMU_PIPE_HANDLE;
-
-#define QEMU_PIPE_INVALID_HANDLE -1
-
-static __inline__ bool ReadFully(int fd, void* data, size_t byte_count) {
-  uint8_t* p = (uint8_t*)(data);
-  size_t remaining = byte_count;
-  while (remaining > 0) {
-    ssize_t n = TEMP_FAILURE_RETRY(read(fd, p, remaining));
-    if (n <= 0) return false;
-    p += n;
-    remaining -= n;
-  }
-  return true;
-}
-
-static __inline__ bool WriteFully(int fd, const void* data, size_t byte_count) {
-  const uint8_t* p = (const uint8_t*)(data);
-  size_t remaining = byte_count;
-  while (remaining > 0) {
-    ssize_t n = TEMP_FAILURE_RETRY(write(fd, p, remaining));
-    if (n == -1) return false;
-    p += n;
-    remaining -= n;
-  }
-  return true;
-}
-
-/* Try to open a new Qemu fast-pipe. This function returns a file descriptor
- * that can be used to communicate with a named service managed by the
- * emulator.
- *
- * This file descriptor can be used as a standard pipe/socket descriptor.
- *
- * 'pipeName' is the name of the emulator service you want to connect to.
- * E.g. 'opengles' or 'camera'.
- *
- * On success, return a valid file descriptor
- * Returns -1 on error, and errno gives the error code, e.g.:
- *
- *    EINVAL  -> unknown/unsupported pipeName
- *    ENOSYS  -> fast pipes not available in this system.
- *
- * ENOSYS should never happen, except if you're trying to run within a
- * misconfigured emulator.
- *
- * You should be able to open several pipes to the same pipe service,
- * except for a few special cases (e.g. GSM modem), where EBUSY will be
- * returned if more than one client tries to connect to it.
- */
-static __inline__ int
-qemu_pipe_open(const char*  pipeName)
-{
-    char  buff[256];
-    int   buffLen;
-    int   fd;
-
-    if (pipeName == NULL || pipeName[0] == '\0') {
-        errno = EINVAL;
-        return -1;
-    }
-
-    snprintf(buff, sizeof buff, "pipe:%s", pipeName);
-
-    fd = TEMP_FAILURE_RETRY(open("/dev/qemu_pipe", O_RDWR));
-    if (fd < 0 && errno == ENOENT)
-        fd = TEMP_FAILURE_RETRY(open("/dev/goldfish_pipe", O_RDWR));
-    if (fd < 0) {
-        D("%s: Could not open /dev/qemu_pipe: %s", __FUNCTION__, strerror(errno));
-        //errno = ENOSYS;
-        return -1;
-    }
-
-    buffLen = strlen(buff);
-
-    if (!WriteFully(fd, buff, buffLen + 1)) {
-        D("%s: Could not connect to %s pipe service: %s", __FUNCTION__, pipeName, strerror(errno));
-        return -1;
-    }
-
-    return fd;
-}
-
-static __inline__ bool
-qemu_pipe_valid(QEMU_PIPE_HANDLE pipe) {
-    return pipe >= 0;
-}
-#endif /* ANDROID_INCLUDE_HARDWARE_QEMUD_PIPE_H */
diff --git a/include/qemud.h b/include/qemud.h
index c6327ee..282ea4c 100644
--- a/include/qemud.h
+++ b/include/qemud.h
@@ -17,74 +17,16 @@
 #ifndef ANDROID_INCLUDE_HARDWARE_QEMUD_H
 #define ANDROID_INCLUDE_HARDWARE_QEMUD_H
 
-#include <cutils/sockets.h>
 #include "qemu_pipe.h"
 
-/* the following is helper code that is used by the QEMU-specific
- * hardware HAL modules to communicate with the emulator program
- * through the 'qemud' multiplexing daemon, or through the qemud
- * pipe.
- *
- * see the documentation comments for details in
- * development/emulator/qemud/qemud.c
- *
- * all definitions here are built into the HAL module to avoid
- * having to write a tiny shared library for this.
- */
-
-/* we expect the D macro to be defined to a function macro
- * that sends its formatted string argument(s) to the log.
- * If not, ignore the traces.
- */
-#ifndef D
-#  define  D(...)   do{}while(0)
-#endif
-
-
-static __inline__ int
+static __inline__ QEMU_PIPE_HANDLE
 qemud_channel_open(const char*  name)
 {
-    int  fd;
-    int  namelen = strlen(name);
-    char answer[2];
-    char pipe_name[256];
-
-    /* First, try to connect to the pipe. */
-    snprintf(pipe_name, sizeof(pipe_name), "qemud:%s", name);
-    fd = qemu_pipe_open(pipe_name);
-    D("%s: pipe name %s (name %s) fd %d", __FUNCTION__, pipe_name, name, fd);
-    if (fd < 0) {
-        D("QEMUD pipe is not available for %s: %s", name, strerror(errno));
-        /* If pipe is not available, connect to qemud control socket */
-        fd = socket_local_client( "qemud",
-                                  ANDROID_SOCKET_NAMESPACE_RESERVED,
-                                  SOCK_STREAM );
-        if (fd < 0) {
-            D("no qemud control socket: %s", strerror(errno));
-            return -1;
-        }
-
-        /* send service name to connect */
-        if (!WriteFully(fd, name, namelen)) {
-            D("can't send service name to qemud: %s",
-               strerror(errno));
-            close(fd);
-            return -1;
-        }
-
-        /* read answer from daemon */
-        if (!ReadFully(fd, answer, 2) ||
-            answer[0] != 'O' || answer[1] != 'K') {
-            D("cant' connect to %s service through qemud", name);
-            close(fd);
-            return -1;
-        }
-    }
-    return fd;
+    return qemu_pipe_open_ns("qemud", name, O_RDWR);
 }
 
 static __inline__ int
-qemud_channel_send(int  fd, const void*  msg, int  msglen)
+qemud_channel_send(QEMU_PIPE_HANDLE pipe, const void*  msg, int  msglen)
 {
     char  header[5];
 
@@ -94,26 +36,26 @@
     if (msglen == 0)
         return 0;
 
-    snprintf(header, sizeof header, "%04x", msglen);
-    if (!WriteFully(fd, header, 4)) {
+    snprintf(header, sizeof(header), "%04x", msglen);
+    if (qemu_pipe_write_fully(pipe, header, 4)) {
         D("can't write qemud frame header: %s", strerror(errno));
         return -1;
     }
 
-    if (!WriteFully(fd, msg, msglen)) {
-        D("can4t write qemud frame payload: %s", strerror(errno));
+    if (qemu_pipe_write_fully(pipe, msg, msglen)) {
+        D("can't write qemud frame payload: %s", strerror(errno));
         return -1;
     }
     return 0;
 }
 
 static __inline__ int
-qemud_channel_recv(int  fd, void*  msg, int  msgsize)
+qemud_channel_recv(QEMU_PIPE_HANDLE pipe, void*  msg, int  msgsize)
 {
     char  header[5];
     int   size;
 
-    if (!ReadFully(fd, header, 4)) {
+    if (qemu_pipe_read_fully(pipe, header, 4)) {
         D("can't read qemud frame header: %s", strerror(errno));
         return -1;
     }
@@ -125,7 +67,7 @@
     if (size > msgsize)
         return -1;
 
-    if (!ReadFully(fd, msg, size)) {
+    if (qemu_pipe_read_fully(pipe, msg, size)) {
         D("can't read qemud frame payload: %s", strerror(errno));
         return -1;
     }
diff --git a/init.ranchu.rc b/init.ranchu.rc
index 08a0c81..1895844 100644
--- a/init.ranchu.rc
+++ b/init.ranchu.rc
@@ -72,6 +72,7 @@
 
 on property:dev.bootcomplete=1
     setprop vendor.qemu.dev.bootcomplete 1
+    start ranchu-setup
 
 service ranchu-net /vendor/bin/init.ranchu-net.sh
     class late_start
diff --git a/input-mt/virtio_input_multi_touch_2.idc b/input-mt/virtio_input_multi_touch_2.idc
index 8e1b02a..548d5b0 100644
--- a/input-mt/virtio_input_multi_touch_2.idc
+++ b/input-mt/virtio_input_multi_touch_2.idc
@@ -9,4 +9,4 @@
 # This displayID matches the unique ID of the virtual display created for Emulator.
 # This will indicate to input flinger than it should link this input device
 # with the virtual display.
-touch.displayId = local:8140900251843329
+touch.displayId = local:1
diff --git a/input-mt/virtio_input_multi_touch_3.idc b/input-mt/virtio_input_multi_touch_3.idc
index 6a11240..d255d5f 100644
--- a/input-mt/virtio_input_multi_touch_3.idc
+++ b/input-mt/virtio_input_multi_touch_3.idc
@@ -9,4 +9,4 @@
 # This displayID matches the unique ID of the virtual display created for Emulator.
 # This will indicate to input flinger than it should link this input device
 # with the virtual display.
-touch.displayId = local:8140940453066754
+touch.displayId = local:2
diff --git a/kernel-tests/advancedFeatures.ini b/kernel-tests/advancedFeatures.ini
index e1f8b6a..b26c18d 100644
--- a/kernel-tests/advancedFeatures.ini
+++ b/kernel-tests/advancedFeatures.ini
@@ -8,3 +8,6 @@
 Wifi = on
 HostComposition = on
 DynamicPartition = on
+GLDirectMem = on
+VulkanNullOptionalStrings = on
+VulkanIgnoredHandles = on
diff --git a/kernel-tests/goldfish_kernel_tests_x86_64.mk b/kernel-tests/goldfish_kernel_tests_x86_64.mk
index e3ccec6..84bc73c 100644
--- a/kernel-tests/goldfish_kernel_tests_x86_64.mk
+++ b/kernel-tests/goldfish_kernel_tests_x86_64.mk
@@ -94,11 +94,9 @@
     toolbox \
     toybox \
     vold \
-    init \
     init_system \
     init_vendor \
     init.environ.rc \
-    init.rc \
     reboot \
     service \
     cmd \
@@ -125,9 +123,8 @@
     mac_permissions.xml \
 
 PRODUCT_COPY_FILES += \
-    $(SYSTEM_CORE_ROOTDIR)/init.usb.rc:root/init.usb.rc \
-    $(SYSTEM_CORE_ROOTDIR)/init.usb.configfs.rc:root/init.usb.configfs.rc \
-    $(SYSTEM_CORE_ROOTDIR)/ueventd.rc:root/ueventd.rc \
+    $(SYSTEM_CORE_ROOTDIR)/init.usb.rc:system/etc/init/hw/init.usb.rc \
+    $(SYSTEM_CORE_ROOTDIR)/init.usb.configfs.rc:system/etc/init/hw/init.usb.configfs.rc \
     $(SYSTEM_CORE_ROOTDIR)/etc/hosts:system/etc/hosts \
 
 PRODUCT_COPY_FILES += \
@@ -138,7 +135,6 @@
     $(GOLDFISH_DIR)/ueventd.ranchu.rc:$(TARGET_COPY_OUT_VENDOR)/ueventd.rc \
 
 PRODUCT_COPY_FILES += \
-    $(THIS_DIR)/manifest.xml:$(TARGET_COPY_OUT_VENDOR)/manifest.xml \
     $(THIS_DIR)/init.ranchu-core.sh:$(TARGET_COPY_OUT_VENDOR)/bin/init.ranchu-core.sh \
     $(THIS_DIR)/init.ranchu.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/hw/init.ranchu.rc \
     $(THIS_DIR)/fstab.ranchu:$(TARGET_COPY_OUT_VENDOR)/etc/fstab.ranchu \
@@ -153,3 +149,14 @@
 
 PRODUCT_PROPERTY_OVERRIDES += \
     ro.carrier=unknown
+
+DEVICE_MANIFEST_FILE += $(THIS_DIR)/manifest.xml
+# VINTF stuff for system and vendor (no product / odm / system_ext / etc.)
+PRODUCT_PACKAGES += \
+    system_compatibility_matrix.xml \
+    system_manifest.xml \
+    vendor_compatibility_matrix.xml \
+    vendor_manifest.xml \
+
+# Disable VINTF checks.
+PRODUCT_ENFORCE_VINTF_MANIFEST_OVERRIDE := false
diff --git a/kernel-tests/manifest.xml b/kernel-tests/manifest.xml
index 82ba6d1..1612508 100644
--- a/kernel-tests/manifest.xml
+++ b/kernel-tests/manifest.xml
@@ -25,7 +25,4 @@
         <fqname>@1.1::ICryptoFactory/widevine</fqname>
         <fqname>@1.1::IDrmFactory/widevine</fqname>
     </hal>
-    <sepolicy>
-        <version>27.0</version>
-    </sepolicy>
 </manifest>
diff --git a/keymaster/trusty/Android.mk b/keymaster/trusty/Android.mk
index 1a5c844..63c419c 100644
--- a/keymaster/trusty/Android.mk
+++ b/keymaster/trusty/Android.mk
@@ -12,7 +12,8 @@
                    trusty_keymaster_device.cpp
 
 LOCAL_C_INCLUDES := system/security/keystore \
-                    $(LOCAL_PATH)/../../include
+                    $(LOCAL_PATH)/../../include \
+                    $(LOCAL_PATH)/../../../goldfish-opengl/shared/OpenglCodecCommon
 LOCAL_CFLAGS = -fvisibility=hidden -Wall -Werror
 LOCAL_SHARED_LIBRARIES := libcrypto liblog libsoftkeymasterdevice libkeymaster_messages libcutils
 LOCAL_HEADER_LIBRARIES := libhardware_headers
diff --git a/keymaster/trusty/trusty_keymaster_ipc.cpp b/keymaster/trusty/trusty_keymaster_ipc.cpp
index 381ba4a..75f75a5 100644
--- a/keymaster/trusty/trusty_keymaster_ipc.cpp
+++ b/keymaster/trusty/trusty_keymaster_ipc.cpp
@@ -28,7 +28,7 @@
 
 #include "keymaster_ipc.h"
 #include "trusty_keymaster_ipc.h"
-#include "qemud.h"
+#include "qemu_pipe.h"
 
 #define KEYMASTER_SERVICE_NAME "KeymasterService3"
 
@@ -36,7 +36,7 @@
 
 int trusty_keymaster_connect() {
     ALOGE("calling %s\n", __func__);
-    handle_ = qemu_pipe_open(KEYMASTER_SERVICE_NAME);
+    handle_ = qemu_pipe_open_ns(NULL, KEYMASTER_SERVICE_NAME, O_RDWR);
     if (handle_ < 0) {
         handle_ = 0;
         ALOGE("failed to open %s pipe service", KEYMASTER_SERVICE_NAME);
@@ -58,14 +58,14 @@
 
     int pipe_command_length = msg_size;
     assert(pipe_command_length > 0);
-    ssize_t rc = WriteFully(handle_, &pipe_command_length, sizeof(pipe_command_length));
-    if (rc < 1) {
+    ssize_t rc = qemu_pipe_write_fully(handle_, &pipe_command_length, sizeof(pipe_command_length));
+    if (rc) {
         ALOGE("failed to send msg_size (%d) for cmd (%d) to %s: %s\n", (int)(sizeof(pipe_command_length)),
                 (int)cmd, KEYMASTER_PORT, strerror(errno));
         return -errno;
     }
 
-    rc = WriteFully(handle_, msg, pipe_command_length);
+    rc = qemu_pipe_write_fully(handle_, msg, pipe_command_length);
     if (in_size == 157 && cmd == KM_FINISH_OPERATION) {
         for (int i=0; i < (int)in_size; ++i) {
             ALOGE("pay[%d]: %d", i, (int)(msg->payload[i]));
@@ -74,20 +74,20 @@
     free(msg);
 
 
-    if (rc < 1) {
+    if (rc) {
         ALOGE("failed to send cmd (%d) to %s: %s\n", cmd, KEYMASTER_PORT, strerror(errno));
         return -errno;
     }
 
-    rc = ReadFully(handle_, &pipe_command_length, sizeof(pipe_command_length));
-    if (rc < 1) {
+    rc = qemu_pipe_read_fully(handle_, &pipe_command_length, sizeof(pipe_command_length));
+    if (rc) {
         ALOGE("failed to retrieve response length for cmd (%d) to %s: %s\n", cmd, KEYMASTER_PORT,
               strerror(errno));
         return -errno;
     }
 
-    rc = ReadFully(handle_, out, pipe_command_length);
-    if (rc < 1) {
+    rc = qemu_pipe_read_fully(handle_, out, pipe_command_length);
+    if (rc) {
         ALOGE("failed to retrieve response for cmd (%d) to %s: %s\n", cmd, KEYMASTER_PORT,
               strerror(errno));
         return -errno;
diff --git a/libqemu/test_guest_1.c b/libqemu/test_guest_1.c
deleted file mode 100644
index 1a81000..0000000
--- a/libqemu/test_guest_1.c
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/* This program uses a QEMUD pipe to exchange data with a test
- * server. It's very simple:
- *
- *    for count in range(0,100):
- *       msg = "Hello Word " + count
- *       qemud_pipe_send(msg)
- *       qemud_pipe_recv(msg2)
- *       if (msg != msg2):
- *          error()
- *
- *
- * See test_host_1.c for the corresponding server code, which simply
- * sends back anything it receives from the client.
- */
-#include "test_util.h"
-#include <errno.h>
-#include <string.h>
-#include <stddef.h>
-#include <stdio.h>
-
-#define  PIPE_NAME  "pingpong"
-
-
-int main(void)
-{
-    Pipe  pipe[1];
-    const int maxCount = 100;
-    int port = 8012;
-
-#if 0
-    if (pipe_openSocket(pipe, port) < 0) {
-        fprintf(stderr, "Could not open tcp socket!\n");
-        return 1;
-    }
-    printf("Connected to tcp:host:%d\n", port);
-#else
-    if (pipe_openQemuPipe(pipe, PIPE_NAME) < 0) {
-        fprintf(stderr, "Could not open '%s' pipe: %s\n", PIPE_NAME, strerror(errno));
-        return 1;
-    }
-    printf("Connected to '%s' pipe\n", PIPE_NAME);
-#endif
-
-    char  buff[64];
-    char  buff2[64];
-    int   count;
-    double time0 = now_secs();
-    size_t total = 0;
-
-    for (count = 0; count < maxCount; count++) {
-        /* First, send a small message */
-        int  len = snprintf(buff, sizeof(buff), "Hello World %d\n", count);
-        printf("%4d: Sending %d bytes\n", count, len);
-        int ret = pipe_send(pipe, buff, len);
-        if (ret < 0) {
-            fprintf(stderr,"Sending %d bytes failed: %s\n", len, strerror(errno));
-            return 1;
-        }
-
-        total += len;
-
-        /* The server is supposed to send the message back */
-        ret = pipe_recv(pipe, buff2, len);
-        if (ret < 0) {
-            fprintf(stderr, "Receiving failed (ret=%d): %s\n", ret, strerror(errno));
-            return 3;
-        }
-        printf("%4d: Received %d bytes\n", count, ret);
-        /* Check the message's content */
-        if (ret != len) {
-            fprintf(stderr, "Message size mismatch sent=%d received=%d\n", len, ret);
-            return 5;
-        }
-        if (memcmp(buff, buff2, len) != 0) {
-            fprintf(stderr, "Message content mismatch!\n");
-            return 6;
-        }
-    }
-
-    double time1 = now_secs();
-
-    printf("Closing pipe\n");
-    pipe_close(pipe);
-
-    printf("Bandwidth: %g MB/s, %g bytes in %g seconds.\n",
-           total*1.0 / (1024.*1024.*(time1-time0)), 1.0*total, time1-time0);
-
-    return 0;
-}
diff --git a/libqemu/test_guest_2.c b/libqemu/test_guest_2.c
deleted file mode 100644
index c834098..0000000
--- a/libqemu/test_guest_2.c
+++ /dev/null
@@ -1,240 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/* This program benchmarks a QEMUD pipe to exchange data with a test
- * server.
- *
- * See test_host_1.c for the corresponding server code, which simply
- * sends back anything it receives from the client.
- */
-#include <stddef.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <string.h>
-#include "test_util.h"
-
-#define  PIPE_NAME  "pingpong"
-
-char* progname;
-
-static void usage(int code)
-{
-    printf("Usage: %s [options]\n\n", progname);
-    printf(
-      "Valid options are:\n\n"
-      "  -? -h --help  Print this message\n"
-      "  -pipe <name>  Use pipe name (default: " PIPE_NAME ")\n"
-      "  -tcp <port>   Use local tcp port\n"
-      "  -size <size>  Specify packet size\n"
-      "\n"
-    );
-    exit(code);
-}
-
-int main(int argc, char** argv)
-{
-    Pipe        pipe[1];
-    const char* tcpPort = NULL;
-    int         localPort = 0;
-    const char* pipeName = NULL;
-    const char* packetSize = NULL;
-    int         port = 8012;
-    int         maxCount   = 1000;
-    int         bufferSize = 16384;
-    uint8_t*    buffer;
-    uint8_t*    buffer2;
-    int         nn, count;
-    double      time0, time1;
-
-    /* Extract program name */
-    {
-        char* p = strrchr(argv[0], '/');
-        if (p == NULL)
-            progname = argv[0];
-        else
-            progname = p+1;
-    }
-
-    /* Parse options */
-    while (argc > 1 && argv[1][0] == '-') {
-        char* arg = argv[1];
-        if (!strcmp(arg, "-?") || !strcmp(arg, "-h") || !strcmp(arg, "--help")) {
-            usage(0);
-        } else if (!strcmp(arg, "-pipe")) {
-            if (argc < 3) {
-                fprintf(stderr, "-pipe option needs an argument! See --help for details.\n");
-                exit(1);
-            }
-            argc--;
-            argv++;
-            pipeName = argv[1];
-        } else if (!strcmp(arg, "-tcp")) {
-            if (argc < 3) {
-                fprintf(stderr, "-tcp option needs an argument! See --help for details.\n");
-                exit(1);
-            }
-            argc--;
-            argv++;
-            tcpPort = argv[1];
-        } else if (!strcmp(arg, "-size")) {
-            if (argc < 3) {
-                fprintf(stderr, "-tcp option needs an argument! See --help for details.\n");
-                exit(1);
-            }
-            argc--;
-            argv++;
-            packetSize = argv[1];
-        } else {
-            fprintf(stderr, "UNKNOWN OPTION: %s\n\n", arg);
-            usage(1);
-        }
-        argc--;
-        argv++;
-    }
-
-    /* Check arguments */
-    if (tcpPort && pipeName) {
-        fprintf(stderr, "You can't use both -pipe and -tcp at the same time\n");
-        exit(2);
-    }
-
-    if (tcpPort != NULL) {
-        localPort = atoi(tcpPort);
-        if (localPort <= 0 || localPort > 65535) {
-            fprintf(stderr, "Invalid port number: %s\n", tcpPort);
-            exit(2);
-        }
-    } else if (pipeName == NULL) {
-        /* Use default pipe name */
-        pipeName = PIPE_NAME;
-    }
-
-    if (packetSize != NULL) {
-        int  size = atoi(packetSize);
-        if (size <= 0) {
-            fprintf(stderr, "Invalid byte size: %s\n", packetSize);
-            exit(3);
-        }
-        bufferSize = size;
-    }
-
-    /* Open the pipe */
-    if (tcpPort != NULL) {
-        if (pipe_openSocket(pipe, localPort) < 0) {
-            fprintf(stderr, "Could not open tcp socket!\n");
-            return 1;
-        }
-        printf("Connected to tcp:localhost:%d\n", port);
-    }
-    else {
-        if (pipe_openQemuPipe(pipe, pipeName) < 0) {
-            fprintf(stderr, "Could not open '%s' pipe: %s\n", pipeName, strerror(errno));
-            return 1;
-        }
-        printf("Connected to '%s' pipe\n", pipeName);
-    }
-
-    /* Allocate buffers, setup their data */
-    buffer  = malloc(bufferSize);
-    buffer2 = malloc(bufferSize);
-
-    for (nn = 0; nn < bufferSize; nn++) {
-        buffer[nn] = (uint8_t)nn;
-    }
-
-    /* Do the work! */
-    time0 = now_secs();
-
-    for (count = 0; count < maxCount; count++) {
-        int ret = pipe_send(pipe, buffer, bufferSize);
-        int pos, len;
-
-        if (ret < 0) {
-            fprintf(stderr,"%d: Sending %d bytes failed: %s\n", count, bufferSize, strerror(errno));
-            return 1;
-        }
-
-#if 1
-        /* The server is supposed to send the message back */
-        pos = 0;
-        len = bufferSize;
-        while (len > 0) {
-            ret = pipe_recv(pipe, buffer2 + pos, len);
-            if (ret < 0) {
-                fprintf(stderr, "Receiving failed (ret=%d): %s\n", ret, strerror(errno));
-                return 3;
-            }
-            if (ret == 0) {
-                fprintf(stderr, "Disconnection while receiving!\n");
-                return 4;
-            }
-            pos += ret;
-            len -= ret;
-        }
-
-        if (memcmp(buffer, buffer2, bufferSize) != 0) {
-            fprintf(stderr, "Message content mismatch!\n");
-            const int maxAvail = 16;
-            const int maxLines = 12;
-            int numLines = 0;
-            for (nn = 0; nn < bufferSize; ) {
-                int avail = bufferSize - nn;
-                int mm;
-                if (avail > maxAvail)
-                    avail = maxAvail;
-
-                if (memcmp(buffer+nn, buffer2+nn, avail) != 0) {
-                    if (++numLines >= maxLines) {
-                        printf(".... to be continued ...\n");
-                        break;
-                    }
-                    printf("%04x:", nn);
-
-                    for (mm = 0; mm < avail; mm++)
-                        printf(" %02x", buffer[nn+mm]);
-                    for ( ; mm < maxAvail; mm++ )
-                        printf("   ");
-
-                    printf( " -- " );
-
-                    for (mm = 0; mm < avail; mm++)
-                        printf(" %02x", buffer2[nn+mm]);
-
-                    printf ("\n");
-                }
-                nn += avail;
-            }
-            return 6;
-        }
-
-#endif
-
-        if (count > 0 && (count % 200) == 0) {
-            printf("... %d\n", count);
-        }
-    }
-
-    time1 = now_secs();
-
-    printf("Closing pipe\n");
-    pipe_close(pipe);
-
-    printf("Total time: %g seconds\n", time1 - time0);
-    printf("Total bytes: %g bytes\n", 1.0*maxCount*bufferSize);
-    printf("Bandwidth: %g MB/s\n", (maxCount*bufferSize/(1024.0*1024.0))/(time1 - time0) );
-    return 0;
-}
diff --git a/libqemu/test_host_1.c b/libqemu/test_host_1.c
deleted file mode 100644
index 8e32bf2..0000000
--- a/libqemu/test_host_1.c
+++ /dev/null
@@ -1,244 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/* This program is used to test the QEMUD fast pipes.
- * See external/qemu/docs/ANDROID-QEMUD-PIPES.TXT for details.
- *
- * The program acts as a simple TCP server that accepts data and sends
- * them back to the client as is.
- */
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <sys/un.h>
-#include <unistd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-
-/* Default port number */
-#define  DEFAULT_PORT  8012
-#define  DEFAULT_PATH  "/tmp/libqemu-socket"
-
-/* Try to execute x, looping around EINTR errors. */
-#undef TEMP_FAILURE_RETRY
-#define TEMP_FAILURE_RETRY(exp) ({         \
-    typeof (exp) _rc;                      \
-    do {                                   \
-        _rc = (exp);                       \
-    } while (_rc == -1 && errno == EINTR); \
-    _rc; })
-
-#define TFR TEMP_FAILURE_RETRY
-
-/* Close a socket, preserving the value of errno */
-static void
-socket_close(int  sock)
-{
-    int  old_errno = errno;
-    close(sock);
-    errno = old_errno;
-}
-
-/* Create a server socket bound to a loopback port */
-static int
-socket_loopback_server( int port, int type )
-{
-    struct sockaddr_in  addr;
-
-    int  sock = socket(AF_INET, type, 0);
-    if (sock < 0) {
-        return -1;
-    }
-
-    memset(&addr, 0, sizeof(addr));
-    addr.sin_family      = AF_INET;
-    addr.sin_port        = htons(port);
-    addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
-
-    int n = 1;
-    setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &n, sizeof(n));
-
-    if (TFR(bind(sock, (struct sockaddr*)&addr, sizeof(addr))) < 0) {
-        socket_close(sock);
-        return -1;
-    }
-
-    if (type == SOCK_STREAM) {
-        if (TFR(listen(sock, 4)) < 0) {
-            socket_close(sock);
-            return -1;
-        }
-    }
-
-    return sock;
-}
-
-static int
-socket_unix_server( const char* path, int type )
-{
-    struct sockaddr_un  addr;
-
-    int  sock = socket(AF_UNIX, type, 0);
-    if (sock < 0) {
-        return -1;
-    }
-
-    memset(&addr, 0, sizeof(addr));
-    addr.sun_family = AF_UNIX;
-    snprintf(addr.sun_path, sizeof(addr.sun_path), "%s", path);
-
-    unlink(addr.sun_path);
-
-    printf("Unix path: '%s'\n", addr.sun_path);
-
-    int n = 1;
-    setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &n, sizeof(n));
-
-    if (TFR(bind(sock, (struct sockaddr*)&addr, sizeof(addr))) < 0) {
-        socket_close(sock);
-        return -1;
-    }
-
-    if (type == SOCK_STREAM) {
-        if (TFR(listen(sock, 4)) < 0) {
-            socket_close(sock);
-            return -1;
-        }
-    }
-
-    return sock;
-}
-
-char* progname;
-
-static void usage(int code)
-{
-    printf("Usage: %s [options]\n\n", progname);
-    printf(
-      "Valid options are:\n\n"
-      "  -? -h --help  Print this message\n"
-      "  -unix <path>  Use unix server socket\n"
-      "  -tcp <port>   Use local tcp port (default %d)\n"
-      "\n", DEFAULT_PORT
-    );
-    exit(code);
-}
-
-/* Main program */
-int main(int argc, char** argv)
-{
-    int sock, client;
-    int port = DEFAULT_PORT;
-    const char* path = NULL;
-    const char* tcpPort = NULL;
-
-    /* Extract program name */
-    {
-        char* p = strrchr(argv[0], '/');
-        if (p == NULL)
-            progname = argv[0];
-        else
-            progname = p+1;
-    }
-
-    /* Parse options */
-    while (argc > 1 && argv[1][0] == '-') {
-        char* arg = argv[1];
-        if (!strcmp(arg, "-?") || !strcmp(arg, "-h") || !strcmp(arg, "--help")) {
-            usage(0);
-        } else if (!strcmp(arg, "-unix")) {
-            if (argc < 3) {
-                fprintf(stderr, "-unix option needs an argument! See --help for details.\n");
-                exit(1);
-            }
-            argc--;
-            argv++;
-            path = argv[1];
-        } else if (!strcmp(arg, "-tcp")) {
-            if (argc < 3) {
-                fprintf(stderr, "-tcp option needs an argument! See --help for details.\n");
-                exit(1);
-            }
-            argc--;
-            argv++;
-            tcpPort = argv[1];
-        } else {
-            fprintf(stderr, "UNKNOWN OPTION: %s\n\n", arg);
-            usage(1);
-        }
-        argc--;
-        argv++;
-    }
-
-    if (path != NULL) {
-        printf("Starting pipe test server on unix path: %s\n", path);
-        sock = socket_unix_server( path, SOCK_STREAM );
-    } else {
-        printf("Starting pipe test server on local port %d\n", port);
-        sock = socket_loopback_server( port, SOCK_STREAM );
-    }
-    if (sock < 0) {
-        fprintf(stderr, "Could not start server: %s\n", strerror(errno));
-        return 1;
-    }
-    printf("Server ready!\n");
-
-RESTART:
-    client = TFR(accept(sock, NULL, NULL));
-    if (client < 0) {
-        fprintf(stderr, "Server error: %s\n", strerror(errno));
-        return 2;
-    }
-    printf("Client connected!\n");
-
-    /* Now, accept any incoming data, and send it back */
-    for (;;) {
-        char  buff[32768], *p;
-        int   ret, count;
-
-        ret = TFR(read(client, buff, sizeof(buff)));
-        if (ret < 0) {
-            fprintf(stderr, "Client read error: %s\n", strerror(errno));
-            socket_close(client);
-            return 3;
-        }
-        if (ret == 0) {
-            break;
-        }
-        count = ret;
-        p     = buff;
-        //printf("   received: %d bytes\n", count);
-
-        while (count > 0) {
-            ret = TFR(write(client, p, count));
-            if (ret < 0) {
-                fprintf(stderr, "Client write error: %s\n", strerror(errno));
-                socket_close(client);
-                return 4;
-            }
-            //printf("   sent: %d bytes\n", ret);
-
-            p     += ret;
-            count -= ret;
-        }
-    }
-    printf("Client closed connection\n");
-    socket_close(client);
-    goto RESTART;
-
-    return 0;
-}
diff --git a/libqemu/test_host_2.c b/libqemu/test_host_2.c
deleted file mode 100644
index 46a9e8d..0000000
--- a/libqemu/test_host_2.c
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/* This program is used to test the QEMUD fast pipes.
- * See external/qemu/docs/ANDROID-QEMUD-PIPES.TXT for details.
- *
- * The program acts as a simple TCP server that accepts any data and
- * discards it immediately.
- */
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <unistd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-
-/* Default port number */
-#define  DEFAULT_PORT  8012
-
-/* Try to execute x, looping around EINTR errors. */
-#undef TEMP_FAILURE_RETRY
-#define TEMP_FAILURE_RETRY(exp) ({         \
-    typeof (exp) _rc;                      \
-    do {                                   \
-        _rc = (exp);                       \
-    } while (_rc == -1 && errno == EINTR); \
-    _rc; })
-
-#define TFR TEMP_FAILURE_RETRY
-
-/* Close a socket, preserving the value of errno */
-static void
-socket_close(int  sock)
-{
-    int  old_errno = errno;
-    close(sock);
-    errno = old_errno;
-}
-
-/* Create a server socket bound to a loopback port */
-static int
-socket_loopback_server( int port, int type )
-{
-    struct sockaddr_in  addr;
-
-    int  sock = socket(AF_INET, type, 0);
-    if (sock < 0) {
-        return -1;
-    }
-
-    memset(&addr, 0, sizeof(addr));
-    addr.sin_family      = AF_INET;
-    addr.sin_port        = htons(port);
-    addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
-
-    int n = 1;
-    setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &n, sizeof(n));
-
-    if (TFR(bind(sock, (struct sockaddr*)&addr, sizeof(addr))) < 0) {
-        socket_close(sock);
-        return -1;
-    }
-
-    if (type == SOCK_STREAM) {
-        if (TFR(listen(sock, 4)) < 0) {
-            socket_close(sock);
-            return -1;
-        }
-    }
-
-    return sock;
-}
-
-/* Main program */
-int main(void)
-{
-    int sock, client;
-    int port = DEFAULT_PORT;
-
-    printf("Starting pipe test server on local port %d\n", port);
-    sock = socket_loopback_server( port, SOCK_STREAM );
-    if (sock < 0) {
-        fprintf(stderr, "Could not start server: %s\n", strerror(errno));
-        return 1;
-    }
-
-RESTART:
-    client = TFR(accept(sock, NULL, NULL));
-    if (client < 0) {
-        fprintf(stderr, "Server error: %s\n", strerror(errno));
-        return 2;
-    }
-    printf("Client connected!\n");
-
-    /* Now, accept any incoming data, and send it back */
-    for (;;) {
-        char  buff[8192], *p;
-        int   ret, count;
-
-        ret = TFR(read(client, buff, sizeof(buff)));
-        if (ret < 0) {
-            fprintf(stderr, "Client read error: %s\n", strerror(errno));
-            socket_close(client);
-            return 3;
-        }
-        if (ret == 0) {
-            break;
-        }
-    }
-    printf("Client closed connection\n");
-    socket_close(client);
-    goto RESTART;
-
-    return 0;
-}
diff --git a/libqemu/test_util.c b/libqemu/test_util.c
deleted file mode 100644
index 1696796..0000000
--- a/libqemu/test_util.c
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <errno.h>
-#include <string.h>
-#include <unistd.h>
-#include <stddef.h>
-#include <stdio.h>
-#include "test_util.h"
-
-#ifdef __linux__
-#include <time.h>
-double now_secs(void)
-{
-    struct timespec  tm;
-    clock_gettime(CLOCK_MONOTONIC, &tm);
-    return (double)tm.tv_sec + (double)tm.tv_nsec/1e9;
-}
-#else
-#include <sys/time.h>
-double now_secs(void)
-{
-    struct timeval tv;
-    gettimeofday(&tv, NULL);
-    return tv.sec + (double)tv.usec/1e6;
-}
-#endif
-
-int
-pipe_openSocket( Pipe*  pipe, int port )
-{
-    static int           fd;
-    struct sockaddr_in  addr;
-
-    pipe->socket = -1;
-
-    fd = socket( AF_INET, SOCK_STREAM, 0 );
-    if (fd < 0) {
-        fprintf(stderr, "%s: Can't create socket!!\n", __FUNCTION__);
-        return -1;
-    }
-
-    memset(&addr, 0, sizeof(addr));
-    addr.sin_family      = AF_INET;
-    addr.sin_port        = htons(port);
-    addr.sin_addr.s_addr = htonl(0x0a000202);
-
-    if ( connect(fd, (struct sockaddr*)&addr, sizeof(addr)) < 0 ) {
-        fprintf(stderr, "%s: Can't connect to tcp:local:%d: %s\n",
-                __FUNCTION__, port, strerror(errno));
-        close(fd);
-        return -1;
-    }
-
-    pipe->socket = fd;
-    return 0;
-}
-
-int
-pipe_openQemuPipe( Pipe*  pipe, const char* pipename )
-{
-    pipe->socket = qemu_pipe_open(pipename);
-    if (pipe->socket < 0) {
-        fprintf(stderr, "%s: Could not open '%s' pipe: %s\n", __FUNCTION__, pipename, strerror(errno));
-        return -1;
-    }
-    return 0;
-}
-
-int
-pipe_send( Pipe*  pipe, const void* buff, size_t  bufflen )
-{
-    int ret;
-    const uint8_t* ptr = buff;
-    while (bufflen > 0) {
-        ret = write(pipe->socket, ptr, bufflen);
-        if (ret < 0) {
-            if (errno == EINTR)
-                continue;
-            fprintf(stderr, "%s: error: %s\n", __FUNCTION__, strerror(errno));
-            return -1;
-        }
-        if (ret == 0) {
-            fprintf(stderr, "%s: disconnection!\n", __FUNCTION__);
-            return -1;
-        }
-        ptr     += ret;
-        bufflen -= ret;
-    }
-    return 0;
-}
-
-int
-pipe_recv( Pipe*  pipe, void* buff, size_t bufflen )
-{
-    int  ret;
-
-    for (;;) {
-        ret = read(pipe->socket, buff, bufflen);
-        if (ret < 0) {
-            if (errno == EINTR)
-                continue;
-            fprintf(stderr, "%s: error: %s\n", __FUNCTION__, strerror(errno));
-            return -1;
-        }
-        if (ret == 0) {
-            fprintf(stderr, "%s: disconnection!\n", __FUNCTION__);
-            return -1;
-        }
-        break;
-    }
-    return ret;
-}
-
-void
-pipe_close( Pipe*  pipe )
-{
-    if (pipe->socket >= 0) {
-        close(pipe->socket);
-        pipe->socket = -1;
-    }
-}
diff --git a/libqemu/test_util.h b/libqemu/test_util.h
deleted file mode 100644
index 60caf88..0000000
--- a/libqemu/test_util.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef TEST_UTIL_H
-#define TEST_UTIL_H
-
-#include <stddef.h>
-#include "qemu_pipe.h"
-
-
-double now_secs(void);
-
-typedef struct {
-    int  socket;
-} Pipe;
-
-int  pipe_openSocket( Pipe*  pipe, int port );
-int  pipe_openQemuPipe( Pipe*  pipe, const char* pipename );
-int  pipe_send( Pipe*  pipe, const void* buff, size_t  bufflen );
-int  pipe_recv( Pipe*  pipe, void* buff, size_t bufflen );
-void pipe_close( Pipe*  pipe );
-
-#endif /* TEST_UTIL_H */
diff --git a/libqemu/tests.mk b/libqemu/tests.mk
deleted file mode 100644
index 45f2e19..0000000
--- a/libqemu/tests.mk
+++ /dev/null
@@ -1,30 +0,0 @@
-# Build libqemu tests, included from main Android.mk
-
-# The first test program is a simple TCP server that will send back
-# anything it receives from the client.
-#
-include $(CLEAR_VARS)
-LOCAL_MODULE := test-libqemu-1
-LOCAL_SRC_FILES := test_host_1.c
-LOCAL_MODULE_TAGS := tests
-include $(BUILD_HOST_EXECUTABLE)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := test-libqemu-2
-LOCAL_SRC_FILES := test_host_2.c
-LOCAL_MODULE_TAGS := tests
-include $(BUILD_HOST_EXECUTABLE)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := test-libqemu-1
-LOCAL_SRC_FILES := test_guest_1.c test_util.c
-LOCAL_MODULE_TAGS := tests
-LOCAL_STATIC_LIBRARIES := libcutils liblog
-include $(BUILD_EXECUTABLE)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := test-libqemu-2
-LOCAL_SRC_FILES := test_guest_2.c test_util.c
-LOCAL_MODULE_TAGS := tests
-LOCAL_STATIC_LIBRARIES := libcutils liblog
-include $(BUILD_EXECUTABLE)
diff --git a/lights/Android.mk b/lights/Android.mk
index 41ab150..ec56f92 100644
--- a/lights/Android.mk
+++ b/lights/Android.mk
@@ -21,7 +21,9 @@
 LOCAL_MODULE_RELATIVE_PATH := hw
 LOCAL_SHARED_LIBRARIES := liblog libcutils
 LOCAL_C_INC := lights_qemu.c
-LOCAL_C_INCLUDES += $(LOCAL_PATH)/../include
+LOCAL_C_INCLUDES += \
+	$(LOCAL_PATH)/../include \
+	$(LOCAL_PATH)/../../goldfish-opengl/shared/OpenglCodecCommon
 LOCAL_SRC_FILES := lights_qemu.c
 LOCAL_MODULE := lights.ranchu
 LOCAL_CFLAGS += -DLIGHT_BACKLIGHT
diff --git a/manifest-arm.xml b/manifest-arm.xml
deleted file mode 100644
index c9bcbaa..0000000
--- a/manifest-arm.xml
+++ /dev/null
@@ -1,194 +0,0 @@
-<manifest version="1.0" type="device" target-level="3">
-    <hal format="hidl">
-        <name>android.hardware.drm</name>
-        <transport>hwbinder</transport>
-        <version>1.0</version>
-        <interface>
-            <name>ICryptoFactory</name>
-            <instance>default</instance>
-        </interface>
-        <interface>
-            <name>IDrmFactory</name>
-            <instance>default</instance>
-        </interface>
-        <fqname>@1.1::ICryptoFactory/clearkey</fqname>
-        <fqname>@1.1::IDrmFactory/clearkey</fqname>
-        <fqname>@1.1::ICryptoFactory/widevine</fqname>
-        <fqname>@1.1::IDrmFactory/widevine</fqname>
-    </hal>
-    <hal format="hidl">
-        <name>android.hardware.audio.effect</name>
-        <transport>hwbinder</transport>
-        <version>4.0</version>
-        <interface>
-            <name>IEffectsFactory</name>
-            <instance>default</instance>
-        </interface>
-    </hal>
-    <hal format="hidl">
-        <name>android.hardware.biometrics.fingerprint</name>
-        <transport>hwbinder</transport>
-        <version>2.1</version>
-        <interface>
-            <name>IBiometricsFingerprint</name>
-            <instance>default</instance>
-        </interface>
-    </hal>
-    <hal format="hidl">
-        <name>android.hardware.configstore</name>
-        <transport>hwbinder</transport>
-        <version>1.0</version>
-        <interface>
-            <name>ISurfaceFlingerConfigs</name>
-            <instance>default</instance>
-        </interface>
-    </hal>
-    <hal format="hidl">
-        <name>android.hardware.audio</name>
-        <transport>hwbinder</transport>
-        <version>4.0</version>
-        <interface>
-            <name>IDevicesFactory</name>
-            <instance>default</instance>
-        </interface>
-    </hal>
-    <hal format="hidl">
-        <name>android.hardware.keymaster</name>
-        <transport>hwbinder</transport>
-        <version>4.0</version>
-        <interface>
-            <name>IKeymasterDevice</name>
-            <instance>default</instance>
-        </interface>
-    </hal>
-    <hal format="hidl">
-        <name>android.hardware.graphics.allocator</name>
-        <transport>hwbinder</transport>
-        <version>2.0</version>
-        <interface>
-            <name>IAllocator</name>
-            <instance>default</instance>
-        </interface>
-    </hal>
-    <hal format="hidl">
-        <name>android.hardware.graphics.mapper</name>
-        <transport arch="32+64">passthrough</transport>
-        <version>2.0</version>
-        <interface>
-            <name>IMapper</name>
-            <instance>default</instance>
-        </interface>
-    </hal>
-    <hal format="hidl">
-        <name>android.hardware.graphics.composer</name>
-        <transport>hwbinder</transport>
-        <version>2.3</version>
-        <interface>
-            <name>IComposer</name>
-            <instance>default</instance>
-        </interface>
-    </hal>
-    <hal format="hidl">
-        <name>android.hardware.power</name>
-        <transport>hwbinder</transport>
-        <version>1.1</version>
-        <interface>
-            <name>IPower</name>
-            <instance>default</instance>
-        </interface>
-    </hal>
-    <hal format="hidl">
-        <name>android.hardware.broadcastradio</name>
-        <transport>hwbinder</transport>
-        <version>1.0</version>
-        <interface>
-            <name>IBroadcastRadioFactory</name>
-            <instance>default</instance>
-        </interface>
-    </hal>
-    <hal format="hidl">
-        <name>android.hardware.camera.provider</name>
-        <transport>hwbinder</transport>
-        <version>2.4</version>
-        <interface>
-            <name>ICameraProvider</name>
-            <instance>legacy/0</instance>
-        </interface>
-    </hal>
-    <hal format="hidl">
-        <name>android.hardware.sensors</name>
-        <transport>hwbinder</transport>
-        <version>1.0</version>
-        <interface>
-            <name>ISensors</name>
-            <instance>default</instance>
-        </interface>
-    </hal>
-    <hal format="hidl">
-        <name>android.hardware.gnss</name>
-        <transport>hwbinder</transport>
-        <version>1.0</version>
-        <interface>
-            <name>IGnss</name>
-            <instance>default</instance>
-        </interface>
-    </hal>
-    <hal format="hidl">
-        <name>android.hardware.media.omx</name>
-        <transport>hwbinder</transport>
-        <version>1.0</version>
-        <interface>
-            <name>IOmx</name>
-            <instance>default</instance>
-        </interface>
-        <interface>
-            <name>IOmxStore</name>
-            <instance>default</instance>
-        </interface>
-    </hal>
-    <hal format="hidl">
-        <name>android.hardware.radio</name>
-        <transport>hwbinder</transport>
-        <version>1.0</version>
-        <interface>
-            <name>IRadio</name>
-            <instance>slot1</instance>
-        </interface>
-    </hal>
-    <hal format="hidl">
-        <name>android.hardware.wifi</name>
-        <transport>hwbinder</transport>
-        <version>1.0</version>
-        <interface>
-            <name>IWifi</name>
-            <instance>default</instance>
-        </interface>
-    </hal>
-    <hal format="hidl">
-        <name>android.hardware.wifi.hostapd</name>
-        <transport>hwbinder</transport>
-        <version>1.0</version>
-        <interface>
-            <name>IHostapd</name>
-            <instance>default</instance>
-        </interface>
-    </hal>
-    <hal format="hidl">
-        <name>android.hardware.wifi.supplicant</name>
-        <transport>hwbinder</transport>
-        <version>1.0</version>
-        <interface>
-            <name>ISupplicant</name>
-            <instance>default</instance>
-        </interface>
-    </hal>
-    <hal format="hidl">
-        <name>android.hardware.health</name>
-        <transport>hwbinder</transport>
-        <version>2.0</version>
-        <interface>
-            <name>IHealth</name>
-            <instance>default</instance>
-        </interface>
-    </hal>
-</manifest>
diff --git a/manifest.camera.xml b/manifest.camera.xml
new file mode 100644
index 0000000..908c05c
--- /dev/null
+++ b/manifest.camera.xml
@@ -0,0 +1,11 @@
+<manifest version="1.0" type="device" target-level="3">
+    <hal format="hidl">
+        <name>android.hardware.camera.provider</name>
+        <transport>hwbinder</transport>
+        <version>2.4</version>
+        <interface>
+            <name>ICameraProvider</name>
+            <instance>legacy/0</instance>
+        </interface>
+    </hal>
+</manifest>
diff --git a/manifest.gnss.xml b/manifest.gnss.xml
new file mode 100644
index 0000000..69a178f
--- /dev/null
+++ b/manifest.gnss.xml
@@ -0,0 +1,11 @@
+<manifest version="1.0" type="device" target-level="3">
+    <hal format="hidl">
+        <name>android.hardware.gnss</name>
+        <transport>hwbinder</transport>
+        <version>1.0</version>
+        <interface>
+            <name>IGnss</name>
+            <instance>default</instance>
+        </interface>
+    </hal>
+</manifest>
diff --git a/manifest.sensors.xml b/manifest.sensors.xml
new file mode 100644
index 0000000..1c0a50b
--- /dev/null
+++ b/manifest.sensors.xml
@@ -0,0 +1,11 @@
+<manifest version="1.0" type="device" target-level="3">
+    <hal format="hidl">
+        <name>android.hardware.sensors</name>
+        <transport>hwbinder</transport>
+        <version>1.0</version>
+        <interface>
+            <name>ISensors</name>
+            <instance>default</instance>
+        </interface>
+    </hal>
+</manifest>
diff --git a/manifest.xml b/manifest.xml
index 5be1a35..7f02c45 100644
--- a/manifest.xml
+++ b/manifest.xml
@@ -19,13 +19,22 @@
     <hal format="hidl">
         <name>android.hardware.audio.effect</name>
         <transport>hwbinder</transport>
-        <version>4.0</version>
+        <version>5.0</version>
         <interface>
             <name>IEffectsFactory</name>
             <instance>default</instance>
         </interface>
     </hal>
     <hal format="hidl">
+        <name>android.hardware.authsecret</name>
+        <transport>hwbinder</transport>
+        <version>1.0</version>
+        <interface>
+            <name>IAuthSecret</name>
+            <instance>default</instance>
+        </interface>
+    </hal>
+    <hal format="hidl">
         <name>android.hardware.biometrics.fingerprint</name>
         <transport>hwbinder</transport>
         <version>2.1</version>
@@ -46,7 +55,7 @@
     <hal format="hidl">
         <name>android.hardware.audio</name>
         <transport>hwbinder</transport>
-        <version>4.0</version>
+        <version>5.0</version>
         <interface>
             <name>IDevicesFactory</name>
             <instance>default</instance>
@@ -64,7 +73,7 @@
     <hal format="hidl">
         <name>android.hardware.graphics.allocator</name>
         <transport>hwbinder</transport>
-        <version>2.0</version>
+        <version>3.0</version>
         <interface>
             <name>IAllocator</name>
             <instance>default</instance>
@@ -73,7 +82,7 @@
     <hal format="hidl">
         <name>android.hardware.graphics.mapper</name>
         <transport arch="32+64">passthrough</transport>
-        <version>2.0</version>
+        <version>3.0</version>
         <interface>
             <name>IMapper</name>
             <instance>default</instance>
@@ -82,7 +91,7 @@
     <hal format="hidl">
         <name>android.hardware.graphics.composer</name>
         <transport>hwbinder</transport>
-        <version>2.3</version>
+        <version>2.1</version>
         <interface>
             <name>IComposer</name>
             <instance>default</instance>
@@ -107,33 +116,6 @@
         </interface>
     </hal>
     <hal format="hidl">
-        <name>android.hardware.camera.provider</name>
-        <transport>hwbinder</transport>
-        <version>2.4</version>
-        <interface>
-            <name>ICameraProvider</name>
-            <instance>legacy/0</instance>
-        </interface>
-    </hal>
-    <hal format="hidl">
-        <name>android.hardware.sensors</name>
-        <transport>hwbinder</transport>
-        <version>1.0</version>
-        <interface>
-            <name>ISensors</name>
-            <instance>default</instance>
-        </interface>
-    </hal>
-    <hal format="hidl">
-        <name>android.hardware.gnss</name>
-        <transport>hwbinder</transport>
-        <version>1.0</version>
-        <interface>
-            <name>IGnss</name>
-            <instance>default</instance>
-        </interface>
-    </hal>
-    <hal format="hidl">
         <name>android.hardware.media.omx</name>
         <transport>hwbinder</transport>
         <version>1.0</version>
diff --git a/network/netmgr/Android.bp b/network/netmgr/Android.bp
index 7530c91..09e90b7 100644
--- a/network/netmgr/Android.bp
+++ b/network/netmgr/Android.bp
@@ -40,6 +40,6 @@
         "libpcap",
     ],
     header_libs: [
-        "goldfish_headers",
+        "goldfish_pipe_headers",
     ],
 }
diff --git a/network/netmgr/commander.cpp b/network/netmgr/commander.cpp
index a2dc1aa..95e5b75 100644
--- a/network/netmgr/commander.cpp
+++ b/network/netmgr/commander.cpp
@@ -144,7 +144,7 @@
 }
 
 void Commander::openPipe() {
-    mPipeFd = qemu_pipe_open(kQemuPipeName);
+    mPipeFd = qemu_pipe_open_ns(NULL, kQemuPipeName, O_RDWR);
     if (mPipeFd == -1) {
         LOGE("Failed to open QEMU pipe '%s': %s",
              kQemuPipeName,
diff --git a/network/netmgr/wifi_forwarder.cpp b/network/netmgr/wifi_forwarder.cpp
index e6997d4..139d467 100644
--- a/network/netmgr/wifi_forwarder.cpp
+++ b/network/netmgr/wifi_forwarder.cpp
@@ -127,7 +127,7 @@
         return Result::error("WifiForwarder already initialized");
     }
 
-    mPipeFd = qemu_pipe_open(kQemuPipeName);
+    mPipeFd = qemu_pipe_open_ns(NULL, kQemuPipeName, O_RDWR);
     if (mPipeFd == -1) {
         // It's OK if this fails, the emulator might not have been started with
         // this feature enabled. If it's not enabled we'll try again later, in
@@ -255,12 +255,12 @@
 
     WifiForwardHeader forwardHeader(header->caplen, radioLen);
 
-    if (!WriteFully(mPipeFd, &forwardHeader, sizeof(forwardHeader))) {
+    if (qemu_pipe_write_fully(mPipeFd, &forwardHeader, sizeof(forwardHeader))) {
         LOGE("WifiForwarder failed to write to pipe: %s", strerror(errno));
         return;
     }
 
-    if (!WriteFully(mPipeFd, data, header->caplen)) {
+    if (qemu_pipe_write_fully(mPipeFd, data, header->caplen)) {
         LOGE("WifiForwarder failed to write to pipe: %s", strerror(errno));
         return;
     }
diff --git a/network/wifi_forwarder/Android.bp b/network/wifi_forwarder/Android.bp
index 6dbc9ca..fee0060 100644
--- a/network/wifi_forwarder/Android.bp
+++ b/network/wifi_forwarder/Android.bp
@@ -41,6 +41,6 @@
         "libutilscallstack",
     ],
     header_libs: [
-        "goldfish_headers",
+        "goldfish_pipe_headers",
     ],
 }
diff --git a/network/wifi_forwarder/remote_connection.cpp b/network/wifi_forwarder/remote_connection.cpp
index 7255e05..852ef00 100644
--- a/network/wifi_forwarder/remote_connection.cpp
+++ b/network/wifi_forwarder/remote_connection.cpp
@@ -99,7 +99,7 @@
         return Result::error("RemoteConnetion already initialized");
     }
 
-    mPipeFd = qemu_pipe_open(kQemuPipeName);
+    mPipeFd = qemu_pipe_open_ns(NULL, kQemuPipeName, O_RDWR);
     if (mPipeFd == -1) {
         return Result::error("RemoteConnection failed to open pipe");
     }
@@ -300,12 +300,12 @@
         iov[current].iov_len -= written;
     }
 #else
-    if (!WriteFully(mPipeFd, &header, sizeof(header))) {
+    if (qemu_pipe_write_fully(mPipeFd, &header, sizeof(header))) {
         ALOGE("RemoteConnection failed to write to pipe: %s", strerror(errno));
         return false;
     }
 
-    if (!WriteFully(mPipeFd, frame->data(), frame->size())) {
+    if (qemu_pipe_write_fully(mPipeFd, frame->data(), frame->size())) {
         ALOGE("RemoteConnection failed to write to pipe: %s", strerror(errno));
         return false;
     }
@@ -327,7 +327,7 @@
                              info.rates().size(),
                              info.rates().data());
 
-    if (!WriteFully(mPipeFd, &header, sizeof(header))) {
+    if (qemu_pipe_write_fully(mPipeFd, &header, sizeof(header))) {
         ALOGE("RemoteConnection failed to write to pipe: %s", strerror(errno));
         return false;
     }
diff --git a/power/Android.mk b/power/Android.mk
index 27f325c..4a0b4d9 100644
--- a/power/Android.mk
+++ b/power/Android.mk
@@ -31,6 +31,7 @@
     libhidlbase \
     liblog \
     libutils \
+    android.hardware.power@1.0 \
     android.hardware.power@1.1 \
 
 include $(BUILD_EXECUTABLE)
diff --git a/qemu-props/Android.mk b/qemu-props/Android.mk
index b1b14db..e6134ab 100644
--- a/qemu-props/Android.mk
+++ b/qemu-props/Android.mk
@@ -24,7 +24,9 @@
 include $(CLEAR_VARS)
 LOCAL_VENDOR_MODULE    := true
 LOCAL_MODULE    := qemu-props
-LOCAL_C_INCLUDES += $(LOCAL_PATH)/../include
+LOCAL_C_INCLUDES += \
+	$(LOCAL_PATH)/../include \
+	$(LOCAL_PATH)/../../goldfish-opengl/shared/OpenglCodecCommon
 LOCAL_SRC_FILES := qemu-props.c
 LOCAL_SHARED_LIBRARIES := libcutils liblog
 include $(BUILD_EXECUTABLE)
diff --git a/qemu-props/qemu-props.c b/qemu-props/qemu-props.c
index 71e5aac..85aa2b0 100644
--- a/qemu-props/qemu-props.c
+++ b/qemu-props/qemu-props.c
@@ -91,7 +91,7 @@
         char* q;
         char  temp[BUFF_SIZE];
         char  vendortemp[BUFF_SIZE];
-        int   len = qemud_channel_recv(qemud_fd, temp, sizeof temp - 1);
+        int   len = qemud_channel_recv(qemud_fd, temp, sizeof(temp) - 1);
 
         /* lone NUL-byte signals end of properties */
         if (len < 0 || len > BUFF_SIZE-1 || temp[0] == '\0')
@@ -172,7 +172,7 @@
 
 void sendMessage(const char* mesg) {
    if (s_QemuMiscPipe < 0) {
-        s_QemuMiscPipe = qemu_pipe_open(QEMU_MISC_PIPE);
+        s_QemuMiscPipe = qemu_pipe_open_ns(NULL, QEMU_MISC_PIPE, O_RDWR);
         if (s_QemuMiscPipe < 0) {
             ALOGE("failed to open %s", QEMU_MISC_PIPE);
             return;
@@ -181,10 +181,10 @@
     char set[64];
     snprintf(set, sizeof(set), "%s", mesg);
     int pipe_command_length = strlen(set)+1; //including trailing '\0'
-    WriteFully(s_QemuMiscPipe, &pipe_command_length, sizeof(pipe_command_length));
-    WriteFully(s_QemuMiscPipe, set, pipe_command_length);
-    ReadFully(s_QemuMiscPipe, &pipe_command_length, sizeof(pipe_command_length));
+    qemu_pipe_write_fully(s_QemuMiscPipe, &pipe_command_length, sizeof(pipe_command_length));
+    qemu_pipe_write_fully(s_QemuMiscPipe, set, pipe_command_length);
+    qemu_pipe_read_fully(s_QemuMiscPipe, &pipe_command_length, sizeof(pipe_command_length));
     if (pipe_command_length > (int)(sizeof(set)) || pipe_command_length <= 0)
         return;
-    ReadFully(s_QemuMiscPipe, set, pipe_command_length);
+    qemu_pipe_read_fully(s_QemuMiscPipe, set, pipe_command_length);
 }
diff --git a/ril/Android.mk b/ril/Android.mk
index a5423ce..ec3b5cd 100644
--- a/ril/Android.mk
+++ b/ril/Android.mk
@@ -16,13 +16,15 @@
 LOCAL_SHARED_LIBRARIES := \
     liblog libcutils libutils libril librilutils
 
-LOCAL_STATIC_LIBRARIES := libqemu_pipe libbase
+LOCAL_STATIC_LIBRARIES := libbase
 
 # for asprinf
 LOCAL_CFLAGS := -D_GNU_SOURCE
 LOCAL_CFLAGS += -Wall -Wextra -Wno-unused-variable -Wno-unused-function -Werror
 
-LOCAL_C_INCLUDES :=
+LOCAL_C_INCLUDES := \
+	$(LOCAL_PATH)/../include \
+	$(LOCAL_PATH)/../../goldfish-opengl/shared/OpenglCodecCommon
 
 ifeq ($(TARGET_DEVICE),sooner)
   LOCAL_CFLAGS += -DUSE_TI_COMMANDS
diff --git a/ril/reference-ril.c b/ril/reference-ril.c
index 8566231..030d410 100644
--- a/ril/reference-ril.c
+++ b/ril/reference-ril.c
@@ -15,6 +15,8 @@
 ** limitations under the License.
 */
 
+#define LOG_TAG "RIL"
+
 #include <telephony/ril_cdma_sms.h>
 #include <telephony/librilutils.h>
 #include <stdio.h>
@@ -37,7 +39,7 @@
 #include <cutils/properties.h>
 #include <cutils/sockets.h>
 #include <termios.h>
-#include <qemu_pipe.h>
+#include <qemud.h>
 #include <sys/wait.h>
 #include <stdbool.h>
 #include <net/if.h>
@@ -48,7 +50,7 @@
 #include "ipv6_monitor.h"
 #include "ril.h"
 
-#define LOG_TAG "RIL"
+#define EMULATOR_DUMMY_SIM_CHANNEL_NAME "A00000015144414300"
 #include <utils/Log.h>
 
 #define MAX(x, y) ({\
@@ -233,6 +235,8 @@
 
 static RIL_RadioState sState = RADIO_STATE_UNAVAILABLE;
 
+static int s_sim_update_started = 0;
+
 static pthread_mutex_t s_state_mutex = PTHREAD_MUTEX_INITIALIZER;
 static pthread_cond_t s_state_cond = PTHREAD_COND_INITIALIZER;
 
@@ -1626,6 +1630,11 @@
     int type, startfrom;
 
     RLOGD("requestRegistrationState");
+    if(s_sim_update_started == 0) {
+        RLOGD("too early, sim card is not done yet");
+        goto error;
+    }
+
     if (request == RIL_REQUEST_VOICE_REGISTRATION_STATE) {
         cmd = "AT+CREG?";
         prefix = "+CREG:";
@@ -1949,39 +1958,44 @@
 static void requestSimOpenChannel(void *data, size_t datalen, RIL_Token t)
 {
     ATResponse *p_response = NULL;
-    int32_t session_id;
+    int32_t session_id[3];
     int err;
     char cmd[32];
     char dummy;
     char *line;
 
+    const char *pdata = data ? data : EMULATOR_DUMMY_SIM_CHANNEL_NAME;
+
     // Max length is 16 bytes according to 3GPP spec 27.007 section 8.45
-    if (data == NULL || datalen == 0 || datalen > 16) {
-        ALOGE("Invalid data passed to requestSimOpenChannel");
+    if (pdata == NULL || datalen == 0 || datalen > 16) {
+        RLOGE("Invalid data passed to requestSimOpenChannel");
         RIL_onRequestComplete(t, RIL_E_GENERIC_FAILURE, NULL, 0);
         return;
     }
 
-    snprintf(cmd, sizeof(cmd), "AT+CCHO=%s", data);
+    snprintf(cmd, sizeof(cmd), "AT+CCHO=%s", pdata);
 
     err = at_send_command_numeric(cmd, &p_response);
     if (err < 0 || p_response == NULL || p_response->success == 0) {
-        ALOGE("Error %d opening logical channel: %d",
+        RLOGE("Error %d opening logical channel: %d",
               err, p_response ? p_response->success : 0);
         RIL_onRequestComplete(t, RIL_E_GENERIC_FAILURE, NULL, 0);
         at_response_free(p_response);
         return;
     }
 
+    memset(session_id, 0, sizeof(session_id));
+
     // Ensure integer only by scanning for an extra char but expect one result
     line = p_response->p_intermediates->line;
-    if (sscanf(line, "%" SCNd32 "%c", &session_id, &dummy) != 1) {
-        ALOGE("Invalid AT response, expected integer, was '%s'", line);
+    if (sscanf(line, "%" SCNd32 "%c", session_id, &dummy) != 1) {
+        RLOGE("Invalid AT response, expected integer, was '%s'", line);
         RIL_onRequestComplete(t, RIL_E_GENERIC_FAILURE, NULL, 0);
         return;
     }
 
-    RIL_onRequestComplete(t, RIL_E_SUCCESS, &session_id, sizeof(session_id));
+    session_id[1] = 0x90;
+    RIL_onRequestComplete(t, RIL_E_SUCCESS, session_id, sizeof(session_id));
     at_response_free(p_response);
 }
 
@@ -2029,9 +2043,11 @@
     char *line;
     size_t cmd_size;
     RIL_SIM_IO_Response sim_response;
+    memset(&sim_response, 0, sizeof(sim_response));
     RIL_SIM_APDU *apdu = (RIL_SIM_APDU *)data;
 
     if (apdu == NULL || datalen != sizeof(RIL_SIM_APDU)) {
+        RLOGE("Error input invalid %p %d %d", apdu, (int)datalen, (int)(sizeof(RIL_SIM_APDU)));
         RIL_onRequestComplete(t, RIL_E_GENERIC_FAILURE, NULL, 0);
         return;
     }
@@ -2044,7 +2060,7 @@
     err = at_send_command_singleline(cmd, "+CGLA", &p_response);
     free(cmd);
     if (err < 0 || p_response == NULL || p_response->success == 0) {
-        ALOGE("Error %d transmitting APDU: %d",
+        RLOGE("Error %d transmitting APDU: %d",
               err, p_response ? p_response->success : 0);
         RIL_onRequestComplete(t, RIL_E_GENERIC_FAILURE, NULL, 0);
         at_response_free(p_response);
@@ -2058,7 +2074,7 @@
         RIL_onRequestComplete(t, RIL_E_SUCCESS,
                               &sim_response, sizeof(sim_response));
     } else {
-        ALOGE("Error %d parsing SIM response line: %s", err, line);
+        RLOGE("Error %d parsing SIM response line: %s", err, line);
         RIL_onRequestComplete(t, RIL_E_GENERIC_FAILURE, NULL, 0);
     }
     at_response_free(p_response);
@@ -2252,6 +2268,10 @@
                     p_args->p1, p_args->p2, p_args->p3, p_args->data);
     }
 
+    if (p_args->command == 0xdc) {
+        s_sim_update_started = 1;
+    }
+
     err = at_send_command_singleline(cmd, "+CRSM:", &p_response);
 
     if (err < 0 || p_response->success == 0) {
@@ -2405,6 +2425,7 @@
    // TODO - hook this up with real query/info from radio.
 
    RIL_HardwareConfig hwCfg;
+   memset(&hwCfg, 0, sizeof(hwCfg));
 
    RIL_UNUSED_PARM(data);
    RIL_UNUSED_PARM(datalen);
@@ -2754,6 +2775,9 @@
         case RIL_REQUEST_SIM_TRANSMIT_APDU_CHANNEL:
             requestSimTransmitApduChannel(data, datalen, t);
             break;
+        case RIL_REQUEST_SIM_TRANSMIT_APDU_BASIC:
+            requestSimTransmitApduChannel(data, datalen, t);
+            break;
         case RIL_REQUEST_SETUP_DATA_CALL:
             requestSetupDataCall(data, datalen, t);
             break;
@@ -4075,7 +4099,7 @@
         fd = -1;
         while  (fd < 0) {
             if (isInEmulator()) {
-                fd = qemu_pipe_open("pipe:qemud:gsm");
+                fd = qemud_channel_open("gsm");
             } else if (s_port > 0) {
                 fd = socket_network_client("localhost", s_port, SOCK_STREAM);
             } else if (s_device_socket) {
diff --git a/sensors/Android.mk b/sensors/Android.mk
index ad319e9..d35f337 100644
--- a/sensors/Android.mk
+++ b/sensors/Android.mk
@@ -23,7 +23,9 @@
 LOCAL_MODULE_RELATIVE_PATH := hw
 LOCAL_SHARED_LIBRARIES := liblog libcutils
 LOCAL_HEADER_LIBRARIES := libhardware_headers
-LOCAL_C_INCLUDES += $(LOCAL_PATH)/../include
+LOCAL_C_INCLUDES += \
+	$(LOCAL_PATH)/../include \
+	$(LOCAL_PATH)/../../goldfish-opengl/shared/OpenglCodecCommon
 LOCAL_SRC_FILES := sensors_qemu.c
 LOCAL_MODULE := sensors.ranchu
 
diff --git a/sensors/sensors_qemu.c b/sensors/sensors_qemu.c
index eaf2bb8..5312260 100644
--- a/sensors/sensors_qemu.c
+++ b/sensors/sensors_qemu.c
@@ -110,21 +110,6 @@
     return "<UNKNOWN>";
 }
 
-static int
-_sensorIdFromName( const char*  name )
-{
-    int  nn;
-
-    if (name == NULL)
-        return -1;
-
-    for (nn = 0; nn < MAX_NUM_SENSORS; nn++)
-        if (!strcmp(name, _sensorIds[nn].name))
-            return _sensorIds[nn].id;
-
-    return -1;
-}
-
 /* return the current time in nanoseconds */
 static int64_t now_ns(void) {
     struct timespec  ts;
@@ -687,6 +672,8 @@
      int flags,
      int64_t sampling_period_ns,
      int64_t max_report_latency_ns) {
+    (void)flags;
+    (void)max_report_latency_ns;
     return sensor_device_set_delay(dev, sensor_handle, sampling_period_ns);
 }
 
diff --git a/sepolicy/common/bootanim.te b/sepolicy/common/bootanim.te
index bc84ee7..4d011e1 100644
--- a/sepolicy/common/bootanim.te
+++ b/sepolicy/common/bootanim.te
@@ -4,6 +4,7 @@
 dontaudit bootanim system_data_file:dir read;
 
 allow bootanim graphics_device:chr_file { read ioctl open };
+allow bootanim gpu_device:chr_file { read ioctl open };
 
 typeattribute bootanim system_writes_vendor_properties_violators;
 set_prop(bootanim, qemu_prop)
diff --git a/sepolicy/common/bug_map b/sepolicy/common/bug_map
index 839b49e..049891e 100644
--- a/sepolicy/common/bug_map
+++ b/sepolicy/common/bug_map
@@ -15,3 +15,4 @@
 vendor_init exported2_default_prop property_service b/131601458
 init serial_device chr_file b/134145307
 gsid device file b/133324244
+gmscore_app varrun_file dir b/131598844
diff --git a/sepolicy/common/file_contexts b/sepolicy/common/file_contexts
index 240bc49..7209f56 100644
--- a/sepolicy/common/file_contexts
+++ b/sepolicy/common/file_contexts
@@ -15,6 +15,9 @@
 /dev/goldfish_sync           u:object_r:qemu_device:s0
 /dev/goldfish_address_space  u:object_r:qemu_device:s0
 /dev/qemu_.*                 u:object_r:qemu_device:s0
+/dev/dri/card0               u:object_r:gpu_device:s0
+/dev/dri/controlD64          u:object_r:gpu_device:s0
+/dev/dri/renderD128          u:object_r:gpu_device:s0
 /dev/ttyGF[0-9]*             u:object_r:serial_device:s0
 /dev/ttyS2                   u:object_r:console_device:s0
 /vendor/bin/init\.ranchu-core\.sh u:object_r:goldfish_setup_exec:s0
@@ -30,14 +33,15 @@
 /vendor/bin/netmgr           u:object_r:netmgr_exec:s0
 /vendor/bin/wifi_forwarder   u:object_r:wifi_forwarder_exec:s0
 
-/vendor/bin/hw/android\.hardware\.drm@1\.0-service\.widevine          u:object_r:hal_drm_widevine_exec:s0
-/vendor/bin/hw/android\.hardware\.drm@1\.2-service\.widevine          u:object_r:hal_drm_widevine_exec:s0
-/vendor/bin/hw/android\.hardware\.drm@1\.2-service\.clearkey          u:object_r:hal_drm_clearkey_exec:s0
+/vendor/bin/hw/android\.hardware\.drm@[0-9]+\.[0-9]+-service\.widevine          u:object_r:hal_drm_widevine_exec:s0
+/vendor/bin/hw/android\.hardware\.drm@[0-9]+\.[0-9]+-service\.clearkey          u:object_r:hal_drm_clearkey_exec:s0
 /vendor/bin/hw/android\.hardware\.gatekeeper@1\.0-service.software    u:object_r:hal_gatekeeper_default_exec:s0
 /vendor/bin/hw/android\.hardware\.keymaster@4\.0-strongbox-service u:object_r:hal_keymaster_default_exec:s0
-/vendor/bin/hw/android\.hardware\.health@2\.0-service.goldfish        u:object_r:hal_health_default_exec:s0
 /vendor/bin/hw/android\.hardware\.power@1\.1-service.ranchu           u:object_r:hal_power_default_exec:s0
 /vendor/bin/hw/android\.hardware\.thermal@2\.0-service.mock           u:object_r:hal_thermal_default_exec:s0
+/vendor/bin/hw/android\.hardware\.authsecret@1\.0-service  u:object_r:hal_authsecret_default_exec:s0
+/vendor/bin/hw/android\.hardware\.input\.classifier@1\.0-service.default  u:object_r:hal_input_classifier_default_exec:s0
+/vendor/bin/hw/android\.hardware\.power\.stats@1\.0-service\.mock  u:object_r:hal_power_stats_default_exec:s0
 
 /vendor/lib(64)?/hw/vulkan\.ranchu\.so   u:object_r:same_process_hal_file:s0
 /vendor/lib(64)?/hw/gralloc\.ranchu\.so   u:object_r:same_process_hal_file:s0
@@ -55,8 +59,8 @@
 /vendor/lib(64)?/libGLESv2_enc\.so       u:object_r:same_process_hal_file:s0
 /vendor/lib(64)?/libvulkan_enc\.so       u:object_r:same_process_hal_file:s0
 /vendor/lib(64)?/libandroidemu\.so       u:object_r:same_process_hal_file:s0
+/vendor/lib(64)?/libdrm.so  u:object_r:same_process_hal_file:s0
 
 # data
 /data/vendor/mediadrm(/.*)?            u:object_r:mediadrm_vendor_data_file:s0
 /data/vendor/var/run(/.*)?             u:object_r:varrun_file:s0
-
diff --git a/sepolicy/common/genfs_contexts b/sepolicy/common/genfs_contexts
index bc99f83..a169cac 100644
--- a/sepolicy/common/genfs_contexts
+++ b/sepolicy/common/genfs_contexts
@@ -30,5 +30,52 @@
 # /sys/class/power_supply
 genfscon sysfs /devices/platform/9020000.goldfish_battery/power_supply u:object_r:sysfs_batteryinfo:s0
 
+# symlinks from /sys/class/wakeup
+genfscon sysfs /devices/LNXSYSTM:00/LNXPWRBN:00/wakeup/wakeup                      u:object_r:sysfs_wakeup:s0
+genfscon sysfs /devices/LNXSYSTM:00/LNXSYBUS:00/GFSH0001:00/wakeup/wakeup          u:object_r:sysfs_wakeup:s0
+genfscon sysfs /devices/LNXSYSTM:00/LNXSYBUS:00/GFSH0003:00/wakeup/wakeup          u:object_r:sysfs_wakeup:s0
+genfscon sysfs /devices/LNXSYSTM:00/LNXSYBUS:00/GFSH0004:00/wakeup/wakeup          u:object_r:sysfs_wakeup:s0
+genfscon sysfs /devices/LNXSYSTM:00/LNXSYBUS:00/GFSH0006:00/wakeup/wakeup          u:object_r:sysfs_wakeup:s0
+genfscon sysfs /devices/LNXSYSTM:00/LNXSYBUS:00/GFSH0008:00/wakeup/wakeup          u:object_r:sysfs_wakeup:s0
+genfscon sysfs /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A03:00/device:00/wakeup/wakeup u:object_r:sysfs_wakeup:s0
+genfscon sysfs /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A03:00/device:01/wakeup/wakeup u:object_r:sysfs_wakeup:s0
+genfscon sysfs /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A03:00/device:02/wakeup/wakeup u:object_r:sysfs_wakeup:s0
+genfscon sysfs /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A03:00/device:03/wakeup/wakeup u:object_r:sysfs_wakeup:s0
+genfscon sysfs /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A03:00/device:04/wakeup/wakeup u:object_r:sysfs_wakeup:s0
+genfscon sysfs /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A03:00/device:05/wakeup/wakeup u:object_r:sysfs_wakeup:s0
+genfscon sysfs /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A03:00/device:06/wakeup/wakeup u:object_r:sysfs_wakeup:s0
+genfscon sysfs /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A03:00/device:07/wakeup/wakeup u:object_r:sysfs_wakeup:s0
+genfscon sysfs /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A03:00/device:08/wakeup/wakeup u:object_r:sysfs_wakeup:s0
+genfscon sysfs /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A03:00/device:09/wakeup/wakeup u:object_r:sysfs_wakeup:s0
+genfscon sysfs /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A03:00/device:0a/wakeup/wakeup u:object_r:sysfs_wakeup:s0
+genfscon sysfs /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A03:00/device:0b/wakeup/wakeup u:object_r:sysfs_wakeup:s0
+genfscon sysfs /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A03:00/device:0c/wakeup/wakeup u:object_r:sysfs_wakeup:s0
+genfscon sysfs /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A03:00/device:0d/wakeup/wakeup u:object_r:sysfs_wakeup:s0
+genfscon sysfs /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A03:00/device:0e/wakeup/wakeup u:object_r:sysfs_wakeup:s0
+genfscon sysfs /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A03:00/device:0f/wakeup/wakeup u:object_r:sysfs_wakeup:s0
+genfscon sysfs /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A03:00/device:10/wakeup/wakeup u:object_r:sysfs_wakeup:s0
+genfscon sysfs /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A03:00/device:11/wakeup/wakeup u:object_r:sysfs_wakeup:s0
+genfscon sysfs /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A03:00/device:12/wakeup/wakeup u:object_r:sysfs_wakeup:s0
+genfscon sysfs /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A03:00/device:13/wakeup/wakeup u:object_r:sysfs_wakeup:s0
+genfscon sysfs /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A03:00/device:14/wakeup/wakeup u:object_r:sysfs_wakeup:s0
+genfscon sysfs /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A03:00/device:15/wakeup/wakeup u:object_r:sysfs_wakeup:s0
+genfscon sysfs /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A03:00/device:16/wakeup/wakeup u:object_r:sysfs_wakeup:s0
+genfscon sysfs /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A03:00/device:17/wakeup/wakeup u:object_r:sysfs_wakeup:s0
+genfscon sysfs /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A03:00/device:18/wakeup/wakeup u:object_r:sysfs_wakeup:s0
+genfscon sysfs /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A03:00/device:19/wakeup/wakeup u:object_r:sysfs_wakeup:s0
+genfscon sysfs /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A03:00/device:1a/wakeup/wakeup u:object_r:sysfs_wakeup:s0
+genfscon sysfs /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A03:00/device:1b/wakeup/wakeup u:object_r:sysfs_wakeup:s0
+genfscon sysfs /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A03:00/device:1c/wakeup/wakeup u:object_r:sysfs_wakeup:s0
+genfscon sysfs /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A03:00/device:1d/wakeup/wakeup u:object_r:sysfs_wakeup:s0
+genfscon sysfs /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A03:00/device:1e/wakeup/wakeup u:object_r:sysfs_wakeup:s0
+genfscon sysfs /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A03:00/device:1f/wakeup/wakeup u:object_r:sysfs_wakeup:s0
+genfscon sysfs /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A03:00/device:20/wakeup/wakeup u:object_r:sysfs_wakeup:s0
+genfscon sysfs /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A03:00/wakeup/wakeup           u:object_r:sysfs_wakeup:s0
+genfscon sysfs /devices/platform/GFSH0001:00/power_supply/ac/wakeup                u:object_r:sysfs_wakeup:s0
+genfscon sysfs /devices/platform/GFSH0001:00/power_supply/battery/wakeup           u:object_r:sysfs_wakeup:s0
+genfscon sysfs /devices/pnp0/00:00/rtc/rtc0/wakeup                                 u:object_r:sysfs_wakeup:s0
+genfscon sysfs /devices/pnp0/00:00/wakeup/wakeup                                   u:object_r:sysfs_wakeup:s0
+genfscon sysfs /devices/virtual/wakeup/wakeup                                      u:object_r:sysfs_wakeup:s0
+
 # /proc/<pid>/ns
 genfscon nsfs / u:object_r:nsfs:s0
diff --git a/sepolicy/common/hal_camera_default.te b/sepolicy/common/hal_camera_default.te
index eb88c36..6e02020 100644
--- a/sepolicy/common/hal_camera_default.te
+++ b/sepolicy/common/hal_camera_default.te
@@ -1,3 +1,4 @@
 vndbinder_use(hal_camera_default);
 allow hal_camera_default hal_graphics_mapper_hwservice:hwservice_manager find;
+hal_client_domain(hal_camera_default, hal_graphics_allocator);
 hal_client_domain(hal_camera_default, hal_graphics_composer)
diff --git a/sepolicy/common/hal_drm_clearkey.te b/sepolicy/common/hal_drm_clearkey.te
index 5632c3b..7c3fc3c 100644
--- a/sepolicy/common/hal_drm_clearkey.te
+++ b/sepolicy/common/hal_drm_clearkey.te
@@ -7,3 +7,4 @@
 hal_server_domain(hal_drm_clearkey, hal_drm)
 
 vndbinder_use(hal_drm_clearkey);
+allow hal_drm_clearkey hal_allocator_server:fd use;
diff --git a/sepolicy/common/hal_graphics_allocator_default.te b/sepolicy/common/hal_graphics_allocator_default.te
index c57e452..527cabd 100644
--- a/sepolicy/common/hal_graphics_allocator_default.te
+++ b/sepolicy/common/hal_graphics_allocator_default.te
@@ -1,4 +1,6 @@
 allow hal_graphics_allocator_default graphics_device:dir search;
-allow hal_graphics_allocator_default graphics_device:chr_file { ioctl open read write };
+allow hal_graphics_allocator_default graphics_device:chr_file { ioctl open read write map rw_file_perms };
+allow hal_graphics_allocator_default gpu_device:dir search;
+allow hal_graphics_allocator_default gpu_device:chr_file { ioctl open read write map rw_file_perms };
 allow hal_graphics_allocator_default dumpstate:fd use;
 allow hal_graphics_allocator_default dumpstate:fifo_file write;
diff --git a/sepolicy/common/hal_graphics_composer_default.te b/sepolicy/common/hal_graphics_composer_default.te
index e9205cd..ba7ca64 100644
--- a/sepolicy/common/hal_graphics_composer_default.te
+++ b/sepolicy/common/hal_graphics_composer_default.te
@@ -1,3 +1,6 @@
 #============= hal_graphics_composer_default ==============
-allow hal_graphics_composer_default vndbinder_device:chr_file { ioctl open read write map };
+hal_client_domain(hal_graphics_composer_default, hal_graphics_allocator);
 
+allow hal_graphics_composer_default vndbinder_device:chr_file { ioctl open read write map };
+allow hal_graphics_composer_default graphics_device:chr_file { ioctl open read write map };
+allow hal_graphics_composer_default gpu_device:chr_file { ioctl open read write map };
diff --git a/sepolicy/common/healthd.te b/sepolicy/common/healthd.te
deleted file mode 100644
index 80db9b7..0000000
--- a/sepolicy/common/healthd.te
+++ /dev/null
@@ -1,4 +0,0 @@
-# Allow to read /sys/class/power_supply directory
-allow healthd sysfs:dir r_dir_perms;
-
-allow healthd self:capability2 wake_alarm;
diff --git a/sepolicy/common/netd.te b/sepolicy/common/netd.te
deleted file mode 100644
index 09a28b9..0000000
--- a/sepolicy/common/netd.te
+++ /dev/null
@@ -1,3 +0,0 @@
-dontaudit netd self:capability sys_module;
-#TODO: This can safely be ignored until b/62954877 is fixed
-dontaudit netd kernel:system module_request;
diff --git a/sepolicy/common/surfaceflinger.te b/sepolicy/common/surfaceflinger.te
index 2bba8a7..575ec1b 100644
--- a/sepolicy/common/surfaceflinger.te
+++ b/sepolicy/common/surfaceflinger.te
@@ -1,5 +1,6 @@
 allow surfaceflinger self:process execmem;
 allow surfaceflinger ashmem_device:chr_file execute;
+allow surfaceflinger gpu_device:chr_file { ioctl open read write map };
 
 typeattribute surfaceflinger system_writes_vendor_properties_violators;
 set_prop(surfaceflinger, qemu_prop)
diff --git a/sepolicy/x86/healthd.te b/sepolicy/x86/healthd.te
deleted file mode 100644
index 6efedfb..0000000
--- a/sepolicy/x86/healthd.te
+++ /dev/null
@@ -1,2 +0,0 @@
-allow healthd self:capability sys_nice;
-allow healthd self:global_capability2_class_set wake_alarm;
diff --git a/ueventd.ranchu.rc b/ueventd.ranchu.rc
index 38ad757..db42634 100644
--- a/ueventd.ranchu.rc
+++ b/ueventd.ranchu.rc
@@ -4,3 +4,6 @@
 /dev/ttyS*                0666   system     system
 /dev/goldfish_sync        0666   system     system
 /dev/goldfish_address_space 0666 system     system
+/dev/dri/card0 0660 system graphics
+/dev/dri/controlD64 0660 system graphics
+/dev/dri/renderD128 0666 system graphics
diff --git a/vendor.mk b/vendor.mk
index 712a505..b902b18 100644
--- a/vendor.mk
+++ b/vendor.mk
@@ -16,6 +16,7 @@
 #
 # This file is to configure vendor/data partitions of emulator-related products
 #
+$(call inherit-product-if-exists, frameworks/native/build/phone-xhdpi-2048-dalvik-heap.mk)
 
 ifeq ($(QEMU_DISABLE_AVB),true)
   ifeq ($(QEMU_USE_SYSTEM_EXT_PARTITIONS),true)
@@ -31,6 +32,7 @@
   endif
 endif
 
+PRODUCT_SYSTEM_EXT_PROPERTIES += ro.lockscreen.disable.default=1
 ifeq ($(QEMU_USE_SYSTEM_EXT_PARTITIONS),true)
 PRODUCT_COPY_FILES += \
     device/generic/goldfish/fstab.ranchu.initrd.ex:$(TARGET_COPY_OUT_RAMDISK)/fstab.ranchu \
@@ -40,46 +42,32 @@
 
 DISABLE_RILD_OEM_HOOK := true
 
+DEVICE_MANIFEST_FILE := device/generic/goldfish/manifest.xml
+
 # Device modules
 PRODUCT_PACKAGES += \
     vulkan.ranchu \
-    gralloc.goldfish \
-    gralloc.goldfish.default \
-    gralloc.ranchu \
-    libGLESv1_CM_emulation \
-    lib_renderControl_enc \
-    libEGL_emulation \
-    libGLESv2_enc \
     libandroidemu \
-    libvulkan_enc \
     libOpenglCodecCommon \
     libOpenglSystemCommon \
-    libGLESv2_emulation \
-    libGLESv1_enc \
     libEGL_swiftshader \
     libGLESv1_CM_swiftshader \
     libGLESv2_swiftshader \
     libgoldfish-ril \
     qemu-props \
-    camera.goldfish \
-    camera.goldfish.jpeg \
-    camera.ranchu \
-    camera.ranchu.jpeg \
     gps.goldfish \
     gps.ranchu \
     fingerprint.goldfish \
     audio.primary.goldfish \
     audio.primary.goldfish_legacy \
     power.goldfish \
+    stagefright \
     power.ranchu \
     fingerprint.ranchu \
-    sensors.ranchu \
-    android.hardware.graphics.composer@2.3-impl \
-    android.hardware.graphics.composer@2.3-service \
-    android.hardware.graphics.allocator@2.0-service \
-    android.hardware.graphics.allocator@2.0-impl \
-    android.hardware.graphics.mapper@2.0-impl \
-    hwcomposer.goldfish \
+    android.hardware.graphics.composer@2.1-impl \
+    android.hardware.graphics.composer@2.1-service \
+    android.hardware.graphics.allocator@3.0-service \
+    android.hardware.graphics.mapper@3.0-impl \
     hwcomposer.ranchu \
     toybox_vendor \
     android.hardware.audio@2.0-service \
@@ -91,17 +79,31 @@
     audio.r_submix.default \
     local_time.default \
     SdkSetup \
+    libstagefrighthw \
+    libstagefright_goldfish_vpxdec \
+    libstagefright_goldfish_avcdec \
     MultiDisplayProvider
 
+ifneq ($(BUILD_EMULATOR_OPENGL),false)
 PRODUCT_PACKAGES += \
-    android.hardware.audio@4.0-impl:32 \
-    android.hardware.audio.effect@4.0-impl:32 \
+    libGLESv1_CM_emulation \
+    lib_renderControl_enc \
+    libEGL_emulation \
+    libGLESv2_enc \
+    libvulkan_enc \
+    libGLESv2_emulation \
+    libGLESv1_enc
+endif
+
+PRODUCT_PACKAGES += \
+    android.hardware.audio@5.0-impl:32 \
+    android.hardware.audio.effect@5.0-impl:32 \
     android.hardware.broadcastradio@1.1-service \
     android.hardware.broadcastradio@1.0-impl \
     android.hardware.soundtrigger@2.0-impl
 
 PRODUCT_PACKAGES += \
-    android.hardware.health@2.0-service.goldfish
+    android.hardware.health@2.0-service
 
 PRODUCT_PACKAGES += \
     android.hardware.keymaster@4.0-impl \
@@ -114,12 +116,16 @@
 PRODUCT_PACKAGES += \
     android.hardware.gnss@1.0-service \
     android.hardware.gnss@1.0-impl
+DEVICE_MANIFEST_FILE += device/generic/goldfish/manifest.gnss.xml
 endif
 
-
+ifneq ($(EMULATOR_VENDOR_NO_SENSORS),true)
 PRODUCT_PACKAGES += \
     android.hardware.sensors@1.0-impl \
-    android.hardware.sensors@1.0-service
+    android.hardware.sensors@1.0-service \
+    sensors.ranchu
+DEVICE_MANIFEST_FILE += device/generic/goldfish/manifest.sensors.xml
+endif
 
 PRODUCT_PACKAGES += \
     android.hardware.drm@1.0-service \
@@ -135,10 +141,17 @@
 
 PRODUCT_PROPERTY_OVERRIDES += persist.sys.zram_enabled=1 \
 
+ifneq ($(EMULATOR_VENDOR_NO_CAMERA),true)
 PRODUCT_PACKAGES += \
     camera.device@1.0-impl \
     android.hardware.camera.provider@2.4-service \
     android.hardware.camera.provider@2.4-impl \
+    camera.goldfish \
+    camera.goldfish.jpeg \
+    camera.ranchu \
+    camera.ranchu.jpeg
+DEVICE_MANIFEST_FILE += device/generic/goldfish/manifest.camera.xml
+endif
 
 PRODUCT_PACKAGES += \
     android.hardware.gatekeeper@1.0-service.software
@@ -154,18 +167,34 @@
 	wifi_forwarder \
 	wpa_supplicant \
 
-PRODUCT_PACKAGES += android.hardware.thermal@2.0-service.mock
+# Thermal
+PRODUCT_PACKAGES += \
+	android.hardware.thermal@2.0-service.mock
 
-# Needed for /system/priv-app/SdkSetup/SdkSetup.apk to pass CTS android.permission2.cts.PrivappPermissionsTest.
-PRODUCT_COPY_FILES += \
-    device/generic/goldfish/data/etc/permissions/privapp-permissions-goldfish.xml:$(TARGET_COPY_OUT_SYSTEM)/etc/permissions/privapp-permissions-goldfish.xml
+# Atrace
+PRODUCT_PACKAGES += \
+	android.hardware.atrace@1.0-service
+
+# Vibrator
+PRODUCT_PACKAGES += \
+	android.hardware.vibrator-service.example
+
+# Authsecret
+PRODUCT_PACKAGES += \
+    android.hardware.authsecret@1.0-service
+
+# Input Classifier HAL
+PRODUCT_PACKAGES += \
+    android.hardware.input.classifier@1.0-service.default
+
+# power stats
+PRODUCT_PACKAGES += \
+    android.hardware.power.stats@1.0-service.mock
 
 # Goldfish does not support ION needed for Codec 2.0
 PRODUCT_PROPERTY_OVERRIDES += \
     debug.stagefright.ccodec=0
 
-DEVICE_MANIFEST_FILE := device/generic/goldfish/manifest.xml
-
 PRODUCT_COPY_FILES += \
     device/generic/goldfish/fstab.ranchu.initrd:$(TARGET_COPY_OUT_RAMDISK)/fstab.ranchu \
     device/generic/goldfish/data/etc/apns-conf.xml:data/misc/apns/apns-conf.xml \
@@ -213,7 +242,7 @@
     frameworks/native/data/etc/android.hardware.vulkan.compute-0.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.vulkan.compute.xml \
     frameworks/native/data/etc/android.hardware.vulkan.version-1_1.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.vulkan.version.xml \
     frameworks/native/data/etc/android.software.autofill.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.software.autofill.xml \
-    frameworks/native/data/etc/android.software.verified_boot.xml:system/etc/permissions/android.software.verified_boot.xml \
+    frameworks/native/data/etc/android.software.verified_boot.xml:${TARGET_COPY_OUT_PRODUCT}/etc/permissions/android.software.verified_boot.xml \
     frameworks/av/media/libeffects/data/audio_effects.xml:$(TARGET_COPY_OUT_VENDOR)/etc/audio_effects.xml \
     device/generic/goldfish/audio_policy.conf:$(TARGET_COPY_OUT_VENDOR)/etc/audio_policy.conf \
     frameworks/av/services/audiopolicy/config/audio_policy_configuration_generic.xml:$(TARGET_COPY_OUT_VENDOR)/etc/audio_policy_configuration.xml \
@@ -222,3 +251,4 @@
     frameworks/av/services/audiopolicy/config/audio_policy_volumes.xml:$(TARGET_COPY_OUT_VENDOR)/etc/audio_policy_volumes.xml \
     frameworks/av/services/audiopolicy/config/default_volume_tables.xml:$(TARGET_COPY_OUT_VENDOR)/etc/default_volume_tables.xml \
     frameworks/av/services/audiopolicy/config/surround_sound_configuration_5_0.xml:$(TARGET_COPY_OUT_VENDOR)/etc/surround_sound_configuration_5_0.xml \
+    device/generic/goldfish/data/etc/permissions/privapp-permissions-goldfish.xml:$(TARGET_COPY_OUT_PRODUCT)/etc/permissions/privapp-permissions-goldfish.xml
diff --git a/vibrator/qemu.c b/vibrator/qemu.c
index 8b64b57..315fba1 100644
--- a/vibrator/qemu.c
+++ b/vibrator/qemu.c
@@ -36,7 +36,7 @@
 #  define  D(...)   ((void)0)
 #endif
 
-#include "qemu_pipe.h"
+#include "qemud.h"
 
 int
 qemu_check(void)
@@ -78,8 +78,7 @@
     int   fd;
     char  pipe_name[512];
 
-    snprintf(pipe_name, sizeof(pipe_name), "qemud:%s", name);
-    fd = qemu_pipe_open(pipe_name);
+    fd = qemud_channel_open(name);
     if (fd < 0) {
         D("no qemud pipe: %s", strerror(errno));
         return -1;
@@ -91,43 +90,6 @@
 }
 
 static int
-qemu_channel_open_qemud( QemuChannel*  channel,
-                         const char*   name )
-{
-    int   fd, ret, namelen = strlen(name);
-    char  answer[2];
-
-    fd = socket_local_client( "qemud",
-                              ANDROID_SOCKET_NAMESPACE_RESERVED,
-                              SOCK_STREAM );
-    if (fd < 0) {
-        D("no qemud control socket: %s", strerror(errno));
-        return -1;
-    }
-
-    /* send service name to connect */
-    if (qemu_fd_write(fd, name, namelen) != namelen) {
-        D("can't send service name to qemud: %s",
-           strerror(errno));
-        close(fd);
-        return -1;
-    }
-
-    /* read answer from daemon */
-    if (qemu_fd_read(fd, answer, 2) != 2 ||
-        answer[0] != 'O' || answer[1] != 'K') {
-        D("cant' connect to %s service through qemud", name);
-        close(fd);
-        return -1;
-    }
-
-    channel->is_qemud = 1;
-    channel->fd       = fd;
-    return 0;
-}
-
-
-static int
 qemu_channel_open_qemud_old( QemuChannel*  channel,
                              const char*   name )
 {
@@ -196,9 +158,6 @@
             if (qemu_channel_open_qemud_pipe(channel, name) == 0)
                 break;
 
-            if (qemu_channel_open_qemud(channel, name) == 0)
-                break;
-
             if (qemu_channel_open_qemud_old(channel, name) == 0)
                 break;