diff --git a/Makefile.target b/Makefile.target
index 4b50420..e68de28 100644
--- a/Makefile.target
+++ b/Makefile.target
@@ -309,8 +309,6 @@
     android/main-common-ui.c \
     android/main.c \
     android/opengles.c \
-    android/protocol/core-commands-qemu.c \
-    android/protocol/ui-commands-qemu.c \
     android/user-events-qemu.c \
     hw/core/loader.c \
     ui/keymaps.c \
diff --git a/android/cmdline-options.h b/android/cmdline-options.h
index 1009af6..4653dfe 100644
--- a/android/cmdline-options.h
+++ b/android/cmdline-options.h
@@ -150,11 +150,6 @@
 OPT_PARAM( nand_limits, "<nlimits>", "enforce NAND/Flash read/write thresholds" )
 #endif
 
-#ifdef CONFIG_STANDALONE_UI
-OPT_PARAM( list_cores, "<host>", "list running core process" )
-OPT_PARAM( attach_core, "<console socket>", "attach to a running core process" )
-#endif  // CONFIG_STANDALONE_UI
-
 OPT_PARAM( gpu, "<mode>", "set hardware OpenGLES emulation mode" )
 
 OPT_PARAM( camera_back, "<mode>", "set emulation mode for a camera facing back" )
diff --git a/android/console.c b/android/console.c
index dc55646..b033c1d 100644
--- a/android/console.c
+++ b/android/console.c
@@ -53,17 +53,13 @@
 #include "android/keycode-array.h"
 #include "android/charmap.h"
 #include "android/display-core.h"
-#include "android/protocol/fb-updates-proxy.h"
-#include "android/protocol/user-events-impl.h"
-#include "android/protocol/ui-commands-api.h"
-#include "android/protocol/core-commands-impl.h"
-#include "android/protocol/ui-commands-proxy.h"
-#include "android/protocol/attach-ui-proxy.h"
 
 #if defined(CONFIG_SLIRP)
 #include "libslirp.h"
 #endif
 
+extern void android_emulator_set_window_scale(double, int);
+
 #define  DEBUG  1
 
 #if 1
@@ -2616,7 +2612,7 @@
         }
     }
 
-    uicmd_set_window_scale( scale, is_dpi );
+    android_emulator_set_window_scale(scale, is_dpi);
     return 0;
 }
 
diff --git a/android/help.c b/android/help.c
index 3ba19bf..acddfa8 100644
--- a/android/help.c
+++ b/android/help.c
@@ -979,33 +979,6 @@
     );
 }
 
-#ifdef CONFIG_STANDALONE_UI
-static void
-help_list_cores(stralloc_t*  out)
-{
-    PRINTF(
-    "  use '-list-cores localhost to list emulator core processes running on this machine.\n"
-    "  use '-list-cores host_name, or IP address to list emulator core processes running on\n"
-    "  a remote machine.\n"
-    );
-}
-
-static void
-help_attach_core(stralloc_t*  out)
-{
-    PRINTF(
-    "  the -attach-core <console socket> options attaches the UI to a running emulator core process.\n\n"
-
-    "  the <console socket> parameter must be in the form [host:]port, where 'host' addresses the\n"
-    "  machine on which the core process is running, and 'port' addresses the console port number for\n"
-    "  the running core process. Note that 'host' value must be in the form that can be resolved\n"
-    "  into an IP address.\n\n"
-
-    "  Use -list-cores to enumerate console ports for all currently running core processes.\n"
-    );
-}
-#endif  // CONFIG_STANDALONE_UI
-
 static void
 help_show_kernel(stralloc_t*  out)
 {
diff --git a/android/main-common-ui.c b/android/main-common-ui.c
index 0a58eda..5689a11 100644
--- a/android/main-common-ui.c
+++ b/android/main-common-ui.c
@@ -281,9 +281,7 @@
     }
 
     snprintf(buf, sizeof buf, "width=%d,height=%d", width, height);
-#if !defined(CONFIG_STANDALONE_UI) && !defined(CONFIG_STANDALONE_CORE)
     android_display_init(ds, qframebuffer_fifo_get());
-#endif
 }
 
 typedef struct part_properties part_properties;
diff --git a/android/main-common.c b/android/main-common.c
index de51109..ed3c584 100644
--- a/android/main-common.c
+++ b/android/main-common.c
@@ -413,234 +413,6 @@
     return ret;
 }
 
-
-
-
-#ifdef CONFIG_STANDALONE_UI
-
-#include "android/protocol/core-connection.h"
-#include "android/protocol/fb-updates-impl.h"
-#include "android/protocol/user-events-proxy.h"
-#include "android/protocol/core-commands-proxy.h"
-#include "android/protocol/ui-commands-impl.h"
-#include "android/protocol/attach-ui-impl.h"
-
-/* Emulator's core port. */
-int android_base_port = 0;
-
-// Base console port
-#define CORE_BASE_PORT          5554
-
-// Maximum number of core porocesses running simultaneously on a machine.
-#define MAX_CORE_PROCS          16
-
-// Socket timeout in millisec (set to 5 seconds)
-#define CORE_PORT_TIMEOUT_MS    5000
-
-#include "android/async-console.h"
-
-typedef struct {
-    LoopIo                 io[1];
-    int                    port;
-    int                    ok;
-    AsyncConsoleConnector  connector[1];
-} CoreConsole;
-
-static void
-coreconsole_io_func(void* opaque, int fd, unsigned events)
-{
-    CoreConsole* cc = opaque;
-    AsyncStatus  status;
-    status = asyncConsoleConnector_run(cc->connector);
-    if (status == ASYNC_COMPLETE) {
-        cc->ok = 1;
-    }
-}
-
-static void
-coreconsole_init(CoreConsole* cc, const SockAddress* address, Looper* looper)
-{
-    int fd = socket_create_inet(SOCKET_STREAM);
-    AsyncStatus status;
-    cc->port = sock_address_get_port(address);
-    cc->ok   = 0;
-    loopIo_init(cc->io, looper, fd, coreconsole_io_func, cc);
-    if (fd >= 0) {
-        status = asyncConsoleConnector_connect(cc->connector, address, cc->io);
-        if (status == ASYNC_ERROR) {
-            cc->ok = 0;
-        }
-    }
-}
-
-static void
-coreconsole_done(CoreConsole* cc)
-{
-    socket_close(cc->io->fd);
-    loopIo_done(cc->io);
-}
-
-/* List emulator core processes running on the given machine.
- * This routine is called from main() if -list-cores parameter is set in the
- * command line.
- * Param:
- *  host Value passed with -list-core parameter. Must be either "localhost", or
- *  an IP address of a machine where core processes must be enumerated.
- */
-static void
-list_running_cores(const char* host)
-{
-    Looper*         looper;
-    CoreConsole     cores[MAX_CORE_PROCS];
-    SockAddress     address;
-    int             nn, found;
-
-    if (sock_address_init_resolve(&address, host, CORE_BASE_PORT, 0) < 0) {
-        derror("Unable to resolve hostname %s: %s", host, errno_str);
-        return;
-    }
-
-    looper = looper_newGeneric();
-
-    for (nn = 0; nn < MAX_CORE_PROCS; nn++) {
-        int port = CORE_BASE_PORT + nn*2;
-        sock_address_set_port(&address, port);
-        coreconsole_init(&cores[nn], &address, looper);
-    }
-
-    looper_runWithTimeout(looper, CORE_PORT_TIMEOUT_MS*2);
-
-    found = 0;
-    for (nn = 0; nn < MAX_CORE_PROCS; nn++) {
-        int port = CORE_BASE_PORT + nn*2;
-        if (cores[nn].ok) {
-            if (found == 0) {
-                fprintf(stdout, "Running emulator core processes:\n");
-            }
-            fprintf(stdout, "Emulator console port %d\n", port);
-            found++;
-        }
-        coreconsole_done(&cores[nn]);
-    }
-    looper_free(looper);
-
-    if (found == 0) {
-       fprintf(stdout, "There were no running emulator core processes found on %s.\n",
-               host);
-    }
-}
-
-/* Attaches starting UI to a running core process.
- * This routine is called from main() when -attach-core parameter is set,
- * indicating that this UI instance should attach to a running core, rather than
- * start a new core process.
- * Param:
- *  opts Android options containing non-NULL attach_core.
- * Return:
- *  0 on success, or -1 on failure.
- */
-static int
-attach_to_core(AndroidOptions* opts) {
-    int iter;
-    SockAddress console_socket;
-    SockAddress** sockaddr_list;
-    QEmulator* emulator;
-
-    // Parse attach_core param extracting the host name, and the port name.
-    char* console_address = strdup(opts->attach_core);
-    char* host_name = console_address;
-    char* port_num = strchr(console_address, ':');
-    if (port_num == NULL) {
-        // The host name is ommited, indicating the localhost
-        host_name = "localhost";
-        port_num = console_address;
-    } else if (port_num == console_address) {
-        // Invalid.
-        derror("Invalid value %s for -attach-core parameter\n",
-               opts->attach_core);
-        return -1;
-    } else {
-        *port_num = '\0';
-        port_num++;
-        if (*port_num == '\0') {
-            // Invalid.
-            derror("Invalid value %s for -attach-core parameter\n",
-                   opts->attach_core);
-            return -1;
-        }
-    }
-
-    /* Create socket address list for the given address, and pull appropriate
-     * address to use for connection. Note that we're fine copying that address
-     * out of the list, since INET and IN6 will entirely fit into SockAddress
-     * structure. */
-    sockaddr_list =
-        sock_address_list_create(host_name, port_num, SOCKET_LIST_FORCE_INET);
-    free(console_address);
-    if (sockaddr_list == NULL) {
-        derror("Unable to resolve address %s: %s\n",
-               opts->attach_core, errno_str);
-        return -1;
-    }
-    for (iter = 0; sockaddr_list[iter] != NULL; iter++) {
-        if (sock_address_get_family(sockaddr_list[iter]) == SOCKET_INET ||
-            sock_address_get_family(sockaddr_list[iter]) == SOCKET_IN6) {
-            memcpy(&console_socket, sockaddr_list[iter], sizeof(SockAddress));
-            break;
-        }
-    }
-    if (sockaddr_list[iter] == NULL) {
-        derror("Unable to resolve address %s. Note that 'port' parameter passed to -attach-core\n"
-               "must be resolvable into an IP address.\n", opts->attach_core);
-        sock_address_list_free(sockaddr_list);
-        return -1;
-    }
-    sock_address_list_free(sockaddr_list);
-
-    if (attachUiImpl_create(&console_socket)) {
-        return -1;
-    }
-
-    // Save core's port, and set the title.
-    android_base_port = sock_address_get_port(&console_socket);
-    emulator = qemulator_get();
-    qemulator_set_title(emulator);
-
-    return 0;
-}
-
-
-void handle_ui_options( AndroidOptions* opts )
-{
-    // Lets see if user just wants to list core process.
-    if (opts->list_cores) {
-        fprintf(stdout, "Enumerating running core processes.\n");
-        list_running_cores(opts->list_cores);
-        exit(0);
-    }
-}
-
-int attach_ui_to_core( AndroidOptions* opts )
-{
-    // Lets see if we're attaching to a running core process here.
-    if (opts->attach_core) {
-        if (attach_to_core(opts)) {
-            return -1;
-        }
-        // Connect to the core's UI control services.
-        if (coreCmdProxy_create(attachUiImpl_get_console_socket())) {
-            return -1;
-        }
-        // Connect to the core's user events service.
-        if (userEventsProxy_create(attachUiImpl_get_console_socket())) {
-            return -1;
-        }
-    }
-    return 0;
-}
-
-#else  /* !CONFIG_STANDALONE_UI */
-
 void handle_ui_options( AndroidOptions* opts )
 {
     return;
@@ -650,5 +422,3 @@
 {
     return 0;
 }
-
-#endif /* CONFIG_STANDALONE_UI */
diff --git a/android/opengles.c b/android/opengles.c
index 2570429..0d7855c 100644
--- a/android/opengles.c
+++ b/android/opengles.c
@@ -110,10 +110,8 @@
 }
 
 
-#ifndef CONFIG_STANDALONE_UI
 /* Defined in android/hw-pipe-net.c */
 extern int android_init_opengles_pipes(void);
-#endif
 
 static ADynamicLibrary*  rendererLib;
 static int               rendererStarted;
@@ -135,10 +133,7 @@
         return -1;
     }
 
-#ifndef CONFIG_STANDALONE_UI
     android_init_opengles_pipes();
-#endif
-
 
     /* Resolve the functions */
     if (initOpenglesEmulationFuncs(rendererLib) < 0) {
diff --git a/android/protocol/attach-ui-impl.c b/android/protocol/attach-ui-impl.c
deleted file mode 100644
index a61e546..0000000
--- a/android/protocol/attach-ui-impl.c
+++ /dev/null
@@ -1,83 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-** GNU General Public License for more details.
-*/
-
-/*
- * Contains the UI-side implementation of the "core-ui-control" service that is
- * part of the UI control protocol. Here we handle UI control commands received
- * from the Core.
- */
-
-#include "android/utils/debug.h"
-#include "android/utils/panic.h"
-#include "android/protocol/core-connection.h"
-#include "android/protocol/attach-ui-impl.h"
-
-/* Descriptor for the UI-side of the "attach-ui" service. */
-typedef struct AttachUIImpl {
-    /* Address of the Core's console socket. */
-    SockAddress     console_socket;
-
-    /* Core connection established for this service. */
-    CoreConnection* core_connection;
-
-    /* Socket descriptor for the UI service. */
-    int             sock;
-} AttachUIImpl;
-
-/* One and only one AttachUIImpl instance. */
-static AttachUIImpl  _attachUiImpl;
-
-SockAddress*
-attachUiImpl_get_console_socket(void)
-{
-    return &_attachUiImpl.console_socket;
-}
-
-int
-attachUiImpl_create(SockAddress* console_socket)
-{
-    char* handshake = NULL;
-
-    _attachUiImpl.console_socket = *console_socket;
-
-    // Connect to the core-ui-control service.
-    _attachUiImpl.core_connection =
-        core_connection_create_and_switch(console_socket, "attach-UI",
-                                          &handshake);
-    if (_attachUiImpl.core_connection == NULL) {
-        derror("Unable to connect to the attach-UI service: %s\n",
-               errno_str);
-        return -1;
-    }
-
-    fprintf(stdout, "UI is now attached to the core at %s.",
-            sock_address_to_string(console_socket));
-    if (handshake != NULL) {
-        if (handshake[0] != '\0') {
-            fprintf(stdout, " Handshake: %s", handshake);
-        }
-        free(handshake);
-    }
-    fprintf(stdout, "\n");
-
-    return 0;
-}
-
-void
-attachUiImpl_destroy(void)
-{
-    if (_attachUiImpl.core_connection != NULL) {
-        core_connection_close(_attachUiImpl.core_connection);
-        core_connection_free(_attachUiImpl.core_connection);
-        _attachUiImpl.core_connection = NULL;
-    }
-}
diff --git a/android/protocol/attach-ui-impl.h b/android/protocol/attach-ui-impl.h
deleted file mode 100644
index db63955..0000000
--- a/android/protocol/attach-ui-impl.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-** GNU General Public License for more details.
-*/
-
-#ifndef _ANDROID_PROTOCOL_ATTACH_UI_IMPL_H
-#define _ANDROID_PROTOCOL_ATTACH_UI_IMPL_H
-
-#include "android/sockets.h"
-
-/*
- * Contains the UI-side implementation of the "attach-ui" service that is
- * used to establish connection between the UI and the Core.
- */
-
-/* Creates and initializes descriptor for the UI-side of the "atatch-ui"
- * service. Note that there can be only one instance of this service in the core.
- * Param:
- *  console_socket - Addresses Core's console.
- * Return:
- *  0 on success, or < 0 on failure.
- */
-extern int attachUiImpl_create(SockAddress* console_socket);
-
-/* Destroys the descriptor for the UI-side of the "attach-ui" service. */
-extern void attachUiImpl_destroy(void);
-
-/* Gets Core's console socket address for the attached UI. */
-extern SockAddress* attachUiImpl_get_console_socket(void);
-
-#endif /* _ANDROID_PROTOCOL_ATTACH_UI_IMPL_H */
-
diff --git a/android/protocol/attach-ui-proxy.c b/android/protocol/attach-ui-proxy.c
deleted file mode 100644
index a0bc7fc..0000000
--- a/android/protocol/attach-ui-proxy.c
+++ /dev/null
@@ -1,110 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-** GNU General Public License for more details.
-*/
-
-/*
- * Contains the Core-side implementation of the "attach-ui" service that is
- * used to establish connection between the UI and the Core.
- */
-
-#include "android/android.h"
-#include "android/globals.h"
-#include "android/looper.h"
-#include "android/async-utils.h"
-#include "android/sync-utils.h"
-#include "android/utils/debug.h"
-#include "android/protocol/core-commands.h"
-#include "android/protocol/core-commands-impl.h"
-
-/* Descriptor for the UI attach-ui proxy. */
-typedef struct AttachUIProxy {
-    /* Reader to detect UI disconnection. */
-    AsyncReader         async_reader;
-
-    /* I/O associated with this descriptor. */
-    LoopIo              io;
-
-    /* Looper used to communicate with the UI. */
-    Looper*             looper;
-
-    /* Socket descriptor for this service. */
-    int                 sock;
-} AttachUIProxy;
-
-/* One and only one AttachUIProxy instance. */
-static AttachUIProxy    _attachUiProxy;
-
-/* Implemented in android/console.c */
-extern void destroy_attach_ui_client(void);
-
-/* Asynchronous I/O callback for AttachUIProxy instance.
- * We expect this callback to be called only on UI detachment condition. In this
- * case the event should be LOOP_IO_READ, and read should fail with errno set
- * to ECONNRESET.
- * Param:
- *  opaque - AttachUIProxy instance.
- */
-static void
-_attachUiProxy_io_func(void* opaque, int fd, unsigned events)
-{
-    AttachUIProxy* uicmd = (AttachUIProxy*)opaque;
-    AsyncReader reader;
-    AsyncStatus status;
-    uint8_t read_buf[1];
-
-    if (events & LOOP_IO_WRITE) {
-        derror("Unexpected LOOP_IO_WRITE in _attachUiProxy_io_func.\n");
-        return;
-    }
-
-    // Try to read
-    asyncReader_init(&reader, read_buf, sizeof(read_buf), &uicmd->io);
-    status = asyncReader_read(&reader);
-    // We expect only error status here.
-    if (status != ASYNC_ERROR) {
-        derror("Unexpected read status %d in _attachUiProxy_io_func\n", status);
-        return;
-    }
-    // We expect only socket disconnection error here.
-    if (errno != ECONNRESET) {
-        derror("Unexpected read error %d (%s) in _attachUiProxy_io_func.\n",
-               errno, errno_str);
-        return;
-    }
-
-    // Client got disconnectted.
-    destroy_attach_ui_client();
-}
-
-int
-attachUiProxy_create(int fd)
-{
-    // Initialize the only AttachUIProxy instance.
-    _attachUiProxy.sock = fd;
-    _attachUiProxy.looper = looper_newCore();
-    loopIo_init(&_attachUiProxy.io, _attachUiProxy.looper, _attachUiProxy.sock,
-                _attachUiProxy_io_func, &_attachUiProxy);
-    loopIo_wantRead(&_attachUiProxy.io);
-
-    return 0;
-}
-
-void
-attachUiProxy_destroy(void)
-{
-    if (_attachUiProxy.looper != NULL) {
-        // Stop all I/O that may still be going on.
-        loopIo_done(&_attachUiProxy.io);
-        looper_free(_attachUiProxy.looper);
-        _attachUiProxy.looper = NULL;
-    }
-    _attachUiProxy.sock = -1;
-}
diff --git a/android/protocol/attach-ui-proxy.h b/android/protocol/attach-ui-proxy.h
deleted file mode 100644
index a7d54f4..0000000
--- a/android/protocol/attach-ui-proxy.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-** GNU General Public License for more details.
-*/
-
-#ifndef _ANDROID_PROTOCOL_ATTACH_UI_PROXY_H
-#define _ANDROID_PROTOCOL_ATTACH_UI_PROXY_H
-
-/*
- * Contains the Core-side implementation of the "attach-ui" service that is
- * used to establish connection between the UI and the Core.
- */
-
-/* Creates and initializes descriptor for the Core-side of the "atatch-ui"
- * service. Note that there can be only one instance of this service in the core.
- * Param:
- *  fd - Socket descriptor for the proxy.
- * Return:
- *  0 on success, or < 0 on failure.
- */
-extern int attachUiProxy_create(int fd);
-
-/* Destroys the descriptor for the Core-side of the "attach-ui" service. */
-extern void attachUiProxy_destroy(void);
-
-#endif /* _ANDROID_PROTOCOL_ATTACH_UI_PROXY_H */
diff --git a/android/protocol/core-commands-api.h b/android/protocol/core-commands-api.h
deleted file mode 100644
index 93a569c..0000000
--- a/android/protocol/core-commands-api.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-** GNU General Public License for more details.
-*/
-
-#ifndef _ANDROID_PROTOCOL_CORE_COMMANDS_API_H
-#define _ANDROID_PROTOCOL_CORE_COMMANDS_API_H
-
-/*
- * Contains the API for calling into the Core with UI control commands.
- */
-
-#include "android/android.h"
-#include "android/hw-sensors.h"
-
-/* Instructs the Core to change the coarse orientation.
- * Return:
- *  0 on success, or < 0 on failure.
- */
-extern int corecmd_set_coarse_orientation(AndroidCoarseOrientation orient);
-
-/* Toggles the network in the Core.
- * Return:
- *  0 on success, or < 0 on failure.
- */
-extern int corecmd_toggle_network();
-
-/* Starts or stops tracing in the Core.
- * Param:
- *  start - Starts (> 0), or stops (== 0) tracing.
- * Return:
- *  0 on success, or < 0 on failure.
- */
-extern int corecmd_trace_control(int start);
-
-/* Checks if network is disabled in the Core.
- * Return:
- *  0 if network is enabled, 1 if it is disabled, or < 0 on failure.
- */
-extern int corecmd_is_network_disabled();
-
-/* Requests a NetworkSpeed instance from the Core.
- * Param:
- *  index - Index of an entry in the NetworkSpeed array.
- *  netspeed - Upon success contains allocated and initialized NetworkSpeed
- *      instance for the given index. Note that strings addressed by "name" and
- *      "display" fileds in the returned NetworkSpeed instance are containd
- *      inside the buffer allocated for the returned NetworkSpeed instance.
- *      Caller of this routine must eventually free the buffer returned in this
- *      parameter.
- * Return:
- *  0 on success, or < 0 on failure.
- */
-extern int corecmd_get_netspeed(int index, NetworkSpeed** netspeed);
-
-/* Requests a NetworkLatency instance from the Core.
- * Param:
- *  index - Index of an entry in the NetworkLatency array.
- *  netdelay - Upon success contains allocated and initialized NetworkLatency
- *      instance for the given index. Note that strings addressed by "name" and
- *      "display" fileds in the returned NetworkLatency instance are containd
- *      inside the buffer allocated for the returned NetworkLatency instance.
- *      Caller of this routine must eventually free the buffer returned in this
- *      parameter.
- * Return:
- *  0 on success, or < 0 on failure.
- */
-extern int corecmd_get_netdelay(int index, NetworkLatency** netdelay);
-
-/* Requests a QEMU file path from the Core.
- * Param:
- *  type, filename - Request parameters that define the file for which path is
- *  requested.
- * Return:
- *  0 on success, or < 0 on failure.
- */
-extern int corecmd_get_qemu_path(int type,
-                                 const char* filename,
-                                 char* path,
-                                 size_t path_buf_size);
-
-/* Gets LCD density property from the core properties.
- * Return:
- *  LCD density on success, or < 0 on failure.
- */
-extern int corecmd_get_hw_lcd_density(void);
-
-#endif /* _ANDROID_PROTOCOL_CORE_COMMANDS_API_H */
diff --git a/android/protocol/core-commands-impl.c b/android/protocol/core-commands-impl.c
deleted file mode 100644
index 8ca18c0..0000000
--- a/android/protocol/core-commands-impl.c
+++ /dev/null
@@ -1,440 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-** GNU General Public License for more details.
-*/
-
-/*
- * Contains the Core-side implementation of the "ui-core-control" service that is
- * part of the UI control protocol. Here we handle UI control commands sent by
- * the UI to the Core.
- */
-
-#include "android/android.h"
-#include "android/globals.h"
-#include "telephony/modem_driver.h"
-#include "android/trace.h"
-#include "android/looper.h"
-#include "android/async-utils.h"
-#include "android/sync-utils.h"
-#include "android/utils/debug.h"
-#include "android/protocol/core-commands.h"
-#include "android/protocol/core-commands-impl.h"
-
-/* Enumerates state values for the command reader in the CoreCmdImpl descriptor.
- */
-typedef enum CoreCmdImplState {
-    /* The reader is waiting on command header. */
-    EXPECTS_HEADER,
-
-    /* The reader is waiting on command parameters. */
-    EXPECTS_PARAMETERS,
-} CoreCmdImplState;
-
-/* Descriptor for the Core-side implementation of the "ui-core-control" service.
- */
-typedef struct CoreCmdImpl {
-    /* Reader to detect UI disconnection. */
-    AsyncReader         async_reader;
-
-    /* I/O associated with this descriptor. */
-    LoopIo              io;
-
-    /* Looper used to communicate with the UI. */
-    Looper*             looper;
-
-    /* Writer to send responses to the UI commands. */
-    SyncSocket*         sync_writer;
-
-    /* Socket descriptor for this service. */
-    int                 sock;
-
-    /* Command reader state. */
-    CoreCmdImplState    cmd_state;
-
-    /* Incoming command header. */
-    UICmdHeader         cmd_header;
-
-    /* A small preallocated buffer for command parameters. */
-    uint8_t             cmd_param[256];
-
-    /* Buffer to use for reading command parameters. Depending on expected size
-     * of the parameters this buffer can point to cmd_param field of this
-     * structure (for small commands), or can be allocated for large commands. */
-    void*               cmd_param_buf;
-} CoreCmdImpl;
-
-/* One and only one CoreCmdImpl instance. */
-static CoreCmdImpl    _coreCmdImpl;
-
-/* Implemented in android/console.c */
-extern void destroy_corecmd_client(void);
-/* Implemented in vl-android.c */
-extern char* qemu_find_file(int type, const char* filename);
-
-/* Properly initializes cmd_param_buf field in CoreCmdImpl instance to receive
- * the expected command parameters.
- */
-static uint8_t*
-_alloc_cmd_param_buf(CoreCmdImpl* corecmd, uint32_t size)
-{
-    if (size < sizeof(corecmd->cmd_param)) {
-        // cmd_param can contain all request data.
-        corecmd->cmd_param_buf = &corecmd->cmd_param[0];
-    } else {
-        // Expected request us too large to fit into preallocated buffer.
-        corecmd->cmd_param_buf = g_malloc(size);
-    }
-    return corecmd->cmd_param_buf;
-}
-
-/* Properly frees cmd_param_buf field in CoreCmdImpl instance.
- */
-static void
-_free_cmd_param_buf(CoreCmdImpl* corecmd)
-{
-    if (corecmd->cmd_param_buf != &corecmd->cmd_param[0]) {
-        g_free(corecmd->cmd_param_buf);
-        corecmd->cmd_param_buf = &corecmd->cmd_param[0];
-    }
-}
-
-/* Calculates timeout for transferring the given number of bytes via socket.
- * Return:
- *  Number of milliseconds during which the entire number of bytes is expected
- *  to be transferred via socket for this service.
- */
-static int
-_coreCmdImpl_get_timeout(size_t data_size)
-{
-    // Min 2 seconds + 10 millisec for each transferring byte.
-    // TODO: Come up with a better arithmetics here.
-    return 2000 + data_size * 10;
-}
-
-/* Sends command response back to the UI.
- * Param:
- *  corecmd - CoreCmdImpl instance to use to send the response.
- *  resp - Response header.
- *  resp_data - Response data. Data size is defined by the header.
- * Return:
- *  0 on success, or < 0 on failure.
- */
-static int
-_coreCmdImpl_respond(CoreCmdImpl* corecmd, UICmdRespHeader* resp, void* resp_data)
-{
-    int status = syncsocket_start_write(corecmd->sync_writer);
-    if (!status) {
-        // Write the header
-        status = syncsocket_write(corecmd->sync_writer, resp,
-                                  sizeof(UICmdRespHeader),
-                                  _coreCmdImpl_get_timeout(sizeof(UICmdRespHeader)));
-        // Write response data (if any).
-        if (status > 0 && resp_data != NULL && resp->resp_data_size != 0) {
-            status = syncsocket_write(corecmd->sync_writer, resp_data,
-                                      resp->resp_data_size,
-                                      _coreCmdImpl_get_timeout(resp->resp_data_size));
-        }
-        status = syncsocket_result(status);
-        syncsocket_stop_write(corecmd->sync_writer);
-    }
-    if (status < 0) {
-        derror("Core is unable to respond with %u bytes to the UI control command: %s\n",
-               resp->resp_data_size, errno_str);
-    }
-    return status;
-}
-
-/* Handles UI control command received from the UI.
- * Param:
- *  corecmd - CoreCmdImpl instance that received the command.
- *  cmd_header - Command header.
- *  cmd_param - Command data.
- */
-static void
-_coreCmdImpl_handle_command(CoreCmdImpl* corecmd,
-                            const UICmdHeader* cmd_header,
-                            const uint8_t* cmd_param)
-{
-    switch (cmd_header->cmd_type) {
-        case AUICMD_SET_COARSE_ORIENTATION:
-        {
-            UICmdSetCoarseOrientation* cmd =
-                (UICmdSetCoarseOrientation*)cmd_param;
-            android_sensors_set_coarse_orientation(cmd->orient);
-            break;
-        }
-
-        case AUICMD_TOGGLE_NETWORK:
-            qemu_net_disable = !qemu_net_disable;
-            if (android_modem) {
-                amodem_set_data_registration(
-                        android_modem,
-                qemu_net_disable ? A_REGISTRATION_UNREGISTERED
-                    : A_REGISTRATION_HOME);
-            }
-            break;
-
-        case AUICMD_TRACE_CONTROL:
-        {
-            UICmdTraceControl* cmd = (UICmdTraceControl*)cmd_param;
-            if (cmd->start) {
-                start_tracing();
-            } else {
-                stop_tracing();
-            }
-            break;
-        }
-
-        case AUICMD_CHK_NETWORK_DISABLED:
-        {
-            UICmdRespHeader resp;
-            resp.resp_data_size = 0;
-            resp.result = qemu_net_disable;
-            _coreCmdImpl_respond(corecmd, &resp, NULL);
-            break;
-        }
-
-        case AUICMD_GET_NETSPEED:
-        {
-            UICmdRespHeader resp;
-            UICmdGetNetSpeedResp* resp_data = NULL;
-            UICmdGetNetSpeed* cmd = (UICmdGetNetSpeed*)cmd_param;
-
-            resp.resp_data_size = 0;
-            resp.result = 0;
-
-            if (cmd->index >= android_netspeeds_count ||
-                android_netspeeds[cmd->index].name == NULL) {
-                resp.result = -1;
-            } else {
-                const NetworkSpeed* netspeed = &android_netspeeds[cmd->index];
-                // Calculate size of the response data:
-                // fixed header + zero-terminated netspeed name.
-                resp.resp_data_size = sizeof(UICmdGetNetSpeedResp) +
-                                      strlen(netspeed->name) + 1;
-                // Count in zero-terminated netspeed display.
-                if (netspeed->display != NULL) {
-                    resp.resp_data_size += strlen(netspeed->display) + 1;
-                } else {
-                    resp.resp_data_size++;
-                }
-                // Allocate and initialize response data buffer.
-                resp_data =
-                    (UICmdGetNetSpeedResp*)g_malloc(resp.resp_data_size);
-                resp_data->upload = netspeed->upload;
-                resp_data->download = netspeed->download;
-                strcpy(resp_data->name, netspeed->name);
-                if (netspeed->display != NULL) {
-                    strcpy(resp_data->name + strlen(resp_data->name) + 1,
-                           netspeed->display);
-                } else {
-                    strcpy(resp_data->name + strlen(resp_data->name) + 1, "");
-                }
-            }
-            _coreCmdImpl_respond(corecmd, &resp, resp_data);
-            if (resp_data != NULL) {
-                g_free(resp_data);
-            }
-            break;
-        }
-
-        case AUICMD_GET_NETDELAY:
-        {
-            UICmdRespHeader resp;
-            UICmdGetNetDelayResp* resp_data = NULL;
-            UICmdGetNetDelay* cmd = (UICmdGetNetDelay*)cmd_param;
-
-            resp.resp_data_size = 0;
-            resp.result = 0;
-
-            if (cmd->index >= android_netdelays_count ||
-                android_netdelays[cmd->index].name == NULL) {
-                resp.result = -1;
-            } else {
-                const NetworkLatency* netdelay = &android_netdelays[cmd->index];
-                // Calculate size of the response data:
-                // fixed header + zero-terminated netdelay name.
-                resp.resp_data_size = sizeof(UICmdGetNetDelayResp) +
-                                      strlen(netdelay->name) + 1;
-                // Count in zero-terminated netdelay display.
-                if (netdelay->display != NULL) {
-                    resp.resp_data_size += strlen(netdelay->display) + 1;
-                } else {
-                    resp.resp_data_size++;
-                }
-                // Allocate and initialize response data buffer.
-                resp_data =
-                    (UICmdGetNetDelayResp*)g_malloc(resp.resp_data_size);
-                resp_data->min_ms = netdelay->min_ms;
-                resp_data->max_ms = netdelay->max_ms;
-                strcpy(resp_data->name, netdelay->name);
-                if (netdelay->display != NULL) {
-                    strcpy(resp_data->name + strlen(resp_data->name) + 1,
-                           netdelay->display);
-                } else {
-                    strcpy(resp_data->name + strlen(resp_data->name) + 1, "");
-                }
-            }
-            _coreCmdImpl_respond(corecmd, &resp, resp_data);
-            if (resp_data != NULL) {
-                g_free(resp_data);
-            }
-            break;
-        }
-
-        case AUICMD_GET_QEMU_PATH:
-        {
-            UICmdRespHeader resp;
-            UICmdGetQemuPath* cmd = (UICmdGetQemuPath*)cmd_param;
-            char* filepath = NULL;
-
-            resp.resp_data_size = 0;
-            resp.result = -1;
-            filepath = qemu_find_file(cmd->type, cmd->filename);
-            if (filepath != NULL) {
-                resp.resp_data_size = strlen(filepath) + 1;
-            }
-            _coreCmdImpl_respond(corecmd, &resp, filepath);
-            if (filepath != NULL) {
-                g_free(filepath);
-            }
-            break;
-        }
-
-        case AUICMD_GET_LCD_DENSITY:
-        {
-            UICmdRespHeader resp;
-            resp.resp_data_size = 0;
-            resp.result = android_hw->hw_lcd_density;
-            _coreCmdImpl_respond(corecmd, &resp, NULL);
-            break;
-        }
-
-        default:
-            derror("Unknown UI control command %d is received by the Core.\n",
-                   cmd_header->cmd_type);
-            break;
-    }
-}
-
-/* Asynchronous I/O callback reading UI control commands.
- * Param:
- *  opaque - CoreCmdImpl instance.
- *  events - Lists I/O event (read or write) this callback is called for.
- */
-static void
-_coreCmdImpl_io_func(void* opaque, int fd, unsigned events)
-{
-    AsyncStatus status;
-    CoreCmdImpl* corecmd;
-
-    if (events & LOOP_IO_WRITE) {
-        // We don't use async writer here, so we don't expect
-        // any write callbacks.
-        derror("Unexpected LOOP_IO_WRITE in _coreCmdImpl_io_func\n");
-        return;
-    }
-
-    corecmd = (CoreCmdImpl*)opaque;
-
-    // Read whatever is expected from the socket.
-    status = asyncReader_read(&corecmd->async_reader);
-    switch (status) {
-        case ASYNC_COMPLETE:
-            switch (corecmd->cmd_state) {
-                case EXPECTS_HEADER:
-                    // We just read the command  header. Now we expect the param.
-                    if (corecmd->cmd_header.cmd_param_size != 0) {
-                        corecmd->cmd_state = EXPECTS_PARAMETERS;
-                        // Setup the reader to read expected amount of data.
-                        _alloc_cmd_param_buf(corecmd,
-                                             corecmd->cmd_header.cmd_param_size);
-                        asyncReader_init(&corecmd->async_reader,
-                                         corecmd->cmd_param_buf,
-                                         corecmd->cmd_header.cmd_param_size,
-                                         &corecmd->io);
-                    } else {
-                        // Command doesn't have param. Go ahead and handle it.
-                        _coreCmdImpl_handle_command(corecmd, &corecmd->cmd_header,
-                                                NULL);
-                        // Prepare for the next header.
-                        corecmd->cmd_state = EXPECTS_HEADER;
-                        asyncReader_init(&corecmd->async_reader,
-                                         &corecmd->cmd_header,
-                                         sizeof(corecmd->cmd_header),
-                                         &corecmd->io);
-                    }
-                    break;
-
-                case EXPECTS_PARAMETERS:
-                    // Entore command is received. Handle it.
-                    _coreCmdImpl_handle_command(corecmd, &corecmd->cmd_header,
-                                            corecmd->cmd_param_buf);
-                    _free_cmd_param_buf(corecmd);
-                    // Prepare for the next command.
-                    corecmd->cmd_state = EXPECTS_HEADER;
-                    asyncReader_init(&corecmd->async_reader, &corecmd->cmd_header,
-                                     sizeof(corecmd->cmd_header), &corecmd->io);
-                    break;
-            }
-            break;
-
-        case ASYNC_ERROR:
-            loopIo_dontWantRead(&corecmd->io);
-            if (errno == ECONNRESET) {
-                // UI has exited. We need to destroy the service.
-                destroy_corecmd_client();
-            }
-            break;
-
-        case ASYNC_NEED_MORE:
-            // Transfer will eventually come back into this routine.
-            return;
-    }
-}
-
-int
-coreCmdImpl_create(int fd)
-{
-    _coreCmdImpl.sock = fd;
-    _coreCmdImpl.looper = looper_newCore();
-    loopIo_init(&_coreCmdImpl.io, _coreCmdImpl.looper, _coreCmdImpl.sock,
-                _coreCmdImpl_io_func, &_coreCmdImpl);
-    _coreCmdImpl.cmd_state = EXPECTS_HEADER;
-    _coreCmdImpl.cmd_param_buf = &_coreCmdImpl.cmd_param[0];
-    asyncReader_init(&_coreCmdImpl.async_reader, &_coreCmdImpl.cmd_header,
-                     sizeof(_coreCmdImpl.cmd_header), &_coreCmdImpl.io);
-    _coreCmdImpl.sync_writer = syncsocket_init(fd);
-    if (_coreCmdImpl.sync_writer == NULL) {
-        derror("Unable to create writer for CoreCmdImpl instance: %s\n",
-               errno_str);
-        coreCmdImpl_destroy();
-        return -1;
-    }
-    return 0;
-}
-
-void
-coreCmdImpl_destroy()
-{
-    // Destroy the writer
-    if (_coreCmdImpl.sync_writer != NULL) {
-        syncsocket_close(_coreCmdImpl.sync_writer);
-        syncsocket_free(_coreCmdImpl.sync_writer);
-    }
-    if (_coreCmdImpl.looper != NULL) {
-        // Stop all I/O that may still be going on.
-        loopIo_done(&_coreCmdImpl.io);
-        looper_free(_coreCmdImpl.looper);
-        _coreCmdImpl.looper = NULL;
-    }
-    // Free allocated memory.
-    _free_cmd_param_buf(&_coreCmdImpl);
-}
diff --git a/android/protocol/core-commands-impl.h b/android/protocol/core-commands-impl.h
deleted file mode 100644
index 8690613..0000000
--- a/android/protocol/core-commands-impl.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-** GNU General Public License for more details.
-*/
-
-#ifndef _ANDROID_PROTOCOL_CORE_COMMANDS_IMPL_H
-#define _ANDROID_PROTOCOL_CORE_COMMANDS_IMPL_H
-
-/*
- * Contains the Core-side implementation of the "ui-core-control" service that is
- * part of the UI control protocol. Here we handle UI control commands sent by
- * the UI to the Core.
- */
-
-/* Creates and initializes descriptor for the Core-side of the "ui-core-control"
- * service. Note that there can be only one instance of this service in the core.
- * Param:
- *  fd - Socket descriptor for the service.
- * Return:
- *  0 on success, or < 0 on failure.
- */
-extern int coreCmdImpl_create(int fd);
-
-/* Destroys the descriptor for the Core-side of the "ui-core-control" service. */
-extern void coreCmdImpl_destroy();
-
-#endif /* _ANDROID_PROTOCOL_CORE_COMMANDS_IMPL_H */
diff --git a/android/protocol/core-commands-proxy.c b/android/protocol/core-commands-proxy.c
deleted file mode 100644
index 3449952..0000000
--- a/android/protocol/core-commands-proxy.c
+++ /dev/null
@@ -1,376 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-** GNU General Public License for more details.
-*/
-
-/*
- * Contains the UI-side implementation of the "ui-core-control" service that is
- * part of the UI control protocol. Here we send UI control commands to the Core.
- */
-
-#include "ui/console.h"
-#include "android/looper.h"
-#include "android/async-utils.h"
-#include "android/sync-utils.h"
-#include "android/utils/debug.h"
-#include "android/utils/panic.h"
-#include "android/protocol/core-connection.h"
-#include "android/protocol/core-commands.h"
-#include "android/protocol/core-commands-proxy.h"
-#include "android/protocol/core-commands-api.h"
-
-/* Descriptor for the UI-side "ui-core-control" service. */
-typedef struct CoreCmdProxy {
-    /* Core connection established for this service. */
-    CoreConnection*     core_connection;
-
-    /* Socket descriptor for the UI service. */
-    int                 sock;
-
-    /* Socket wrapper for sync srites. */
-    SyncSocket*         sync_writer;
-
-    /* Socket wrapper for sync reads. */
-    SyncSocket*         sync_reader;
-} CoreCmdProxy;
-
-/* One and only one CoreCmdProxy instance. */
-static CoreCmdProxy  _coreCmdProxy = { 0 };
-
-/* Sends UI command to the core.
- * Param:
- *  cmd_type, cmd_param, cmd_param_size - Define the command.
- * Return:
- *  0 On success, or < 0 on failure.
- */
-static int
-_coreCmdProxy_send_command(uint8_t cmd_type,
-                           void* cmd_param,
-                           uint32_t cmd_param_size)
-{
-    int status;
-    UICmdHeader header;
-
-    // Prepare the command header.
-    header.cmd_type = cmd_type;
-    header.cmd_param_size = cmd_param_size;
-    status = syncsocket_start_write(_coreCmdProxy.sync_writer);
-    if (!status) {
-        // Send the header.
-        status = syncsocket_write(_coreCmdProxy.sync_writer, &header,
-                                  sizeof(header),
-                                  core_connection_get_timeout(sizeof(header)));
-        // If there is request data, send it too.
-        if (status > 0 && cmd_param != NULL && cmd_param_size > 0) {
-            status = syncsocket_write(_coreCmdProxy.sync_writer, cmd_param,
-                                      cmd_param_size,
-                                      core_connection_get_timeout(cmd_param_size));
-        }
-        status = syncsocket_result(status);
-        syncsocket_stop_write(_coreCmdProxy.sync_writer);
-    }
-    if (status < 0) {
-        derror("Unable to send UI control command %d (size %u): %s\n",
-                cmd_type, cmd_param_size, errno_str);
-    }
-    return status;
-}
-
-/* Reads UI control command response from the core.
- * Param:
- *  resp - Upon success contains command response header.
- *  resp_data - Upon success contains allocated reponse data (if any). The caller
- *      is responsible for deallocating the memory returned here.
- * Return:
- *  0 on success, or < 0 on failure.
- */
-static int
-_coreCmdProxy_get_response(UICmdRespHeader* resp, void** resp_data)
-{
-    int status =  syncsocket_start_read(_coreCmdProxy.sync_reader);
-    if (!status) {
-        // Read the header.
-        status = syncsocket_read(_coreCmdProxy.sync_reader, resp,
-                                 sizeof(UICmdRespHeader),
-                                 core_connection_get_timeout(sizeof(UICmdRespHeader)));
-        // Read response data (if any).
-        if (status > 0 && resp->resp_data_size) {
-            *resp_data = malloc(resp->resp_data_size);
-            if (*resp_data == NULL) {
-                APANIC("_coreCmdProxy_get_response is unable to allocate response data buffer.\n");
-            }
-            status = syncsocket_read(_coreCmdProxy.sync_reader, *resp_data,
-                                     resp->resp_data_size,
-                                     core_connection_get_timeout(resp->resp_data_size));
-        }
-        status = syncsocket_result(status);
-        syncsocket_stop_read(_coreCmdProxy.sync_reader);
-    }
-    if (status < 0) {
-        derror("Unable to get UI command response from the Core: %s\n",
-               errno_str);
-    }
-    return status;
-}
-
-int
-corecmd_set_coarse_orientation(AndroidCoarseOrientation orient)
-{
-    UICmdSetCoarseOrientation cmd;
-    cmd.orient = orient;
-    return _coreCmdProxy_send_command(AUICMD_SET_COARSE_ORIENTATION,
-                                      &cmd, sizeof(cmd));
-}
-
-int
-corecmd_toggle_network()
-{
-    return _coreCmdProxy_send_command(AUICMD_TOGGLE_NETWORK, NULL, 0);
-}
-
-int
-corecmd_trace_control(int start)
-{
-    UICmdTraceControl cmd;
-    cmd.start = start;
-    return _coreCmdProxy_send_command(AUICMD_TRACE_CONTROL,
-                                      &cmd, sizeof(cmd));
-}
-
-int
-corecmd_is_network_disabled()
-{
-    UICmdRespHeader resp;
-    void* tmp = NULL;
-    int status;
-
-    status = _coreCmdProxy_send_command(AUICMD_CHK_NETWORK_DISABLED, NULL, 0);
-    if (status < 0) {
-        return status;
-    }
-    status = _coreCmdProxy_get_response(&resp, &tmp);
-    if (status < 0) {
-        return status;
-    }
-    return resp.result;
-}
-
-int
-corecmd_get_netspeed(int index, NetworkSpeed** netspeed)
-{
-    UICmdGetNetSpeed req;
-    UICmdRespHeader resp;
-    UICmdGetNetSpeedResp* resp_data = NULL;
-    int status;
-
-    // Initialize and send the query.
-    req.index = index;
-    status = _coreCmdProxy_send_command(AUICMD_GET_NETSPEED, &req, sizeof(req));
-    if (status < 0) {
-        return status;
-    }
-
-    // Obtain the response from the core.
-    status = _coreCmdProxy_get_response(&resp, (void**)&resp_data);
-    if (status < 0) {
-        return status;
-    }
-    if (!resp.result) {
-        NetworkSpeed* ret;
-        // Allocate memory for the returning NetworkSpeed instance.
-        // It includes: NetworkSpeed structure +
-        // size of zero-terminated "name" and "display" strings saved in
-        // resp_data.
-        *netspeed = malloc(sizeof(NetworkSpeed) + 1 +
-                           resp.resp_data_size - sizeof(UICmdGetNetSpeedResp));
-        ret = *netspeed;
-
-        // Copy data obtained from the core to the returning NetworkSpeed
-        // instance.
-        ret->upload = resp_data->upload;
-        ret->download = resp_data->download;
-        ret->name = (char*)ret + sizeof(NetworkSpeed);
-        strcpy((char*)ret->name, resp_data->name);
-        ret->display = ret->name + strlen(ret->name) + 1;
-        strcpy((char*)ret->display, resp_data->name + strlen(resp_data->name) + 1);
-    }
-    if (resp_data != NULL) {
-        free(resp_data);
-    }
-    return resp.result;
-}
-
-int
-corecmd_get_netdelay(int index, NetworkLatency** netdelay)
-{
-    UICmdGetNetDelay req;
-    UICmdRespHeader resp;
-    UICmdGetNetDelayResp* resp_data = NULL;
-    int status;
-
-    // Initialize and send the query.
-    req.index = index;
-    status = _coreCmdProxy_send_command(AUICMD_GET_NETDELAY, &req, sizeof(req));
-    if (status < 0) {
-        return status;
-    }
-
-    // Obtain the response from the core.
-    status = _coreCmdProxy_get_response(&resp, (void**)&resp_data);
-    if (status < 0) {
-        return status;
-    }
-    if (!resp.result) {
-        NetworkLatency* ret;
-        // Allocate memory for the returning NetworkLatency instance.
-        // It includes: NetworkLatency structure +
-        // size of zero-terminated "name" and "display" strings saved in
-        // resp_data.
-        *netdelay = malloc(sizeof(NetworkLatency) + 1 +
-                           resp.resp_data_size - sizeof(UICmdGetNetDelayResp));
-        ret = *netdelay;
-
-        // Copy data obtained from the core to the returning NetworkLatency
-        // instance.
-        ret->min_ms = resp_data->min_ms;
-        ret->max_ms = resp_data->max_ms;
-        ret->name = (char*)ret + sizeof(NetworkLatency);
-        strcpy((char*)ret->name, resp_data->name);
-        ret->display = ret->name + strlen(ret->name) + 1;
-        strcpy((char*)ret->display, resp_data->name + strlen(resp_data->name) + 1);
-    }
-    if (resp_data != NULL) {
-        free(resp_data);
-    }
-    return resp.result;
-}
-
-int
-corecmd_get_qemu_path(int type,
-                      const char* filename,
-                      char* path,
-                      size_t path_buf_size)
-{
-    UICmdRespHeader resp;
-    char* resp_data = NULL;
-    int status;
-
-    // Initialize and send the query.
-    uint32_t cmd_data_size = sizeof(UICmdGetQemuPath) + strlen(filename) + 1;
-    UICmdGetQemuPath* req = (UICmdGetQemuPath*)malloc(cmd_data_size);
-    if (req == NULL) {
-        APANIC("corecmd_get_qemu_path is unable to allocate %u bytes\n",
-               cmd_data_size);
-    }
-    req->type = type;
-    strcpy(req->filename, filename);
-    status = _coreCmdProxy_send_command(AUICMD_GET_QEMU_PATH, req,
-                                        cmd_data_size);
-    if (status < 0) {
-        return status;
-    }
-
-    // Obtain the response from the core.
-    status = _coreCmdProxy_get_response(&resp, (void**)&resp_data);
-    if (status < 0) {
-        return status;
-    }
-    if (!resp.result && resp_data != NULL) {
-        strncpy(path, resp_data, path_buf_size);
-        path[path_buf_size - 1] = '\0';
-    }
-    if (resp_data != NULL) {
-        free(resp_data);
-    }
-    return resp.result;
-}
-
-int
-corecmd_get_hw_lcd_density(void)
-{
-    UICmdRespHeader resp;
-    void* tmp = NULL;
-    int status;
-
-    status = _coreCmdProxy_send_command(AUICMD_GET_LCD_DENSITY, NULL, 0);
-    if (status < 0) {
-        return status;
-    }
-    status = _coreCmdProxy_get_response(&resp, &tmp);
-    if (status < 0) {
-        return status;
-    }
-    return resp.result;
-}
-
-int
-coreCmdProxy_create(SockAddress* console_socket)
-{
-    char* handshake = NULL;
-
-    // Connect to the ui-core-control service.
-    _coreCmdProxy.core_connection =
-        core_connection_create_and_switch(console_socket, "ui-core-control",
-                                          &handshake);
-    if (_coreCmdProxy.core_connection == NULL) {
-        derror("Unable to connect to the ui-core-control service: %s\n",
-               errno_str);
-        return -1;
-    }
-
-    // Initialze command writer and response reader.
-    _coreCmdProxy.sock = core_connection_get_socket(_coreCmdProxy.core_connection);
-    _coreCmdProxy.sync_writer = syncsocket_init(_coreCmdProxy.sock);
-    if (_coreCmdProxy.sync_writer == NULL) {
-        derror("Unable to initialize CoreCmdProxy writer: %s\n", errno_str);
-        coreCmdProxy_destroy();
-        return -1;
-    }
-    _coreCmdProxy.sync_reader = syncsocket_init(_coreCmdProxy.sock);
-    if (_coreCmdProxy.sync_reader == NULL) {
-        derror("Unable to initialize CoreCmdProxy reader: %s\n", errno_str);
-        coreCmdProxy_destroy();
-        return -1;
-    }
-
-
-    fprintf(stdout, "ui-core-control is now connected to the core at %s.",
-            sock_address_to_string(console_socket));
-    if (handshake != NULL) {
-        if (handshake[0] != '\0') {
-            fprintf(stdout, " Handshake: %s", handshake);
-        }
-        free(handshake);
-    }
-    fprintf(stdout, "\n");
-
-    return 0;
-}
-
-/* Destroys CoreCmdProxy instance. */
-void
-coreCmdProxy_destroy(void)
-{
-    if (_coreCmdProxy.sync_writer != NULL) {
-        syncsocket_close(_coreCmdProxy.sync_writer);
-        syncsocket_free(_coreCmdProxy.sync_writer);
-        _coreCmdProxy.sync_writer = NULL;
-    }
-    if (_coreCmdProxy.sync_reader != NULL) {
-        syncsocket_close(_coreCmdProxy.sync_reader);
-        syncsocket_free(_coreCmdProxy.sync_reader);
-        _coreCmdProxy.sync_reader = NULL;
-    }
-    if (_coreCmdProxy.core_connection != NULL) {
-        core_connection_close(_coreCmdProxy.core_connection);
-        core_connection_free(_coreCmdProxy.core_connection);
-        _coreCmdProxy.core_connection = NULL;
-    }
-}
diff --git a/android/protocol/core-commands-proxy.h b/android/protocol/core-commands-proxy.h
deleted file mode 100644
index 289421f..0000000
--- a/android/protocol/core-commands-proxy.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-** GNU General Public License for more details.
-*/
-
-#ifndef _ANDROID_PROTOCOL_CORE_COMMANDS_PROXY_H
-#define _ANDROID_PROTOCOL_CORE_COMMANDS_PROXY_H
-
-#include "android/sockets.h"
-
-/*
- * Contains the UI-side implementation of the "ui-core-control" service that is
- * part of the UI control protocol. Here we send UI control commands to the Core.
- */
-
-/* Creates and initializes descriptor for the UI-side of the "ui-core-control"
- * service. Note that there can be only one instance of this service in the UI.
- * Param:
- *  console_socket - Addresses Core's console.
- * Return:
- *  0 on success, or < 0 on failure.
- */
-extern int coreCmdProxy_create(SockAddress* console_socket);
-
-/* Destroys the UI-side of the "ui-core-control" */
-void coreCmdProxy_destroy(void);
-
-#endif /* _ANDROID_PROTOCOL_CORE_COMMANDS_PROXY_H */
diff --git a/android/protocol/core-commands-qemu.c b/android/protocol/core-commands-qemu.c
deleted file mode 100644
index d26840c..0000000
--- a/android/protocol/core-commands-qemu.c
+++ /dev/null
@@ -1,102 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-** GNU General Public License for more details.
-*/
-
-/*
- * Contains implementation of the API for calling into the Core with the UI
- * control commands for standalone (monolithic) emulator.
- */
-
-#include "android/android.h"
-#include "android/globals.h"
-#include "android/hw-sensors.h"
-#include "telephony/modem_driver.h"
-#include "audio/audio.h"
-#include "android/protocol/core-commands-api.h"
-
-/* Implemented in vl-android.c */
-extern char* qemu_find_file(int type, const char* filename);
-
-int
-corecmd_set_coarse_orientation(AndroidCoarseOrientation orient)
-{
-    android_sensors_set_coarse_orientation(orient);
-    return 0;
-}
-
-int
-corecmd_toggle_network()
-{
-    qemu_net_disable = !qemu_net_disable;
-    if (android_modem) {
-        amodem_set_data_registration(
-                android_modem,
-        qemu_net_disable ? A_REGISTRATION_UNREGISTERED
-            : A_REGISTRATION_HOME);
-    }
-    return 0;
-}
-
-int corecmd_trace_control(int start)
-{
-    return 0;
-}
-
-int corecmd_is_network_disabled()
-{
-    return qemu_net_disable;
-}
-
-int
-corecmd_get_netspeed(int index, NetworkSpeed** netspeed)
-{
-    if (index >= android_netspeeds_count ||
-        android_netspeeds[index].name == NULL) {
-        return -1;
-    }
-    *netspeed = (NetworkSpeed*)malloc(sizeof(NetworkSpeed));
-    memcpy(*netspeed, &android_netspeeds[index], sizeof(NetworkSpeed));
-    return 0;
-}
-
-int
-corecmd_get_netdelay(int index, NetworkLatency** netdelay)
-{
-    if (index >= android_netdelays_count ||
-        android_netdelays[index].name == NULL) {
-        return -1;
-    }
-    *netdelay = (NetworkLatency*)malloc(sizeof(NetworkLatency));
-    memcpy(*netdelay, &android_netdelays[index], sizeof(NetworkLatency));
-    return 0;
-}
-
-int
-corecmd_get_qemu_path(int type,
-                      const char* filename,
-                      char* path,
-                      size_t path_buf_size)
-{
-    char* filepath = qemu_find_file(type, filename);
-    if (filepath == NULL) {
-        return -1;
-    }
-    strncpy(path, filepath, path_buf_size);
-    path[path_buf_size - 1] = '\0';
-    g_free(filepath);
-    return 0;
-}
-
-int
-corecmd_get_hw_lcd_density(void)
-{
-    return android_hw->hw_lcd_density;
-}
diff --git a/android/protocol/core-commands.h b/android/protocol/core-commands.h
deleted file mode 100644
index 3ac0ca5..0000000
--- a/android/protocol/core-commands.h
+++ /dev/null
@@ -1,104 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-** GNU General Public License for more details.
-*/
-
-#ifndef _ANDROID_PROTOCOL_CORE_COMMANDS_H
-#define _ANDROID_PROTOCOL_CORE_COMMANDS_H
-
-/*
- * Contains declarations related to the UI control commands sent by the UI and
- * handled by the Core.
- */
-
-#include "android/hw-sensors.h"
-#include "android/protocol/ui-common.h"
-
-/* Sets coarse orientation. */
-#define AUICMD_SET_COARSE_ORIENTATION       1
-
-/* Toggles the network. */
-#define AUICMD_TOGGLE_NETWORK               2
-
-/* Starts / stops the tracing. */
-#define AUICMD_TRACE_CONTROL                3
-
-/* Checks if network is disabled. */
-#define AUICMD_CHK_NETWORK_DISABLED         4
-
-/* Gets network speed. */
-#define AUICMD_GET_NETSPEED                 5
-
-/* Gets network delays */
-#define AUICMD_GET_NETDELAY                 6
-
-/* Gets path to a QEMU file on local host. */
-#define AUICMD_GET_QEMU_PATH                7
-
-/* Gets LCD density. */
-#define AUICMD_GET_LCD_DENSITY              8
-
-/* Formats AUICMD_SET_COARSE_ORIENTATION UI control command parameters. */
-typedef struct UICmdSetCoarseOrientation {
-    AndroidCoarseOrientation    orient;
-} UICmdSetCoarseOrientation;
-
-/* Formats AUICMD_TRACE_CONTROL UI control command parameters. */
-typedef struct UICmdTraceControl {
-    int start;
-} UICmdTraceControl;
-
-/* Formats AUICMD_GET_NETSPEED UI control command parameters. */
-typedef struct UICmdGetNetSpeed {
-    int index;
-} UICmdGetNetSpeed;
-
-/* Formats AUICMD_GET_NETSPEED UI control command response.
- * Instances of this structure contains content of the NetworkSpeed structure,
- * including actual "name" and "display" strings. */
-typedef struct UICmdGetNetSpeedResp {
-    int     upload;
-    int     download;
-    /* Zero-terminated NetworkSpeed's "name" strings starts here. The "display"
-     * string begins inside this structure, right after the "name"'s
-     * zero-terminator. */
-    char    name[0];
-} UICmdGetNetSpeedResp;
-
-/* Formats AUICMD_GET_NETDELAY UI control command parameters. */
-typedef struct UICmdGetNetDelay {
-    int index;
-} UICmdGetNetDelay;
-
-/* Formats AUICMD_GET_NETDELAY UI control command response.
- * Instances of this structure contains content of the NetworkLatency structure,
- * including actual "name" and "display" strings. */
-typedef struct UICmdGetNetDelayResp {
-    int     min_ms;
-    int     max_ms;
-    /* Zero-terminated NetworkLatency's "name" strings starts here. The "display"
-     * string begins inside this structure, right after the "name"'s
-     * zero-terminator. */
-    char    name[0];
-} UICmdGetNetDelayResp;
-
-/* Formats AUICMD_GET_QEMU_PATH UI control command parameters. */
-typedef struct UICmdGetQemuPath {
-    int     type;
-    char    filename[0];
-} UICmdGetQemuPath;
-
-/* Formats AUICMD_GET_QEMU_PATH UI control command response. */
-typedef struct UICmdGetQemuPathResp {
-    /* Queried qemu path begins here. */
-    char    path[0];
-} UICmdGetQemuPathResp;
-
-#endif /* _ANDROID_PROTOCOL_CORE_COMMANDS_H */
diff --git a/android/protocol/core-connection.c b/android/protocol/core-connection.c
deleted file mode 100644
index 68831d4..0000000
--- a/android/protocol/core-connection.c
+++ /dev/null
@@ -1,363 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-** GNU General Public License for more details.
-*/
-
-#include <unistd.h>
-
-#include "android/sockets.h"
-#include "qemu-common.h"
-#include "errno.h"
-#include "android/iolooper.h"
-#include "android/android.h"
-#include "android/utils/debug.h"
-#include "android/globals.h"
-#include "android/utils/system.h"
-#include "android/protocol/core-connection.h"
-
-/* Descriptor for a client, connected to the core via console port. */
-struct CoreConnection {
-    /* Socket address of the console. */
-    SockAddress console_address;
-
-    // Helper for performing sync I/O on the console socket.
-    SyncSocket* ssocket;
-
-    /* Stream name. Can be:
-     *  - NULL for the console itself.
-     *  - "attach-UI" for the attached UI client.
-     */
-    char* stream_name;
-};
-
-/*
- * Zero-terminates string buffer.
- * Param:
- *  buf - Buffer containing the string.
- *  buf_size - Buffer size.
- *  eos - String size.
- */
-static inline void
-_zero_terminate(char* buf, size_t buf_size, size_t eos)
-{
-    if (eos < buf_size) {
-        buf[eos] = '\0';
-    } else {
-        buf[buf_size - 1] = '\0';
-    }
-}
-
-/*
- * Checks if console has replied with "OK"
- * Param:
- *  reply - String containing console's reply
- * Return:
- *  boolean: true if reply was "OK", or false otherwise.
- */
-static int
-_is_reply_ok(const char* reply, int reply_size)
-{
-    return (reply_size < 2) ? 0 : (reply[0] == 'O' && reply[1] == 'K');
-}
-
-/*
- * Checks if console has replied with "KO"
- * Param:
- *  reply - String containing console's reply
- * Return:
- *  boolean: true if reply was "KO", or false otherwise.
- */
-static int
-_is_reply_ko(const char* reply, int reply_size)
-{
-    return (reply_size < 2) ? 0 : (reply[0] == 'K' && reply[1] == 'O');
-}
-
-SyncSocket*
-core_connection_open_socket(SockAddress* sockaddr)
-{
-    SyncSocket* ssocket;
-    int status;
-    int64_t deadline;
-    char buf[512];
-
-    int fd = socket_create(sock_address_get_family(sockaddr), SOCKET_STREAM);
-    if (fd < 0) {
-        return NULL;
-    }
-
-    socket_set_xreuseaddr(fd);
-
-    // Create sync connection to the console.
-    ssocket = syncsocket_connect(fd, sockaddr, CORE_PORT_TIMEOUT_MS);
-    if (ssocket == NULL) {
-        derror("syncsocket_connect has failed: %s\n", errno_str);
-        socket_close(fd);
-        return NULL;
-    }
-
-    // Upon successful connection the console will reply with two strings:
-    // "Android Console....", and "OK\r\n". Read them and check.
-    status = syncsocket_start_read(ssocket);
-    if (status < 0) {
-        derror("syncsocket_start_read has failed: %s\n", errno_str);
-        syncsocket_free(ssocket);
-        return NULL;
-    }
-
-    deadline = iolooper_now() + CORE_PORT_TIMEOUT_MS;
-    // Read first line.
-    status = syncsocket_read_line_absolute(ssocket, buf, sizeof(buf), deadline);
-    if (status <= 0) {
-        derror("syncsocket_read_line_absolute has failed: %s\n", errno_str);
-        syncsocket_free(ssocket);
-        return NULL;
-    }
-    if (status < 15 || memcmp(buf, "Android Console", 15)) {
-        _zero_terminate(buf, sizeof(buf), status);
-        derror("console has failed the connection: %s\n", buf);
-        syncsocket_free(ssocket);
-        return NULL;
-    }
-    // Read second line
-    status = syncsocket_read_line_absolute(ssocket, buf, sizeof(buf), deadline);
-    syncsocket_stop_read(ssocket);
-    if (status < 2 || !_is_reply_ok(buf, status)) {
-        _zero_terminate(buf, sizeof(buf), status);
-        derror("unexpected reply from the console: %s\n", buf);
-        syncsocket_free(ssocket);
-        return NULL;
-    }
-
-    return ssocket;
-}
-
-CoreConnection*
-core_connection_create(SockAddress* console_address)
-{
-    CoreConnection* desc;
-    ANEW0(desc);
-    desc->console_address = console_address[0];
-    desc->ssocket = NULL;
-    desc->stream_name = NULL;
-
-    return desc;
-}
-
-void
-core_connection_free(CoreConnection* desc)
-{
-    if (desc == NULL) {
-        return;
-    }
-    if (desc->ssocket != NULL) {
-        syncsocket_free(desc->ssocket);
-    }
-    if (desc->stream_name != NULL) {
-        free(desc->stream_name);
-    }
-    free(desc);
-}
-
-int
-core_connection_open(CoreConnection* desc)
-{
-    if (desc == NULL) {
-        errno = EINVAL;
-        return -1;
-    }
-    if (desc->ssocket != NULL) {
-        return 0;
-    }
-
-    desc->ssocket = core_connection_open_socket(&desc->console_address);
-
-    return (desc->ssocket != NULL) ? 0 : -1;
-}
-
-void
-core_connection_close(CoreConnection* desc)
-{
-    if (desc == NULL) {
-        return;
-    }
-    if (desc->ssocket != NULL) {
-        syncsocket_close(desc->ssocket);
-    }
-}
-
-int
-core_connection_write(CoreConnection* desc,
-                      const void* buffer,
-                      size_t to_write,
-                      size_t* written_bytes)
-{
-    ssize_t written;
-
-    int status = syncsocket_start_write(desc->ssocket);
-    if (status < 0) {
-        derror("syncsocket_start_write failed: %s\n", errno_str);
-        return status;
-    }
-
-    written =
-        syncsocket_write(desc->ssocket, buffer, to_write, CORE_PORT_TIMEOUT_MS);
-    syncsocket_stop_write(desc->ssocket);
-    if (written <= 0) {
-        derror("syncsocket_write failed: %s\n", errno_str);
-        return -1;
-    }
-    if (written_bytes != NULL) {
-        *written_bytes = written;
-    }
-
-    return 0;
-}
-
-int
-core_connection_read(CoreConnection* desc,
-                     void* buffer,
-                     size_t to_read,
-                     size_t* read_bytes)
-{
-    ssize_t read_size;
-
-    int status = syncsocket_start_read(desc->ssocket);
-    if (status < 0) {
-        derror("syncsocket_start_read failed: %s\n", errno_str);
-        return status;
-    }
-
-    read_size =
-        syncsocket_read(desc->ssocket, buffer, to_read, CORE_PORT_TIMEOUT_MS);
-    syncsocket_stop_read(desc->ssocket);
-    if (read_size <= 0) {
-        derror("syncsocket_read failed: %s\n", errno_str);
-        return -1;
-    }
-
-    if (read_bytes != NULL) {
-        *read_bytes = read_size;
-    }
-    return 0;
-}
-
-int
-core_connection_switch_stream(CoreConnection* desc,
-                              const char* stream_name,
-                              char** handshake)
-{
-    char buf[4096];
-    int handshake_len;
-    int status;
-    int64_t deadline;
-
-    *handshake = NULL;
-    if (desc == NULL || desc->stream_name != NULL || stream_name == NULL) {
-        errno = EINVAL;
-        return -1;
-    }
-
-    // Prepare and write "switch" command.
-    snprintf(buf, sizeof(buf), "qemu %s\r\n", stream_name);
-    if (core_connection_write(desc, buf, strlen(buf), NULL)) {
-        return -1;
-    }
-
-    // Read result / handshake
-    status = syncsocket_start_read(desc->ssocket);
-    if (status < 0) {
-        return -1;
-    }
-    deadline = iolooper_now() + CORE_PORT_TIMEOUT_MS;
-    handshake_len =
-        syncsocket_read_line_absolute(desc->ssocket, buf, sizeof(buf), deadline);
-    _zero_terminate(buf, sizeof(buf), handshake_len);
-    // Replace terminating "\r\n" with 0
-    if (handshake_len >= 1) {
-        if (buf[handshake_len - 1] == '\r' || buf[handshake_len - 1] == '\n') {
-            buf[handshake_len - 1] = '\0';
-            if (handshake_len >= 2 && (buf[handshake_len - 2] == '\r' ||
-                                       buf[handshake_len - 2] == '\n')) {
-                buf[handshake_len - 2] = '\0';
-            }
-        }
-    }
-    // Lets see what kind of response we've got here.
-    if (_is_reply_ok(buf, handshake_len)) {
-        *handshake = strdup(buf + 3);
-        desc->stream_name = strdup(stream_name);
-        // We expect an "OK" string here
-        status = syncsocket_read_line_absolute(desc->ssocket, buf, sizeof(buf),
-                                               deadline);
-        syncsocket_stop_read(desc->ssocket);
-        if (status < 0) {
-            derror("error reading console reply on stream switch: %s\n", errno_str);
-            return -1;
-        } else if (!_is_reply_ok(buf, status)) {
-            _zero_terminate(buf, sizeof(buf), status);
-            derror("unexpected console reply when switching streams: %s\n", buf);
-            return -1;
-        }
-        return 0;
-    } else if (_is_reply_ko(buf, handshake_len)) {
-        derror("console has rejected stream switch: %s\n", buf);
-        syncsocket_stop_read(desc->ssocket);
-        *handshake = strdup(buf + 3);
-        return -1;
-    } else {
-        // No OK, no KO? Should be an error!
-        derror("unexpected console reply when switching streams: %s\n", buf);
-        syncsocket_stop_read(desc->ssocket);
-        *handshake = strdup(buf);
-        return -1;
-    }
-}
-
-CoreConnection*
-core_connection_create_and_switch(SockAddress* console_socket,
-                                  const char* stream_name,
-                                  char** handshake)
-{
-    char switch_cmd[256];
-    CoreConnection* connection = NULL;
-
-    // Connect to the console service.
-    connection = core_connection_create(console_socket);
-    if (connection == NULL) {
-        return NULL;
-    }
-    if (core_connection_open(connection)) {
-        core_connection_free(connection);
-        return NULL;
-    }
-
-    // Perform the switch.
-    snprintf(switch_cmd, sizeof(switch_cmd), "%s", stream_name);
-    if (core_connection_switch_stream(connection, switch_cmd, handshake)) {
-        core_connection_close(connection);
-        core_connection_free(connection);
-        return NULL;
-    }
-
-    return connection;
-}
-
-void
-core_connection_detach(CoreConnection* desc)
-{
-    core_connection_write(desc, "\n", 1, NULL);
-}
-
-int
-core_connection_get_socket(CoreConnection* desc)
-{
-    return (desc != NULL) ? syncsocket_get_socket(desc->ssocket) : -1;
-}
diff --git a/android/protocol/core-connection.h b/android/protocol/core-connection.h
deleted file mode 100644
index 5701f8c..0000000
--- a/android/protocol/core-connection.h
+++ /dev/null
@@ -1,169 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-** GNU General Public License for more details.
-*/
-
-/*
- * This file contains declaration related to communication between emulator's
- * UI and core through a console port.
- */
-
-#ifndef QEMU_ANDROID_CORE_CONNECTION_H
-#define QEMU_ANDROID_CORE_CONNECTION_H
-
-#include "android/sync-utils.h"
-
-// Opaque CoreConnection structure.
-typedef struct CoreConnection CoreConnection;
-
-// Base console port
-#define CORE_BASE_PORT          5554
-
-// Maximum number of core porocesses running simultaneously on a machine.
-#define MAX_CORE_PROCS          16
-
-// Socket timeout in millisec (set to 5 seconds)
-#define CORE_PORT_TIMEOUT_MS    5000
-
-/* Opens core console socket.
- * Param:
- *  sockaddr Socket address to the core console.
- * Return:
- *  Sync socket descriptor on success, or -1 on failure, with errno appropriately
- *  set.
- */
-SyncSocket* core_connection_open_socket(SockAddress* sockaddr);
-
-/* Creates descriptor for a console client.
- * Param:
- *  console_socket Socket address for the console.
- * Return:
- *  Allocated and initialized descriptor for the client on success, or NULL
- *  on failure.
- */
-CoreConnection* core_connection_create(SockAddress* console_socket);
-
-/* Frees descriptor allocated with core_connection_create.
- * Param:
- *  desc Descriptor to free. Note that this routine will simply free the memory
- *      used by the descriptor.
- */
-void core_connection_free(CoreConnection* desc);
-
-/* Opens a socket handle to the console.
- * Param:
- *  desc Console client descriptor. Note that if the descriptor has been already
- *      opened, this routine will simply return with success.
- * Return:
- *  0 on success, or -1 on failure with errno properly set. This routine will
- *      return in at most one second.
- */
-int core_connection_open(CoreConnection* desc);
-
-/* Closes a socket handle to the console opened with core_connection_open.
- * Param:
- *  desc Console client descriptor opened with core_connection_open.
- */
-void core_connection_close(CoreConnection* desc);
-
-/* Synchronously writes to the console. See CORE_PORT_TIMEOUT_MS for the timeout
- * value used to wait for the write operation to complete.
- * Param:
- *  desc Console client descriptor opened with core_connection_open.
- *      buffer Buffer to write.
- *  to_write Number of bytes to write.
- *  written_bytes Upon success, contains number of bytes written. This parameter
- *      is optional, and can be NULL.
- * Return:
- *  0 on success, or -1 on failure.
- */
-int core_connection_write(CoreConnection* desc,
-                          const void* buffer,
-                          size_t to_write,
-                          size_t* written_bytes);
-
-/* Synchronously reads from the console. See CORE_PORT_TIMEOUT_MS for the
- * timeout value used to wait for the read operation to complete.
- * Param:
- *  desc Console client descriptor opened with core_connection_open.
- *  buffer Buffer to read data to.
- *  to_read Number of bytes to read.
- *  read_bytes Upon success, contains number of bytes that have been actually
- *    read. This parameter is optional, and can be NULL.
- * Return:
- *  0 on success, or -1 on failure.
- */
-int core_connection_read(CoreConnection* desc,
-                         void* buffer,
-                         size_t to_read,
-                         size_t* read_bytes);
-
-/* Switches opened console client to a given stream.
- * Param:
- *  desc Console client descriptor opened with core_connection_open. Note
- *      that this descriptor should represent console itself. In other words,
- *      there must have been no previous calls to this routine for that
- *      descriptor.
- *  stream_name Name of the stream to switch to.
- *  handshake Address of a string to allocate for a handshake message on
- *      success, or an error message on failure. If upon return from this
- *      routine that string is not NULL, its buffer must be freed with 'free'.
- * Return:
- *  0 on success, or -1 on failure.
- */
-int core_connection_switch_stream(CoreConnection* desc,
-                                  const char* stream_name,
-                                  char** handshake);
-
-/* Creates a console client, and switches it to a given stream.
- *  console_socket Socket address for the console.
- *  stream_name Name of the stream to switch to.
- *  handshake Address of a string to allocate for a handshake message on
- *      success, or an error message on failure. If upon return from this
- *      routine that string is not NULL, its buffer must be freed with 'free'.
- * Return:
- *  Allocated and initialized descriptor for the switched client on success, or
- *  NULL on failure.
- */
-CoreConnection* core_connection_create_and_switch(SockAddress* console_socket,
-                                                  const char* stream_name,
-                                                  char** handshake);
-
-/* Detaches opened console client from the console.
- * By console protocol, writing "\r\n" string to the console will destroy the
- * console client.
- * Param:
- *  desc Console client descriptor opened with core_connection_open.
- */
-void core_connection_detach(CoreConnection* desc);
-
-/* Gets socket descriptor associated with the core connection.
- * Param:
- *  desc Console client descriptor opened with core_connection_open.
- * Return
- *  Socket descriptor associated with the core connection.
- */
-int core_connection_get_socket(CoreConnection* desc);
-
-/* Calculates timeout for transferring the given number of bytes via core
- * connection.
- * Return:
- *  Number of milliseconds during which the entire number of bytes is expected
- *  to be transferred via core connection.
- */
-static inline int
-core_connection_get_timeout(size_t data_size)
-{
-    // Min 2 seconds + 10 millisec for each transferring byte.
-    // TODO: Come up with a better arithmetics here.
-    return 2000 + data_size * 10;
-}
-
-#endif  // QEMU_ANDROID_CORE_CONNECTION_H
diff --git a/android/protocol/fb-updates-impl.c b/android/protocol/fb-updates-impl.c
deleted file mode 100644
index e36c4bf..0000000
--- a/android/protocol/fb-updates-impl.c
+++ /dev/null
@@ -1,271 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-** GNU General Public License for more details.
-*/
-
-/*
- * Contains UI-side framebuffer client that receives framebuffer updates
- * from the core.
- */
-
-#include "android/utils/system.h"
-#include "android/utils/debug.h"
-#include "android/utils/eintr_wrapper.h"
-#include "android/utils/panic.h"
-#include "android/sync-utils.h"
-#include "android/protocol/core-connection.h"
-#include "android/protocol/fb-updates.h"
-#include "android/protocol/fb-updates-impl.h"
-
-/*Enumerates states for the client framebuffer update reader. */
-typedef enum FbImplState {
-    /* The reader is waiting on update header. */
-    EXPECTS_HEADER,
-
-    /* The reader is waiting on pixels. */
-    EXPECTS_PIXELS,
-} FbImplState;
-
-/* Descriptor for the UI-side implementation of the "framebufer" service.
- */
-typedef struct FrameBufferImpl {
-    /* Framebuffer for this client. */
-    QFrameBuffer*   fb;
-
-    /* Core connection instance for the framebuffer client. */
-    CoreConnection* core_connection;
-
-    /* Current update header. */
-    FBUpdateMessage update_header;
-
-    /* Reader's buffer. */
-    uint8_t*        reader_buffer;
-
-    /* Offset in the reader's buffer where to read next chunk of data. */
-    size_t          reader_offset;
-
-    /* Total number of bytes the reader expects to read. */
-    size_t          reader_bytes;
-
-    /* Current state of the update reader. */
-    FbImplState     fb_state;
-
-    /* Socket descriptor for the framebuffer client. */
-    int             sock;
-
-    /* Custom i/o handler */
-    LoopIo          io[1];
-
-    /* Number of bits used to encode single pixel. */
-    int             bits_per_pixel;
-} FrameBufferImpl;
-
-/* One and the only FrameBufferImpl instance. */
-static FrameBufferImpl _fbImpl;
-
-/*
- * Updates a display rectangle.
- * Param
- *  fb - Framebuffer where to update the rectangle.
- *  x, y, w, and h define rectangle to update.
- *  bits_per_pixel define number of bits used to encode a single pixel.
- *  pixels contains pixels for the rectangle. Buffer addressed by this parameter
- *      must be eventually freed with free()
- */
-static void
-_update_rect(QFrameBuffer* fb, uint16_t x, uint16_t y, uint16_t w, uint16_t h,
-             uint8_t bits_per_pixel, uint8_t* pixels)
-{
-    if (fb != NULL) {
-        uint16_t n;
-        const uint8_t* src = pixels;
-        const uint16_t src_line_size = w * ((bits_per_pixel + 7) / 8);
-        uint8_t* dst  = (uint8_t*)fb->pixels + y * fb->pitch + x *
-                        fb->bytes_per_pixel;
-        for (n = 0; n < h; n++) {
-            memcpy(dst, src, src_line_size);
-            src += src_line_size;
-            dst += fb->pitch;
-        }
-        qframebuffer_update(fb, x, y, w, h);
-    }
-    free(pixels);
-}
-
-/*
- * Asynchronous I/O callback launched when framebuffer notifications are ready
- * to be read.
- * Param:
- *  opaque - FrameBufferImpl instance.
- */
-static void
-_fbUpdatesImpl_io_callback(void* opaque, int fd, unsigned events)
-{
-    FrameBufferImpl* fbi = opaque;
-    int  ret;
-
-    // Read updates while they are immediately available.
-    for (;;) {
-        // Read next chunk of data.
-        ret = HANDLE_EINTR(
-                socket_recv(fbi->sock,
-                            fbi->reader_buffer + fbi->reader_offset,
-                            fbi->reader_bytes - fbi->reader_offset));
-        if (ret < 0 && (errno == EWOULDBLOCK || errno == EAGAIN)) {
-            // Chunk is not avalable at this point. Come back later.
-            return;
-        }
-        if (ret <= 0) {
-            /* disconnection ! */
-            derror("Unable to receive framebuffer data: %s\n",
-                   ret < 0 ? strerror(errno), "unexpected disconnection");
-            fbUpdatesImpl_destroy();
-            return;
-        }
-
-        fbi->reader_offset += ret;
-        if (fbi->reader_offset != fbi->reader_bytes) {
-            // There are still some data left in the pipe.
-            continue;
-        }
-
-        // All expected data has been read. Time to change the state.
-        if (fbi->fb_state == EXPECTS_HEADER) {
-            // Update header has been read. Prepare for the pixels.
-            fbi->fb_state = EXPECTS_PIXELS;
-            fbi->reader_offset = 0;
-            fbi->reader_bytes = fbi->update_header.w *
-                                      fbi->update_header.h *
-                                      (fbi->bits_per_pixel / 8);
-            fbi->reader_buffer = malloc(fbi->reader_bytes);
-            if (fbi->reader_buffer == NULL) {
-                APANIC("Unable to allocate memory for framebuffer update\n");
-            }
-        } else {
-            // Pixels have been read. Prepare for the header.
-             uint8_t* pixels = fbi->reader_buffer;
-
-            fbi->fb_state = EXPECTS_HEADER;
-            fbi->reader_offset = 0;
-            fbi->reader_bytes = sizeof(FBUpdateMessage);
-            fbi->reader_buffer = (uint8_t*)&fbi->update_header;
-
-            // Perform the update. Note that pixels buffer must be freed there.
-            _update_rect(fbi->fb, fbi->update_header.x,
-                        fbi->update_header.y, fbi->update_header.w,
-                        fbi->update_header.h, fbi->bits_per_pixel,
-                        pixels);
-        }
-    }
-}
-
-int
-fbUpdatesImpl_create(SockAddress* console_socket,
-              const char* protocol,
-              QFrameBuffer* fb,
-              Looper* looper)
-{
-    FrameBufferImpl* fbi = &_fbImpl;
-    char* handshake = NULL;
-    char switch_cmd[256];
-
-    // Initialize descriptor.
-    fbi->fb = fb;
-    fbi->reader_buffer = (uint8_t*)&fbi->update_header;
-    fbi->reader_offset = 0;
-    fbi->reader_bytes = sizeof(FBUpdateMessage);
-
-    // Connect to the framebuffer service.
-    snprintf(switch_cmd, sizeof(switch_cmd), "framebuffer %s", protocol);
-    fbi->core_connection =
-        core_connection_create_and_switch(console_socket, switch_cmd, &handshake);
-    if (fbi->core_connection == NULL) {
-        derror("Unable to connect to the framebuffer service: %s\n",
-               errno_str);
-        return -1;
-    }
-
-    // We expect core framebuffer to return us bits per pixel property in
-    // the handshake message.
-    fbi->bits_per_pixel = 0;
-    if (handshake != NULL) {
-        char* bpp = strstr(handshake, "bitsperpixel=");
-        if (bpp != NULL) {
-            char* end;
-            bpp += strlen("bitsperpixel=");
-            end = strchr(bpp, ' ');
-            if (end == NULL) {
-                end = bpp + strlen(bpp);
-            }
-            fbi->bits_per_pixel = strtol(bpp, &end, 0);
-        }
-    }
-    if (!fbi->bits_per_pixel) {
-        derror("Unexpected core framebuffer reply: %s\n"
-               "Bits per pixel property is not there, or is invalid\n",
-               handshake);
-        fbUpdatesImpl_destroy();
-        return -1;
-    }
-
-    fbi->sock = core_connection_get_socket(fbi->core_connection);
-
-    // At last setup read callback, and start receiving the updates.
-    loopIo_init(fbi->io, looper, fbi->sock,
-                _fbUpdatesImpl_io_callback, &_fbImpl);
-    loopIo_wantRead(fbi->io);
-    {
-        // Force the core to send us entire framebuffer now, when we're prepared
-        // to receive it.
-        FBRequestHeader hd;
-        SyncSocket* sk = syncsocket_init(fbi->sock);
-
-        hd.request_type = AFB_REQUEST_REFRESH;
-        syncsocket_start_write(sk);
-        syncsocket_write(sk, &hd, sizeof(hd), 5000);
-        syncsocket_stop_write(sk);
-        syncsocket_free(sk);
-    }
-
-    fprintf(stdout, "framebuffer is now connected to the core at %s.",
-            sock_address_to_string(console_socket));
-    if (handshake != NULL) {
-        if (handshake[0] != '\0') {
-            fprintf(stdout, " Handshake: %s", handshake);
-        }
-        free(handshake);
-    }
-    fprintf(stdout, "\n");
-
-    return 0;
-}
-
-void
-fbUpdatesImpl_destroy(void)
-{
-    FrameBufferImpl* fbi = &_fbImpl;
-
-    if (fbi->core_connection != NULL) {
-        // Disable the reader callback.
-        loopIo_done(fbi->io);
-
-        // Close framebuffer connection.
-        core_connection_close(fbi->core_connection);
-        core_connection_free(fbi->core_connection);
-        fbi->core_connection = NULL;
-    }
-
-    fbi->fb = NULL;
-    if (fbi->reader_buffer != NULL &&
-        fbi->reader_buffer != (uint8_t*)&fbi->update_header) {
-        free(fbi->reader_buffer);
-        fbi->reader_buffer = (uint8_t*)&fbi->update_header;
-    }
-}
diff --git a/android/protocol/fb-updates-impl.h b/android/protocol/fb-updates-impl.h
deleted file mode 100644
index 56d4860..0000000
--- a/android/protocol/fb-updates-impl.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-** GNU General Public License for more details.
-*/
-
-/*
- * Contains UI-side "framebuffer" client that receives framebuffer updates
- * from the Core.
- */
-
-#ifndef _ANDROID_FRAMEBUFFER_UI_H
-#define _ANDROID_FRAMEBUFFER_UI_H
-
-#include "android/looper.h"
-#include "android/framebuffer.h"
-#include "android/looper.h"
-#include "android/async-utils.h"
-
-/* Creates framebuffer client, and connects it with the core.
- * Param:
- *  console_socket Address of the core's console socket.
- *  protocol Protocol to use for the updates:
- *      -raw Stream pixels over socket
- *      -shared Use shared memory for pixels.
- * fb - Framebuffer associated with this FB client.
- * Return:
- *  0 on success, or < 0 on failure.
- */
-int fbUpdatesImpl_create(SockAddress* console_socket,
-                         const char* protocol,
-                         QFrameBuffer* fb,
-                         Looper* looper);
-
-/* Disconnects and destroys framebuffer client. */
-void fbUpdatesImpl_destroy(void);
-
-#endif /* _ANDROID_FRAMEBUFFER_UI_H */
diff --git a/android/protocol/fb-updates-proxy.c b/android/protocol/fb-updates-proxy.c
deleted file mode 100644
index 10d1e71..0000000
--- a/android/protocol/fb-updates-proxy.c
+++ /dev/null
@@ -1,346 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-** GNU General Public License for more details.
-*/
-
-/*
- * Contains core-side framebuffer service that sends framebuffer updates
- * to the UI connected to the core.
- */
-
-#include "ui/console.h"
-#include "android/looper.h"
-#include "android/display-core.h"
-#include "android/async-utils.h"
-#include "android/protocol/fb-updates.h"
-#include "android/protocol/fb-updates-proxy.h"
-#include "android/utils/system.h"
-#include "android/utils/debug.h"
-
-/* Descriptor for the Core-side implementation of the "framebufer" service.
- */
-struct ProxyFramebuffer {
-    /* Writer used to send FB update notification messages. */
-    AsyncWriter             fb_update_writer;
-
-    /* Reader used to read FB requests from the client. */
-    AsyncReader             fb_req_reader;
-
-    /* I/O associated with this descriptor. */
-    LoopIo                  io;
-
-    /* Display state used for this service */
-    DisplayState*           ds;
-    DisplayUpdateListener*  ds_listener;
-
-    /* Looper used to communicate framebuffer updates. */
-    Looper* looper;
-
-    /* Head of the list of pending FB update notifications. */
-    struct FBUpdateNotify*  fb_update_head;
-
-    /* Tail of the list of pending FB update notifications. */
-    struct FBUpdateNotify*  fb_update_tail;
-
-    /* Socket used to communicate framebuffer updates. */
-    int     sock;
-
-    /* Framebuffer request header. */
-    FBRequestHeader         fb_req_header;
-};
-
-/* Framebuffer update notification descriptor. */
-typedef struct FBUpdateNotify {
-    /* Links all pending FB update notifications. */
-    struct FBUpdateNotify*  next_fb_update;
-
-    /* Core framebuffer instance that owns the message. */
-    ProxyFramebuffer*       proxy_fb;
-
-    /* Size of the message to transfer. */
-    size_t                  message_size;
-
-    /* Update message. */
-    FBUpdateMessage         message;
-} FBUpdateNotify;
-
-/*
- * Gets pointer in framebuffer's pixels for the given pixel.
- * Param:
- *  fb Framebuffer containing pixels.
- *  x, and y identify the pixel to get pointer for.
- * Return:
- *  Pointer in framebuffer's pixels for the given pixel.
- */
-static const uint8_t*
-_pixel_offset(const DisplaySurface* dsu, int x, int y)
-{
-    return (const uint8_t*)dsu->data + y * dsu->linesize + x * dsu->pf.bytes_per_pixel;
-}
-
-/*
- * Copies pixels from a framebuffer rectangle.
- * Param:
- *  rect - Buffer where to copy pixel.
- *  fb - Framebuffer containing the rectangle to copy.
- *  x, y, w, and h - dimensions of the rectangle to copy.
- */
-static void
-_copy_fb_rect(uint8_t* rect, const DisplaySurface* dsu, int x, int y, int w, int h)
-{
-    const uint8_t* start = _pixel_offset(dsu, x, y);
-    for (; h > 0; h--) {
-        memcpy(rect, start, w * dsu->pf.bytes_per_pixel);
-        start += dsu->linesize;
-        rect += w * dsu->pf.bytes_per_pixel;
-    }
-}
-
-/*
- * Allocates and initializes framebuffer update notification descriptor.
- * Param:
- *  ds - Display state for the framebuffer.
- *  fb Framebuffer containing pixels.
- *  x, y, w, and h identify the rectangle that is being updated.
- * Return:
- *  Initialized framebuffer update notification descriptor.
- */
-static FBUpdateNotify*
-fbupdatenotify_create(ProxyFramebuffer* proxy_fb,
-                      int x, int y, int w, int h)
-{
-    const size_t rect_size = w * h * proxy_fb->ds->surface->pf.bytes_per_pixel;
-    FBUpdateNotify* ret = malloc(sizeof(FBUpdateNotify) + rect_size);
-
-    ret->next_fb_update = NULL;
-    ret->proxy_fb = proxy_fb;
-    ret->message_size = sizeof(FBUpdateMessage) + rect_size;
-    ret->message.x = x;
-    ret->message.y = y;
-    ret->message.w = w;
-    ret->message.h = h;
-    _copy_fb_rect(ret->message.rect, proxy_fb->ds->surface, x, y, w, h);
-    return ret;
-}
-
-/*
- * Deletes FBUpdateNotify descriptor, created with fbupdatenotify_create.
- * Param:
- *  desc - Descreptor to delete.
- */
-static void
-fbupdatenotify_delete(FBUpdateNotify* desc)
-{
-    if (desc != NULL) {
-        free(desc);
-    }
-}
-
-/*
- * Asynchronous write I/O callback launched when writing framebuffer
- * notifications to the socket.
- * Param:
- *  proxy_fb - ProxyFramebuffer instance.
- */
-static void
-_proxyFb_io_write(ProxyFramebuffer* proxy_fb)
-{
-    while (proxy_fb->fb_update_head != NULL) {
-        FBUpdateNotify* current_update = proxy_fb->fb_update_head;
-        // Lets continue writing of the current notification.
-        const AsyncStatus status =
-            asyncWriter_write(&proxy_fb->fb_update_writer);
-        switch (status) {
-            case ASYNC_COMPLETE:
-                // Done with the current update. Move on to the next one.
-                break;
-            case ASYNC_ERROR:
-                // Done with the current update. Move on to the next one.
-                loopIo_dontWantWrite(&proxy_fb->io);
-                break;
-
-            case ASYNC_NEED_MORE:
-                // Transfer will eventually come back into this routine.
-                return;
-        }
-
-        // Advance the list of updates
-        proxy_fb->fb_update_head = current_update->next_fb_update;
-        if (proxy_fb->fb_update_head == NULL) {
-            proxy_fb->fb_update_tail = NULL;
-        }
-        fbupdatenotify_delete(current_update);
-
-        if (proxy_fb->fb_update_head != NULL) {
-            // Schedule the next one.
-            asyncWriter_init(&proxy_fb->fb_update_writer,
-                             &proxy_fb->fb_update_head->message,
-                             proxy_fb->fb_update_head->message_size,
-                             &proxy_fb->io);
-        }
-    }
-}
-
-static void proxyFb_update(void* opaque, int x, int y, int w, int h);
-
-/*
- * Asynchronous read I/O callback launched when reading framebuffer requests
- * from the socket.
- * Param:
- *  proxy_fb - ProxyFramebuffer instance.
- */
-static void
-_proxyFb_io_read(ProxyFramebuffer* proxy_fb)
-{
-    // Read the request header.
-    DisplaySurface* dsu;
-    const AsyncStatus status =
-        asyncReader_read(&proxy_fb->fb_req_reader);
-    switch (status) {
-        case ASYNC_COMPLETE:
-            // Request header is received
-            switch (proxy_fb->fb_req_header.request_type) {
-                case AFB_REQUEST_REFRESH:
-                    // Force full screen update to be sent
-                    dsu = proxy_fb->ds->surface;
-                    proxyFb_update(proxy_fb,
-                                  0, 0, dsu->width, dsu->height);
-                    break;
-                default:
-                    derror("Unknown framebuffer request %d\n",
-                           proxy_fb->fb_req_header.request_type);
-                    break;
-            }
-            proxy_fb->fb_req_header.request_type = -1;
-            asyncReader_init(&proxy_fb->fb_req_reader, &proxy_fb->fb_req_header,
-                             sizeof(proxy_fb->fb_req_header), &proxy_fb->io);
-            break;
-        case ASYNC_ERROR:
-            loopIo_dontWantRead(&proxy_fb->io);
-            if (errno == ECONNRESET) {
-                // UI has exited. We need to destroy framebuffer service.
-                proxyFb_destroy(proxy_fb);
-            }
-            break;
-
-        case ASYNC_NEED_MORE:
-            // Transfer will eventually come back into this routine.
-            return;
-    }
-}
-
-/*
- * Asynchronous I/O callback launched when writing framebuffer notifications
- * to the socket.
- * Param:
- *  opaque - ProxyFramebuffer instance.
- */
-static void
-_proxyFb_io_fun(void* opaque, int fd, unsigned events)
-{
-    if (events & LOOP_IO_READ) {
-        _proxyFb_io_read((ProxyFramebuffer*)opaque);
-    } else if (events & LOOP_IO_WRITE) {
-        _proxyFb_io_write((ProxyFramebuffer*)opaque);
-    }
-}
-
-ProxyFramebuffer*
-proxyFb_create(int sock, const char* protocol)
-{
-    // At this point we're implementing the -raw protocol only.
-    ProxyFramebuffer* ret;
-    DisplayState* ds = get_displaystate();
-    DisplayUpdateListener* dul;
-
-    ANEW0(ret);
-    ret->sock = sock;
-    ret->looper = looper_newCore();
-    ret->ds = ds;
-
-    ANEW0(dul);
-    dul->opaque = ret;
-    dul->dpy_update = proxyFb_update;
-    register_displayupdatelistener(ds, dul);
-    ret->ds_listener = dul;
-
-    ret->fb_update_head = NULL;
-    ret->fb_update_tail = NULL;
-    loopIo_init(&ret->io, ret->looper, sock, _proxyFb_io_fun, ret);
-    asyncReader_init(&ret->fb_req_reader, &ret->fb_req_header,
-                     sizeof(ret->fb_req_header), &ret->io);
-    return ret;
-}
-
-void
-proxyFb_destroy(ProxyFramebuffer* proxy_fb)
-{
-    if (proxy_fb != NULL) {
-        unregister_displayupdatelistener(proxy_fb->ds, proxy_fb->ds_listener);
-        if (proxy_fb->looper != NULL) {
-            // Stop all I/O that may still be going on.
-            loopIo_done(&proxy_fb->io);
-            // Delete all pending frame updates.
-            while (proxy_fb->fb_update_head != NULL) {
-                FBUpdateNotify* pending_update = proxy_fb->fb_update_head;
-                proxy_fb->fb_update_head = pending_update->next_fb_update;
-                fbupdatenotify_delete(pending_update);
-            }
-            proxy_fb->fb_update_tail = NULL;
-            looper_free(proxy_fb->looper);
-            proxy_fb->looper = NULL;
-        }
-        AFREE(proxy_fb);
-    }
-}
-
-static void
-proxyFb_update(void* opaque, int x, int y, int w, int h)
-{
-    ProxyFramebuffer* proxy_fb = opaque;
-    AsyncStatus status;
-    FBUpdateNotify* descr = fbupdatenotify_create(proxy_fb, x, y, w, h);
-
-    // Lets see if we should list it behind other pending updates.
-    if (proxy_fb->fb_update_tail != NULL) {
-        proxy_fb->fb_update_tail->next_fb_update = descr;
-        proxy_fb->fb_update_tail = descr;
-        return;
-    }
-
-    // We're first in the list. Just send it now.
-    proxy_fb->fb_update_head = proxy_fb->fb_update_tail = descr;
-    asyncWriter_init(&proxy_fb->fb_update_writer,
-                     &proxy_fb->fb_update_head->message,
-                     proxy_fb->fb_update_head->message_size, &proxy_fb->io);
-    status = asyncWriter_write(&proxy_fb->fb_update_writer);
-    switch (status) {
-        case ASYNC_COMPLETE:
-            fbupdatenotify_delete(descr);
-            proxy_fb->fb_update_head = proxy_fb->fb_update_tail = NULL;
-            return;
-        case ASYNC_ERROR:
-            fbupdatenotify_delete(descr);
-            proxy_fb->fb_update_head = proxy_fb->fb_update_tail = NULL;
-            return;
-        case ASYNC_NEED_MORE:
-            // Update transfer will eventually complete in _proxyFb_io_fun
-            return;
-    }
-}
-
-int
-proxyFb_get_bits_per_pixel(ProxyFramebuffer* proxy_fb)
-{
-    if (proxy_fb == NULL || proxy_fb->ds == NULL)
-        return -1;
-
-    return proxy_fb->ds->surface->pf.bits_per_pixel;
-}
diff --git a/android/protocol/fb-updates-proxy.h b/android/protocol/fb-updates-proxy.h
deleted file mode 100644
index 15b1d5b..0000000
--- a/android/protocol/fb-updates-proxy.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-** GNU General Public License for more details.
-*/
-
-/*
- * Contains core-side framebuffer service that sends framebuffer updates
- * to the UI connected to the core.
- */
-
-#ifndef _ANDROID_PROTOCOL_FB_UPDATES_PROXY_H
-#define _ANDROID_PROTOCOL_FB_UPDATES_PROXY_H
-
-/* Descriptor for a framebuffer core service instance */
-typedef struct ProxyFramebuffer ProxyFramebuffer;
-
-/*
- * Creates framebuffer service.
- * Param:
- *  sock - Socket descriptor for the service
- *  protocol - Defines protocol to use when sending FB updates to the UI. The
- *      supported values ar:
- *      -raw Transfers the updating rectangle buffer over the socket.
- *      -shared Used a shared memory to transfer the updating rectangle buffer.
- * Return:
- *  Framebuffer service descriptor.
- */
-ProxyFramebuffer* proxyFb_create(int sock, const char* protocol);
-
-/*
- * Destroys framebuffer service created with proxyFb_create.
- * Param:
- *  core_fb - Framebuffer service descriptor created with proxyFb_create
- */
-void proxyFb_destroy(ProxyFramebuffer* core_fb);
-
-/*
- * Gets number of bits used to encode a single pixel.
- * Param:
- *  core_fb - Framebuffer service descriptor created with proxyFb_create
- * Return:
- *  Number of bits used to encode a single pixel.
- */
-int proxyFb_get_bits_per_pixel(ProxyFramebuffer* core_fb);
-
-#endif /* _ANDROID_PROTOCOL_FB_UPDATES_PROXY_H */
diff --git a/android/protocol/fb-updates.h b/android/protocol/fb-updates.h
deleted file mode 100644
index 9142599..0000000
--- a/android/protocol/fb-updates.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-** GNU General Public License for more details.
-*/
-
-/*
- * Contains the API for calling into the UI with Core's framebuffer updates.
- */
-
-#ifndef _ANDROID_PROTOCOL_FB_UPDATES_H
-#define _ANDROID_PROTOCOL_FB_UPDATES_H
-
-#include "sysemu/sysemu.h"
-
-/* Requests the Core to refresh framebuffer.
- * This message is sent by the UI to the Core right after the UI is initialized.
- * This message forces the Core to send a full display update back to the UI. */
-#define AFB_REQUEST_REFRESH     1
-
-/* Header of framebuffer update message sent from the core to the UI. */
-typedef struct FBUpdateMessage {
-    /* x, y, w, and h identify the rectangle that is being updated. */
-    uint16_t    x;
-    uint16_t    y;
-    uint16_t    w;
-    uint16_t    h;
-
-    /* Contains updating rectangle copied over from the framebuffer's pixels. */
-    uint8_t rect[0];
-} FBUpdateMessage;
-
-/* Header for framebuffer requests sent from the UI to the Core. */
-typedef struct FBRequestHeader {
-    /* Request type. See AFB_REQUEST_XXX for the values. */
-    uint8_t request_type;
-} FBRequestHeader;
-
-#endif /* _ANDROID_PROTOCOL_FB_UPDATES_H */
diff --git a/android/protocol/ui-commands-api.h b/android/protocol/ui-commands-api.h
deleted file mode 100644
index d9fe6b0..0000000
--- a/android/protocol/ui-commands-api.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-** GNU General Public License for more details.
-*/
-
-#ifndef _ANDROID_PROTOCOL_UI_COMMANDS_API_H
-#define _ANDROID_PROTOCOL_UI_COMMANDS_API_H
-
-/*
- * Contains the API for calling into the UI with the Core control commands.
- */
-
-/* Changes the scale of the emulator window at runtime.
- * Param:
- *  scale, is_dpi - New window scale parameters
- * Return:
- *  0 on success, or < 0 on failure.
- */
-extern int uicmd_set_window_scale(double scale, int is_dpi);
-
-/* This is temporary redeclaration for AndroidHwLightBrightnessFunc declared
- * in android/hw-control.h We redeclare it here in order to keep type
- * consistency between android_core_set_brightness_change_callback and
- * light_brightness field of AndroidHwControlFuncs structure.
- */
-typedef void  (*AndroidHwLightBrightnessCallback)(void* opaque,
-                                                  const char* light,
-                                                  int  brightness);
-
-/* Registers a UI callback to be called when brightness is changed by the core. */
-extern int uicmd_set_brightness_change_callback(AndroidHwLightBrightnessCallback callback,
-                                                void* opaque);
-
-#endif /* _ANDROID_PROTOCOL_UI_COMMANDS_API_H */
diff --git a/android/protocol/ui-commands-impl.c b/android/protocol/ui-commands-impl.c
deleted file mode 100644
index 307e7c7..0000000
--- a/android/protocol/ui-commands-impl.c
+++ /dev/null
@@ -1,257 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-** GNU General Public License for more details.
-*/
-
-/*
- * Contains the UI-side implementation of the "core-ui-control" service that is
- * part of the UI control protocol. Here we handle UI control commands received
- * from the Core.
- */
-
-#include <unistd.h>
-#include "android/looper.h"
-#include "android/async-utils.h"
-#include "android/sync-utils.h"
-#include "android/utils/system.h"
-#include "android/utils/debug.h"
-#include "android/utils/eintr_wrapper.h"
-#include "android/utils/panic.h"
-#include "android/protocol/core-connection.h"
-#include "android/protocol/ui-commands-impl.h"
-#include "android/protocol/ui-commands-api.h"
-
-/* Enumerates states for the command reader in UICmdImpl instance. */
-typedef enum UICmdImplState {
-    /* The reader is waiting on command header. */
-    EXPECTS_HEADER,
-
-    /* The reader is waiting on command parameters. */
-    EXPECTS_PARAMETERS,
-} UICmdImplState;
-
-/* Descriptor for the UI-side of the "core-ui-control" service. */
-typedef struct UICmdImpl {
-    /* Core connection established for this service. */
-    CoreConnection* core_connection;
-
-    /* Socket descriptor for the UI service. */
-    int             sock;
-
-    /* Custom i/o handler */
-    LoopIo          io[1];
-
-    /* Command reader state. */
-    UICmdImplState  reader_state;
-
-    /* Incoming command header. */
-    UICmdHeader     cmd_header;
-
-    /* Reader's buffer. This field can point to the cmd_header field of this
-     * structure (when we expect a command header), or to a buffer allocated for
-     * the (when we expect command parameters). */
-    uint8_t*        reader_buffer;
-
-    /* Offset in the reader's buffer where to read next chunk of data. */
-    size_t          reader_offset;
-
-    /* Total number of bytes the reader expects to read. */
-    size_t          reader_bytes;
-} UICmdImpl;
-
-/* Implemented in android/qemulator.c */
-extern void android_emulator_set_window_scale(double scale, int is_dpi);
-
-/* One and only one UICmdImpl instance. */
-static UICmdImpl  _uiCmdImpl;
-
-/* Display brightness change callback. */
-static AndroidHwLightBrightnessCallback _brightness_change_callback = NULL;
-static void* _brightness_change_callback_param = NULL;
-
-/* Handles UI control command received from the core.
- * Param:
- *  uicmd - UICmdImpl instance that received the command.
- *  header - UI control command header.
- *  data - Command parameters formatted accordingly to the command type.
- */
-static void
-_uiCmdImpl_handle_command(UICmdImpl* uicmd,
-                          const UICmdHeader* header,
-                          const uint8_t* data)
-{
-    switch (header->cmd_type) {
-        case AUICMD_SET_WINDOWS_SCALE:
-        {
-            UICmdSetWindowsScale* cmd = (UICmdSetWindowsScale*)data;
-            android_emulator_set_window_scale(cmd->scale, cmd->is_dpi);
-            break;
-        }
-
-        case AUICMD_CHANGE_DISP_BRIGHTNESS:
-        {
-            UICmdChangeDispBrightness* cmd = (UICmdChangeDispBrightness*)data;
-            if (_brightness_change_callback != NULL) {
-                _brightness_change_callback(_brightness_change_callback_param,
-                                            cmd->light, cmd->brightness);
-            }
-            break;
-        }
-
-        default:
-            derror("Unknown command %d is received from the Core\n",
-                   header->cmd_type);
-            break;
-    }
-}
-
-/* Asynchronous I/O callback reading UI control commands.
- * Param:
- *  opaque - UICmdImpl instance.
- */
-static void
-_uiCmdImpl_io_callback(void* opaque, int fd, unsigned events)
-{
-    UICmdImpl* uicmd = opaque;
-    int status;
-
-    // Read requests while they are immediately available.
-    for (;;) {
-        // Read next chunk of data.
-        status = HANDLE_EINTR(
-                socket_recv(uicmd->sock,
-                            uicmd->reader_buffer + uicmd->reader_offset,
-                            uicmd->reader_bytes - uicmd->reader_offset));
-        if (status < 0 && (errno == EWOULDBLOCK || errno == EGAIN) {
-            // Chunk is not avalable at this point. Come back later.
-            return;
-        }
-        if (status <= 0) {
-            /* Disconnection, meaning that the core process got terminated. */
-            fprintf(stderr,
-                    "core-ui-control service got disconnected: %s\n",
-                    status < 0 ?
-                        strerror(errno) :
-                        "unexpected disconnection");
-            uiCmdImpl_destroy();
-            return;
-        }
-
-        uicmd->reader_offset += status;
-        if (uicmd->reader_offset != uicmd->reader_bytes) {
-            // There are still some data left in the pipe.
-            continue;
-        }
-
-        // All expected data has been read. Time to change the state.
-        if (uicmd->reader_state == EXPECTS_HEADER) {
-            // Header has been read.
-            if (uicmd->cmd_header.cmd_param_size) {
-                // Prepare for the command parameters.
-                uicmd->reader_state = EXPECTS_PARAMETERS;
-                uicmd->reader_offset = 0;
-                uicmd->reader_bytes = uicmd->cmd_header.cmd_param_size;
-                uicmd->reader_buffer = malloc(uicmd->reader_bytes);
-                if (uicmd->reader_buffer == NULL) {
-                    APANIC("Unable to allocate memory for UI command parameters.\n");
-                }
-            } else {
-                // This command doesn't have any parameters. Handle it now.
-                _uiCmdImpl_handle_command(uicmd, &uicmd->cmd_header, NULL);
-                // Prepare for the next command header.
-                uicmd->reader_state = EXPECTS_HEADER;
-                uicmd->reader_offset = 0;
-                uicmd->reader_bytes = sizeof(uicmd->cmd_header);
-                uicmd->reader_buffer = (uint8_t*)&uicmd->cmd_header;
-            }
-        } else {
-            // All command data is in. Handle it.
-            _uiCmdImpl_handle_command(uicmd, &uicmd->cmd_header,
-                                      uicmd->reader_buffer);
-            // Prepare for the next command header.
-            free(uicmd->reader_buffer);
-            uicmd->reader_state = EXPECTS_HEADER;
-            uicmd->reader_offset = 0;
-            uicmd->reader_bytes = sizeof(uicmd->cmd_header);
-            uicmd->reader_buffer = (uint8_t*)&uicmd->cmd_header;
-        }
-    }
-}
-
-int
-uiCmdImpl_create(SockAddress* console_socket, Looper* looper)
-{
-    UICmdImpl* uicmd = &_uiCmdImpl;
-    char* handshake = NULL;
-
-    // Setup command reader.
-    uicmd->reader_buffer = (uint8_t*)&uicmd->cmd_header;
-    uicmd->reader_state = EXPECTS_HEADER;
-    uicmd->reader_offset = 0;
-    uicmd->reader_bytes = sizeof(UICmdHeader);
-
-    // Connect to the core-ui-control service.
-    uicmd->core_connection =
-        core_connection_create_and_switch(console_socket, "core-ui-control",
-                                          &handshake);
-    if (uicmd->core_connection == NULL) {
-        derror("Unable to connect to the core-ui-control service: %s\n",
-               errno_str);
-        return -1;
-    }
-
-    // Initialize UI command reader.
-    uicmd->sock = core_connection_get_socket(uicmd->core_connection);
-    loopIo_init(uicmd->io, looper, uicmd->sock,
-                _uiCmdImpl_io_callback,
-                &_uiCmdImpl);
-    loopIo_wantRead(uicmd->io);
-
-    fprintf(stdout, "core-ui-control is now connected to the core at %s.",
-            sock_address_to_string(console_socket));
-    if (handshake != NULL) {
-        if (handshake[0] != '\0') {
-            fprintf(stdout, " Handshake: %s", handshake);
-        }
-        free(handshake);
-    }
-    fprintf(stdout, "\n");
-
-    return 0;
-}
-
-void
-uiCmdImpl_destroy(void)
-{
-    UICmdImpl* uicmd = &_uiCmdImpl;
-
-    if (uicmd->core_connection != NULL) {
-        // Disable I/O callbacks.
-        loopIo_done(uicmd->io);
-        core_connection_close(uicmd->core_connection);
-        core_connection_free(uicmd->core_connection);
-        uicmd->core_connection = NULL;
-    }
-    // Properly deallocate the reader buffer.
-    if (uicmd->reader_buffer != NULL &&
-        uicmd->reader_buffer != (uint8_t*)&uicmd->cmd_header) {
-        free(uicmd->reader_buffer);
-        uicmd->reader_buffer = (uint8_t*)&uicmd->cmd_header;
-    }
-}
-
-int
-uicmd_set_brightness_change_callback(AndroidHwLightBrightnessCallback callback,
-                                     void* opaque)
-{
-    _brightness_change_callback = callback;
-    _brightness_change_callback_param = opaque;
-    return 0;
-}
diff --git a/android/protocol/ui-commands-impl.h b/android/protocol/ui-commands-impl.h
deleted file mode 100644
index 717f6b6..0000000
--- a/android/protocol/ui-commands-impl.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-** GNU General Public License for more details.
-*/
-
-#ifndef _ANDROID_PROTOCOL_UI_COMMANDS_IMPL_H
-#define _ANDROID_PROTOCOL_UI_COMMANDS_IMPL_H
-
-#include "android/sockets.h"
-#include "android/looper.h"
-#include "android/protocol/ui-commands.h"
-
-/*
- * Contains the UI-side implementation of the "core-ui-control" service that is
- * part of the UI control protocol. Here we handle UI control commands sent by
- * the Core to the UI.
- */
-
-/* Creates and initializes descriptor for the UI-side of the "core-ui-control"
- * service. Note that there can be only one instance of this service in the UI.
- * Param:
- *  console_socket - Addresses Core's console.
- * Return:
- *  0 on success, or < 0 on failure.
- */
-extern int uiCmdImpl_create(SockAddress* console_socket, Looper* looper);
-
-/* Destroys UI-side of the "core-ui-control" service. */
-extern void uiCmdImpl_destroy();
-
-#endif /* _ANDROID_PROTOCOL_UI_COMMANDS_IMPL_H */
diff --git a/android/protocol/ui-commands-proxy.c b/android/protocol/ui-commands-proxy.c
deleted file mode 100644
index 22994c5..0000000
--- a/android/protocol/ui-commands-proxy.c
+++ /dev/null
@@ -1,209 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-** GNU General Public License for more details.
-*/
-
-/*
- * Contains the Core-side implementation of the "core-ui-control" service that is
- * part of the UI control protocol. Here we send UI control commands to the UI.
- */
-
-#include "android/android.h"
-#include "android/hw-control.h"
-#include "android/looper.h"
-#include "android/async-utils.h"
-#include "android/sync-utils.h"
-#include "android/utils/debug.h"
-#include "android/protocol/ui-commands.h"
-#include "android/protocol/ui-commands-proxy.h"
-#include "android/protocol/ui-commands-api.h"
-
-/* Descriptor for the UI commands proxy. */
-typedef struct UICmdProxy {
-    /* I/O associated with this descriptor. */
-    LoopIo          io;
-
-    /* Looper associated with this descriptor. */
-    Looper*         looper;
-
-    /* Writer to send UI commands. */
-    SyncSocket*     sync_writer;
-
-    /* Socket descriptor for this service. */
-    int             sock;
-} UICmdProxy;
-
-/* One and only one UICmdProxy instance. */
-static UICmdProxy    _uiCmdProxy;
-
-/* Implemented in android/console.c */
-extern void destroy_uicmd_client(void);
-
-/* Calculates timeout for transferring the given number of bytes via socket.
- * Return:
- *  Number of milliseconds during which the entire number of bytes is expected
- *  to be transferred via socket.
- */
-static int
-_uiCmdProxy_get_timeout(size_t data_size)
-{
-    // Min 2 seconds + 10 millisec for each transferring byte.
-    // TODO: Come up with a better arithmetics here.
-    return 2000 + data_size * 10;
-}
-
-/* Sends request to the UI client of this service.
- * Param:
- *  cmd_type, cmd_param, cmd_param_size - Define the command to send.
- * Return:
- *  0 on success, or < 0 on failure.
- */
-static int
-_uiCmdProxy_send_command(uint8_t cmd_type,
-                         void* cmd_param,
-                         uint32_t cmd_param_size)
-{
-    UICmdHeader header;
-    int status = syncsocket_start_write(_uiCmdProxy.sync_writer);
-    if (!status) {
-        // Initialize and send the header.
-        header.cmd_type = cmd_type;
-        header.cmd_param_size = cmd_param_size;
-        status = syncsocket_write(_uiCmdProxy.sync_writer, &header, sizeof(header),
-                                  _uiCmdProxy_get_timeout(sizeof(header)));
-        // If there are command parameters, send them too.
-        if (status > 0 && cmd_param != NULL && cmd_param_size > 0) {
-            status = syncsocket_write(_uiCmdProxy.sync_writer, cmd_param,
-                                      cmd_param_size,
-                                      _uiCmdProxy_get_timeout(cmd_param_size));
-        }
-        status = syncsocket_result(status);
-        syncsocket_stop_write(_uiCmdProxy.sync_writer);
-    }
-    if (status < 0) {
-        derror("Send UI command %d (%u bytes) has failed: %s\n",
-               cmd_type, cmd_param_size, errno_str);
-    }
-    return status;
-}
-
-/* Asynchronous I/O callback for UICmdProxy instance.
- * We expect this callback to be called only on UI detachment condition. In this
- * case the event should be LOOP_IO_READ, and read should fail with errno set
- * to ECONNRESET.
- * Param:
- *  opaque - UICmdProxy instance.
- */
-static void
-_uiCmdProxy_io_func(void* opaque, int fd, unsigned events)
-{
-    UICmdProxy* uicmd = (UICmdProxy*)opaque;
-    AsyncReader reader;
-    AsyncStatus status;
-    uint8_t read_buf[1];
-
-    if (events & LOOP_IO_WRITE) {
-        derror("Unexpected LOOP_IO_WRITE in _uiCmdProxy_io_func.\n");
-        return;
-    }
-
-    // Try to read
-    asyncReader_init(&reader, read_buf, sizeof(read_buf), &uicmd->io);
-    status = asyncReader_read(&reader);
-    // We expect only error status here.
-    if (status != ASYNC_ERROR) {
-        derror("Unexpected read status %d in _uiCmdProxy_io_func\n", status);
-        return;
-    }
-    // We expect only socket disconnection error here.
-    if (errno != ECONNRESET) {
-        derror("Unexpected read error %d (%s) in _uiCmdProxy_io_func.\n",
-               errno, errno_str);
-        return;
-    }
-
-    // Client got disconnectted.
-    destroy_uicmd_client();
-}
-/* a callback function called when the system wants to change the brightness
- * of a given light. 'light' is a string which can be one of:
- * 'lcd_backlight', 'button_backlight' or 'Keyboard_backlight'
- *
- * brightness is an integer (acceptable range are 0..255), however the
- * default is around 105, and we probably don't want to dim the emulator's
- * output at that level.
- */
-static void
-_uiCmdProxy_brightness_change_callback(void* opaque,
-                                       const char* light,
-                                       int brightness)
-{
-    // Calculate size of the command parameters.
-    const size_t cmd_size = sizeof(UICmdChangeDispBrightness) + strlen(light) + 1;
-    // Allocate and initialize parameters.
-    UICmdChangeDispBrightness* cmd =
-        (UICmdChangeDispBrightness*)g_malloc(cmd_size);
-    cmd->brightness = brightness;
-    strcpy(cmd->light, light);
-    // Send the command.
-    _uiCmdProxy_send_command(AUICMD_CHANGE_DISP_BRIGHTNESS, cmd, cmd_size);
-    g_free(cmd);
-}
-
-int
-uiCmdProxy_create(int fd)
-{
-    // Initialize the only UICmdProxy instance.
-    _uiCmdProxy.sock = fd;
-    _uiCmdProxy.looper = looper_newCore();
-    loopIo_init(&_uiCmdProxy.io, _uiCmdProxy.looper, _uiCmdProxy.sock,
-                _uiCmdProxy_io_func, &_uiCmdProxy);
-    loopIo_wantRead(&_uiCmdProxy.io);
-    _uiCmdProxy.sync_writer = syncsocket_init(fd);
-    if (_uiCmdProxy.sync_writer == NULL) {
-        derror("Unable to initialize UICmdProxy writer: %s\n", errno_str);
-        uiCmdProxy_destroy();
-        return -1;
-    }
-    {
-        // Set brighness change callback, so we can notify
-        // the UI about the event.
-        AndroidHwControlFuncs  funcs;
-        funcs.light_brightness = _uiCmdProxy_brightness_change_callback;
-        android_hw_control_set(&_uiCmdProxy, &funcs);
-    }
-    return 0;
-}
-
-void
-uiCmdProxy_destroy()
-{
-    // Destroy the sync writer.
-    if (_uiCmdProxy.sync_writer != NULL) {
-        syncsocket_close(_uiCmdProxy.sync_writer);
-        syncsocket_free(_uiCmdProxy.sync_writer);
-    }
-    if (_uiCmdProxy.looper != NULL) {
-        // Stop all I/O that may still be going on.
-        loopIo_done(&_uiCmdProxy.io);
-        looper_free(_uiCmdProxy.looper);
-        _uiCmdProxy.looper = NULL;
-    }
-    _uiCmdProxy.sock = -1;
-}
-
-int
-uicmd_set_window_scale(double scale, int is_dpi)
-{
-    UICmdSetWindowsScale cmd;
-    cmd.scale = scale;
-    cmd.is_dpi = is_dpi;
-    return _uiCmdProxy_send_command(AUICMD_SET_WINDOWS_SCALE, &cmd, sizeof(cmd));
-}
diff --git a/android/protocol/ui-commands-proxy.h b/android/protocol/ui-commands-proxy.h
deleted file mode 100644
index 8627537..0000000
--- a/android/protocol/ui-commands-proxy.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-** GNU General Public License for more details.
-*/
-
-#ifndef _ANDROID_PROTOCOL_UI_COMMANDS_PROXY_H
-#define _ANDROID_PROTOCOL_UI_COMMANDS_PROXY_H
-
-/*
- * Contains the Core-side implementation of the "core-ui-control" service that is
- * part of the UI control protocol. Here we send UI control commands to the UI.
- */
-
-/* Creates and initializes descriptor for the Core-side of the "core-ui-control"
- * service. Note that there can be only one instance of this service in the core.
- * Param:
- *  fd - Socket descriptor for the proxy.
- * Return:
- *  0 on success, or < 0 on failure.
- */
-extern int uiCmdProxy_create(int fd);
-
-/* Destroys the descriptor for the Core-side of the "core-ui-control" service. */
-extern void uiCmdProxy_destroy();
-
-/* Changes the scale of the emulator window at runtime.
- * Param:
- *  scale, is_dpi - New window scale parameters
- * Return:
- *  0 on success, or < 0 on failure.
- */
-extern int uicmd_set_window_scale(double scale, int is_dpi);
-
-#endif /* _ANDROID_PROTOCOL_UI_COMMANDS_PROXY_H */
diff --git a/android/protocol/ui-commands-qemu.c b/android/protocol/ui-commands-qemu.c
deleted file mode 100644
index 2bb22c9..0000000
--- a/android/protocol/ui-commands-qemu.c
+++ /dev/null
@@ -1,40 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-** GNU General Public License for more details.
-*/
-
-/*
- * Contains implementation of the API for calling into the UI with the Core
- * control commands for standalone (monolithic) emulator.
- */
-
-#include "android/android.h"
-#include "android/hw-control.h"
-#include "android/protocol/ui-commands-api.h"
-
-/* Implemented in android/qemulator.c */
-extern void android_emulator_set_window_scale(double scale, int is_dpi);
-
-int
-uicmd_set_window_scale(double scale, int is_dpi)
-{
-    android_emulator_set_window_scale(scale, is_dpi);
-    return 0;
-}
-
-int
-uicmd_set_brightness_change_callback(AndroidHwLightBrightnessCallback callback,
-                                     void* opaque)
-{
-    AndroidHwControlFuncs  funcs;
-    funcs.light_brightness = callback;
-    android_hw_control_set(opaque, &funcs);
-    return 0;
-}
diff --git a/android/protocol/ui-commands.h b/android/protocol/ui-commands.h
deleted file mode 100644
index 4e47b83..0000000
--- a/android/protocol/ui-commands.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-** GNU General Public License for more details.
-*/
-
-#ifndef _ANDROID_PROTOCOL_UI_COMMANDS_H
-#define _ANDROID_PROTOCOL_UI_COMMANDS_H
-
-/*
- * Contains declarations related to the UI control commands sent by the Core and
- * handled by the UI.
- */
-
-#include "android/protocol/ui-common.h"
-
-/* Sets window scale. */
-#define AUICMD_SET_WINDOWS_SCALE        1
-
-/* Changes display brightness. */
-#define AUICMD_CHANGE_DISP_BRIGHTNESS   2
-
-/* Formats AUICMD_SET_WINDOWS_SCALE UI control command parameters.
- * Contains parameters required by android_emulator_set_window_scale routine.
- */
-typedef struct UICmdSetWindowsScale {
-    double  scale;
-    int     is_dpi;
-} UICmdSetWindowsScale;
-
-/* Formats AUICMD_CHANGE_DISP_BRIGHTNESS UI control command parameters.
- */
-typedef struct UICmdChangeDispBrightness {
-    int     brightness;
-    char    light[0];
-} UICmdChangeDispBrightness;
-
-#endif /* _ANDROID_PROTOCOL_UI_COMMANDS_H */
diff --git a/android/protocol/ui-common.h b/android/protocol/ui-common.h
deleted file mode 100644
index 003ed6d..0000000
--- a/android/protocol/ui-common.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-** GNU General Public License for more details.
-*/
-
-#ifndef _ANDROID_PROTOCOL_UI_COMMON_H
-#define _ANDROID_PROTOCOL_UI_COMMON_H
-
-/*
- * Contains declarations for UI control protocol used by both the Core,
- * and the UI.
- */
-
-/* UI control command header.
- * Every UI control command sent by the Core, or by the UI begins with this
- * header, immediately followed by the command parameters (if there are any).
- * Command type is defined by cmd_type field of this header. If command doesn't
- * have any command-specific parameters, cmd_param_size field of this header
- * must be 0.
- */
-typedef struct UICmdHeader {
-    /* Command type. */
-    uint8_t     cmd_type;
-
-    /* Byte size of the buffer containing parameters for the comand defined by
-     * the cmd_type field. The buffer containing parameters must immediately
-     * follow this header. If command doesn't have any parameters, this field
-     * must be 0 */
-    uint32_t    cmd_param_size;
-} UICmdHeader;
-
-/* UI control command response header.
- * If UI control command assumes a response from the remote end, the response
- * must start with this header, immediately followed by the response data buffer.
- */
-typedef struct UICmdRespHeader {
-    /* Result of the command handling. */
-    int         result;
-
-    /* Byte size of the buffer containing response data immediately following
-     * this header. If there are no response data for the command, this field
-     * must be 0. */
-    uint32_t    resp_data_size;
-} UICmdRespHeader;
-
-#endif /* _ANDROID_PROTOCOL_UI_COMMON_H */
diff --git a/android/protocol/user-events-impl.c b/android/protocol/user-events-impl.c
deleted file mode 100644
index f45169a..0000000
--- a/android/protocol/user-events-impl.c
+++ /dev/null
@@ -1,206 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-** GNU General Public License for more details.
-*/
-
-/*
- * Contains the Core-side of the "user events" service. Here we receive and
- * handle user events sent from the UI.
- */
-
-#include "android/user-events.h"
-#include "android/globals.h"
-#include "android/android.h"
-#include "android/looper.h"
-#include "android/async-utils.h"
-#include "android/sync-utils.h"
-#include "android/utils/system.h"
-#include "android/utils/debug.h"
-#include "android/protocol/user-events-protocol.h"
-#include "android/protocol/user-events-impl.h"
-
-/* Enumerates state values for the event reader in the UserEventsImpl descriptor.
- */
-typedef enum UserEventsImplState {
-    /* The reader is waiting on event header. */
-    EXPECTS_HEADER,
-
-    /* The reader is waiting on event parameters. */
-    EXPECTS_PARAMETERS,
-} UserEventsImplState;
-
-
-/* Core user events service descriptor. */
-typedef struct UserEventsImpl {
-    /* Reader to receive user events. */
-    AsyncReader         user_events_reader;
-
-    /* I/O associated with this descriptor. */
-    LoopIo              io;
-
-    /* Looper used to communicate user events. */
-    Looper*             looper;
-
-    /* Socket for this service. */
-    int                 sock;
-
-    /* State of the service (see UE_STATE_XXX for possible values). */
-    UserEventsImplState state;
-
-    /* Current event header. */
-    UserEventHeader     event_header;
-
-    /* Current event parameters. */
-    union {
-        UserEventGeneric    generic_event;
-        UserEventMouse      mouse_event;
-        UserEventKeycode    keycode_event;
-    };
-} UserEventsImpl;
-
-/* Implemented in android/console.c */
-extern void destroy_user_events_client(void);
-
-/* One and only one UserEventsImpl instance. */
-static UserEventsImpl   _UserEventsImpl;
-
-/* Asynchronous I/O callback reading user events.
- * Param:
- *  opaque - UserEventsImpl instance.
- */
-static void
-_userEventsImpl_io_func(void* opaque, int fd, unsigned events)
-{
-    UserEventsImpl* ueimpl;
-    AsyncStatus status;
-
-    if (events & LOOP_IO_WRITE) {
-        // We don't use async writer here, so we don't expect
-        // any write callbacks.
-        derror("Unexpected LOOP_IO_WRITE in _userEventsImpl_io_func\n");
-        return;
-    }
-
-    ueimpl = (UserEventsImpl*)opaque;
-    // Read whatever is expected from the socket.
-    status = asyncReader_read(&ueimpl->user_events_reader);
-
-
-    switch (status) {
-        case ASYNC_COMPLETE:
-            switch (ueimpl->state) {
-                case EXPECTS_HEADER:
-                    // We just read event header. Now we expect event parameters.
-                    ueimpl->state = EXPECTS_PARAMETERS;
-                    // Setup the reader depending on the event type.
-                    switch (ueimpl->event_header.event_type) {
-                        case AUSER_EVENT_MOUSE:
-                            asyncReader_init(&ueimpl->user_events_reader,
-                                             &ueimpl->mouse_event,
-                                             sizeof(ueimpl->mouse_event),
-                                             &ueimpl->io);
-                            break;
-
-                        case AUSER_EVENT_KEYCODE:
-                            asyncReader_init(&ueimpl->user_events_reader,
-                                             &ueimpl->keycode_event,
-                                             sizeof(ueimpl->keycode_event),
-                                             &ueimpl->io);
-                            break;
-
-                        case AUSER_EVENT_GENERIC:
-                            asyncReader_init(&ueimpl->user_events_reader,
-                                             &ueimpl->generic_event,
-                                             sizeof(ueimpl->generic_event),
-                                             &ueimpl->io);
-                            break;
-
-                        default:
-                            derror("Unexpected user event type %d\n",
-                                   ueimpl->event_header.event_type);
-                            break;
-                    }
-                    break;
-
-                case EXPECTS_PARAMETERS:
-                    // We just read event parameters. Lets fire the event.
-                    switch (ueimpl->event_header.event_type) {
-                        case AUSER_EVENT_MOUSE:
-                            user_event_mouse(ueimpl->mouse_event.dx,
-                                             ueimpl->mouse_event.dy,
-                                             ueimpl->mouse_event.dz,
-                                             ueimpl->mouse_event.buttons_state);
-                            break;
-
-                        case AUSER_EVENT_KEYCODE:
-                            user_event_keycode(ueimpl->keycode_event.keycode);
-                            break;
-
-                        case AUSER_EVENT_GENERIC:
-                            user_event_generic(ueimpl->generic_event.type,
-                                               ueimpl->generic_event.code,
-                                               ueimpl->generic_event.value);
-                            break;
-
-                        default:
-                            derror("Unexpected user event type %d\n",
-                                   ueimpl->event_header.event_type);
-                            break;
-                    }
-                    // Prepare to receive the next event header.
-                    ueimpl->event_header.event_type = -1;
-                    ueimpl->state = EXPECTS_HEADER;
-                    asyncReader_init(&ueimpl->user_events_reader,
-                                     &ueimpl->event_header,
-                                     sizeof(ueimpl->event_header), &ueimpl->io);
-                    break;
-            }
-            break;
-        case ASYNC_ERROR:
-            loopIo_dontWantRead(&ueimpl->io);
-            if (errno == ECONNRESET) {
-                // UI has exited. We need to destroy user event service.
-                destroy_user_events_client();
-            } else {
-                derror("User event read error %d -> %s\n", errno, errno_str);
-            }
-            break;
-
-        case ASYNC_NEED_MORE:
-            // Transfer will eventually come back into this routine.
-            return;
-    }
-}
-
-int
-userEventsImpl_create(int fd)
-{
-    _UserEventsImpl.sock = fd;
-    _UserEventsImpl.event_header.event_type = -1;
-    _UserEventsImpl.state = EXPECTS_HEADER;
-    _UserEventsImpl.looper = looper_newCore();
-    loopIo_init(&_UserEventsImpl.io, _UserEventsImpl.looper, _UserEventsImpl.sock,
-                _userEventsImpl_io_func, &_UserEventsImpl);
-    asyncReader_init(&_UserEventsImpl.user_events_reader,
-                     &_UserEventsImpl.event_header,
-                     sizeof(_UserEventsImpl.event_header), &_UserEventsImpl.io);
-    return 0;
-}
-
-void
-userEventsImpl_destroy(void)
-{
-    if (_UserEventsImpl.looper != NULL) {
-        // Stop all I/O that may still be going on.
-        loopIo_done(&_UserEventsImpl.io);
-        looper_free(_UserEventsImpl.looper);
-        _UserEventsImpl.looper = NULL;
-    }
-}
diff --git a/android/protocol/user-events-impl.h b/android/protocol/user-events-impl.h
deleted file mode 100644
index af5d5a4..0000000
--- a/android/protocol/user-events-impl.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-** GNU General Public License for more details.
-*/
-
-/*
- * Contains the Core-side of the "user events" service. Here we receive and
- * handle user events sent from the UI.
- */
-
-#ifndef _ANDROID_PROTOCOL_USER_EVENTS_IMPL_H
-#define _ANDROID_PROTOCOL_USER_EVENTS_IMPL_H
-
-/* Creates and initializes descriptor for the Core-side of the "user-events"
- * service. Note that there can be only one instance of this service in the core.
- * Param:
- *  fd - Socket descriptor for the service.
- * Return:
- *  0 on success, or < 0 on failure.
- */
-extern int userEventsImpl_create(int fd);
-
-/* Destroys the descriptor for the Core-side of the "user-events" service. */
-extern void userEventsImpl_destroy(void);
-
-#endif /* _ANDROID_PROTOCOL_USER_EVENTS_IMPL_H */
diff --git a/android/protocol/user-events-protocol.h b/android/protocol/user-events-protocol.h
deleted file mode 100644
index c1e64e2..0000000
--- a/android/protocol/user-events-protocol.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-** GNU General Public License for more details.
-*/
-
-#ifndef _ANDROID_PROTOCOL_USER_EVENTS_H
-#define _ANDROID_PROTOCOL_USER_EVENTS_H
-
-/*
- * Contains declarations related to the UI events handled by the Core.
- */
-
-#include "android/globals.h"
-
-/* Mouse event. */
-#define AUSER_EVENT_MOUSE     0
-/* Keycode event. */
-#define AUSER_EVENT_KEYCODE   1
-/* Generic event. */
-#define AUSER_EVENT_GENERIC   2
-
-/* Header for user event message sent from the UI to the Core.
- * Every user event sent by the UI begins with this header, immediately followed
- * by the event parameters (if there are any).
- */
-typedef struct UserEventHeader {
-    /* Event type. See AUSER_EVENT_XXX for possible values. */
-    uint8_t event_type;
-} UserEventHeader;
-
-/* Formats mouse event message (AUSER_EVENT_MOUSE) */
-typedef struct UserEventMouse {
-    int         dx;
-    int         dy;
-    int         dz;
-    unsigned    buttons_state;
-} UserEventMouse;
-
-/* Formats keycode event message (AUSER_EVENT_KEYCODE) */
-typedef struct UserEventKeycode {
-    int         keycode;
-} UserEventKeycode;
-
-/* Formats generic event message (AUSER_EVENT_GENERIC) */
-typedef struct UserEventGeneric {
-    int         type;
-    int         code;
-    int         value;
-} UserEventGeneric;
-
-#endif /* _ANDROID_PROTOCOL_USER_EVENTS_H */
diff --git a/android/protocol/user-events-proxy.c b/android/protocol/user-events-proxy.c
deleted file mode 100644
index 3bd0bee..0000000
--- a/android/protocol/user-events-proxy.c
+++ /dev/null
@@ -1,178 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-** GNU General Public License for more details.
-*/
-
-#include "android/user-events.h"
-#include "ui/console.h"
-#include "android/looper.h"
-#include "android/async-utils.h"
-#include "android/utils/debug.h"
-#include "android/protocol/core-connection.h"
-#include "android/protocol/user-events-protocol.h"
-#include "android/protocol/user-events-proxy.h"
-
-/* Descriptor for the user events client. */
-typedef struct UserEventsProxy {
-    /* Core connection instance for the user events client. */
-    CoreConnection* core_connection;
-
-    /* Socket for the client. */
-    int             sock;
-
-    /* Writes user events to the socket. */
-    SyncSocket*     sync_writer;
-} UserEventsProxy;
-
-/* One and only one user events client instance. */
-static UserEventsProxy _userEventsProxy = { 0 };
-
-/* Sends an event to the core.
- * Parameters:
- *  event - Event type. Must be one of the AUSER_EVENT_XXX.
- *  event_param - Event parameters.
- *  size - Byte size of the event parameters buffer.
- * Return:
- *  0 on success, or -1 on failure.
- */
-static int
-_userEventsProxy_send(uint8_t event, const void* event_param, size_t size)
-{
-    int res;
-    UserEventHeader header;
-
-    header.event_type = event;
-    res = syncsocket_start_write(_userEventsProxy.sync_writer);
-    if (!res) {
-        // Send event type first (event header)
-        res = syncsocket_write(_userEventsProxy.sync_writer, &header,
-                               sizeof(header),
-                               core_connection_get_timeout(sizeof(header)));
-        if (res > 0) {
-            // Send event param next.
-            res = syncsocket_write(_userEventsProxy.sync_writer, event_param,
-                                   size,
-                                   core_connection_get_timeout(sizeof(size)));
-        }
-        res = syncsocket_result(res);
-        syncsocket_stop_write(_userEventsProxy.sync_writer);
-    }
-    if (res < 0) {
-        derror("Unable to send user event: %s\n", errno_str);
-    }
-    return res;
-}
-
-int
-userEventsProxy_create(SockAddress* console_socket)
-{
-    char* handshake = NULL;
-
-    // Connect to the user-events service.
-    _userEventsProxy.core_connection =
-        core_connection_create_and_switch(console_socket, "user-events",
-                                          &handshake);
-    if (_userEventsProxy.core_connection == NULL) {
-        derror("Unable to connect to the user-events service: %s\n",
-               errno_str);
-        return -1;
-    }
-
-    // Initialze event writer.
-    _userEventsProxy.sock =
-        core_connection_get_socket(_userEventsProxy.core_connection);
-    _userEventsProxy.sync_writer = syncsocket_init(_userEventsProxy.sock);
-    if (_userEventsProxy.sync_writer == NULL) {
-        derror("Unable to initialize UserEventsProxy writer: %s\n", errno_str);
-        userEventsProxy_destroy();
-        return -1;
-    }
-
-    fprintf(stdout, "user-events is now connected to the core at %s.",
-            sock_address_to_string(console_socket));
-    if (handshake != NULL) {
-        if (handshake[0] != '\0') {
-            fprintf(stdout, " Handshake: %s", handshake);
-        }
-        free(handshake);
-    }
-    fprintf(stdout, "\n");
-
-    return 0;
-}
-
-void
-userEventsProxy_destroy(void)
-{
-    if (_userEventsProxy.sync_writer != NULL) {
-        syncsocket_close(_userEventsProxy.sync_writer);
-        syncsocket_free(_userEventsProxy.sync_writer);
-        _userEventsProxy.sync_writer = NULL;
-    }
-    if (_userEventsProxy.core_connection != NULL) {
-        core_connection_close(_userEventsProxy.core_connection);
-        core_connection_free(_userEventsProxy.core_connection);
-        _userEventsProxy.core_connection = NULL;
-    }
-}
-void
-user_event_keycodes(int *kcodes, int count)
-{
-    int nn;
-    for (nn = 0; nn < count; nn++)
-        user_event_keycode(kcodes[nn]);
-}
-
-void
-user_event_keycode(int  kcode)
-{
-    UserEventKeycode    message;
-    message.keycode = kcode;
-    _userEventsProxy_send(AUSER_EVENT_KEYCODE, &message, sizeof(message));
-}
-
-void
-user_event_key(unsigned code, unsigned down)
-{
-    if(code == 0) {
-        return;
-    }
-    if (VERBOSE_CHECK(keys))
-        printf(">> KEY [0x%03x,%s]\n", (code & 0x1ff), down ? "down" : " up " );
-
-    user_event_keycode((code & 0x1ff) | (down ? 0x200 : 0));
-}
-
-
-void
-user_event_mouse(int dx, int dy, int dz, unsigned buttons_state)
-{
-    UserEventMouse    message;
-    message.dx = dx;
-    message.dy = dy;
-    message.dz = dz;
-    message.buttons_state = buttons_state;
-    _userEventsProxy_send(AUSER_EVENT_MOUSE, &message, sizeof(message));
-}
-
-void
-user_event_register_generic(void* opaque, QEMUPutGenericEvent *callback)
-{
-}
-
-void
-user_event_generic(int type, int code, int value)
-{
-    UserEventGeneric    message;
-    message.type = type;
-    message.code = code;
-    message.value = value;
-    _userEventsProxy_send(AUSER_EVENT_GENERIC, &message, sizeof(message));
-}
diff --git a/android/protocol/user-events-proxy.h b/android/protocol/user-events-proxy.h
deleted file mode 100644
index 08a80cf..0000000
--- a/android/protocol/user-events-proxy.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-** GNU General Public License for more details.
-*/
-
-/*
- * Contains the UI-side of the "user events" service. Here we send user events
- * to the Core.
- */
-
-#ifndef _ANDROID_PROTOCOL_USER_EVENTS_PROXY_H
-#define _ANDROID_PROTOCOL_USER_EVENTS_PROXY_H
-
-/* Creates and initializes descriptor for the UI-side of the "user-events"
- * service. Note that there can be only one instance of this service in the UI.
- * Param:
- *  console_socket - Addresses Core's console.
- * Return:
- *  0 on success, or < 0 on failure.
- */
-extern int userEventsProxy_create(SockAddress* console_socket);
-
-/* Destroys the UI-side of the "user-events". */
-extern void userEventsProxy_destroy(void);
-
-#endif /* _ANDROID_PROTOCOL_USER_EVENTS_PROXY_H */
diff --git a/android/qemulator.c b/android/qemulator.c
index ffd547b..8c8aa0d 100644
--- a/android/qemulator.c
+++ b/android/qemulator.c
@@ -13,10 +13,10 @@
 #include "android/utils/debug.h"
 #include "android/utils/bufprint.h"
 #include "android/globals.h"
+#include "android/hw-control.h"
 #include "android/qemulator.h"
-#include "android/protocol/core-commands-api.h"
-#include "android/protocol/ui-commands-api.h"
 #include "android/user-events.h"
+#include "telephony/modem_driver.h"
 
 #define  D(...)  do {  if (VERBOSE_CHECK(init)) dprint(__VA_ARGS__); } while (0)
 static double get_default_scale( AndroidOptions*  opts );
@@ -89,8 +89,9 @@
     }
 
     /* initialize hardware control support */
-    uicmd_set_brightness_change_callback(qemulator_light_brightness,
-                                         emulator);
+    AndroidHwControlFuncs funcs;
+    funcs.light_brightness = qemulator_light_brightness;
+    android_hw_control_set(emulator, &funcs);
 }
 
 static void
@@ -252,7 +253,7 @@
 static int
 get_device_dpi( AndroidOptions*  opts )
 {
-    int    dpi_device  = corecmd_get_hw_lcd_density();
+    int dpi_device = android_hw->hw_lcd_density;
 
     if (opts->dpi_device != NULL) {
         char*  end;
@@ -393,8 +394,14 @@
     {
     case SKIN_KEY_COMMAND_TOGGLE_NETWORK:
         {
-            corecmd_toggle_network();
-            D( "network is now %s", corecmd_is_network_disabled() ?
+            qemu_net_disable = !qemu_net_disable;
+            if (android_modem) {
+                amodem_set_data_registration(
+                        android_modem,
+                qemu_net_disable ? A_REGISTRATION_UNREGISTERED
+                    : A_REGISTRATION_HOME);
+            }
+            D( "network is now %s", qemu_net_disable ?
                                     "disconnected" : "connected" );
         }
         break;
@@ -588,7 +595,7 @@
 }
 
 void
-android_emulator_set_window_scale( double  scale, int  is_dpi )
+android_emulator_set_window_scale(double  scale, int  is_dpi)
 {
     QEmulator*  emulator = qemulator;
 
diff --git a/android/qemulator.h b/android/qemulator.h
index 16cafcf..c3dce63 100644
--- a/android/qemulator.h
+++ b/android/qemulator.h
@@ -41,6 +41,9 @@
 QEmulator*
 qemulator_get(void);
 
+void
+android_emulator_set_window_scale(double  scale, int  is_dpi);
+
 /* Initializes QEmulator structure instance. */
 int
 qemulator_init( QEmulator*       emulator,
diff --git a/android/skin/window.c b/android/skin/window.c
index 23f2090..fd0d164 100644
--- a/android/skin/window.c
+++ b/android/skin/window.c
@@ -13,10 +13,10 @@
 #include "android/skin/image.h"
 #include "android/skin/scaler.h"
 #include "android/charmap.h"
+#include "android/hw-sensors.h"
 #include "android/utils/debug.h"
 #include "android/utils/system.h"
 #include "android/utils/duff.h"
-#include "android/protocol/core-commands-api.h"
 #include <SDL_syswm.h>
 #include "android/user-events.h"
 #include <math.h>
@@ -1465,9 +1465,9 @@
         user_event_generic( slayout->event_type, slayout->event_code, slayout->event_value );
         /* XXX: hack, replace by better code here */
         if (slayout->event_value != 0)
-            corecmd_set_coarse_orientation( ANDROID_COARSE_PORTRAIT );
+            android_sensors_set_coarse_orientation(ANDROID_COARSE_PORTRAIT);
         else
-            corecmd_set_coarse_orientation( ANDROID_COARSE_LANDSCAPE );
+            android_sensors_set_coarse_orientation(ANDROID_COARSE_LANDSCAPE);
     }
 
     return 0;
diff --git a/ui/keymaps.c b/ui/keymaps.c
index feb360f..bab4b29 100644
--- a/ui/keymaps.c
+++ b/ui/keymaps.c
@@ -67,29 +67,16 @@
     /* This file is used by both, UI and core components. There are differences
      * in the way how keymap file path is obtained for these two different
      * configurations. */
-#if defined(CONFIG_STANDALONE_UI)
-    char filename[2048];
-#else
     char * filename;
-#endif  // CONFIG_STANDALONE_UI
     char line[1024];
     int len;
 
-#if defined(CONFIG_STANDALONE_UI)
-    if (android_core_qemu_find_file(QEMU_FILE_TYPE_KEYMAP, language,
-                                    filename, sizeof(filename))) {
-        fprintf(stderr,
-            "Could not read keymap file: '%s'\n", language);
-        return NULL;
-    }
-#else
     filename = qemu_find_file(QEMU_FILE_TYPE_KEYMAP, language);
     if (!filename) {
         fprintf(stderr,
             "Could not read keymap file: '%s'\n", language);
         return NULL;
     }
-#endif  // CONFIG_STANDALONE_UI
 
     if (!k)
 	k = g_malloc0(sizeof(kbd_layout_t));
@@ -98,9 +85,6 @@
 		"Could not read keymap file: '%s'\n", language);
 	return NULL;
     }
-#if defined(CONFIG_STANDALONE_UI)
-    g_free(filename);
-#endif  // CONFIG_STANDALONE_UI
     for(;;) {
 	if (fgets(line, 1024, f) == NULL)
             break;
