diff --git a/compos/apk/assets/vm_test_config.json b/compos/apk/assets/vm_test_config.json
new file mode 100644
index 0000000..54a0aac
--- /dev/null
+++ b/compos/apk/assets/vm_test_config.json
@@ -0,0 +1,18 @@
+{
+    "version": 1,
+    "os": {
+        "name": "microdroid"
+    },
+    "task": {
+        "type": "executable",
+        "command": "/apex/com.android.compos/bin/compsvc"
+    },
+    "apexes": [
+        {
+            "name": "com.android.art"
+        },
+        {
+            "name": "com.android.compos"
+        }
+    ]
+}
\ No newline at end of file
diff --git a/compos/tests/AndroidTest.xml b/compos/tests/AndroidTest.xml
index 940531b..61b6d47 100644
--- a/compos/tests/AndroidTest.xml
+++ b/compos/tests/AndroidTest.xml
@@ -18,6 +18,10 @@
         <option name="force-root" value="true" />
     </target_preparer>
 
+    <!-- virtualizationservice doesn't have access to shell_data_file. Instead of giving it
+      a test-only permission, run it without selinux -->
+    <target_preparer class="com.android.tradefed.targetprep.DisableSELinuxTargetPreparer"/>
+
     <test class="com.android.compatibility.common.tradefed.testtype.JarHostTest" >
         <option name="jar" value="ComposHostTestCases.jar" />
     </test>
diff --git a/compos/tests/java/android/compos/test/ComposKeyTestCase.java b/compos/tests/java/android/compos/test/ComposKeyTestCase.java
index 2f3b243..00b002f 100644
--- a/compos/tests/java/android/compos/test/ComposKeyTestCase.java
+++ b/compos/tests/java/android/compos/test/ComposKeyTestCase.java
@@ -22,6 +22,7 @@
 import android.virt.test.CommandRunner;
 import android.virt.test.VirtualizationTestCaseBase;
 
+import com.android.compatibility.common.util.PollingCheck;
 import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
 import com.android.tradefed.util.CommandResult;
 import com.android.tradefed.util.CommandStatus;
@@ -34,37 +35,44 @@
 @RootPermissionTest
 @RunWith(DeviceJUnit4ClassRunner.class)
 public final class ComposKeyTestCase extends VirtualizationTestCaseBase {
+
+    /** Wait time for service to be ready on boot */
+    private static final int READY_LATENCY_MS = 10 * 1000; // 10 seconds
+
+    // Path to compos_key_cmd tool
     private static final String COMPOS_KEY_CMD_BIN = "/apex/com.android.compos/bin/compos_key_cmd";
-    private static final String INSTANCE_IMAGE = TEST_ROOT + "compos_instance.img";
+
+    private String mCid;
 
     @Before
     public void setUp() throws Exception {
         testIfDeviceIsCapable(getDevice());
+
+        prepareVirtualizationTestSetup(getDevice());
     }
 
     @After
     public void tearDown() throws Exception {
-        CommandRunner android = new CommandRunner(getDevice());
+        if (mCid != null) {
+            shutdownMicrodroid(getDevice(), mCid);
+            mCid = null;
+        }
 
-        // kill stale VMs and directories
-        android.tryRun("killall", "crosvm");
-        android.tryRun("rm", "-rf", "/data/misc/virtualizationservice/*");
-        android.tryRun("stop", "virtualizationservice");
+        cleanUpVirtualizationTestSetup(getDevice());
     }
 
-
     @Test
     public void testKeyService() throws Exception {
+        startVm();
+        waitForServiceRunning();
+
         CommandRunner android = new CommandRunner(getDevice());
         CommandResult result;
 
-        // Create an empty image file
-        android.run(COMPOS_KEY_CMD_BIN, "make-instance", INSTANCE_IMAGE);
-
         // Generate keys - should succeed
         android.run(
                 COMPOS_KEY_CMD_BIN,
-                "--start " + INSTANCE_IMAGE,
+                "--cid " + mCid,
                 "generate",
                 TEST_ROOT + "test_key.blob",
                 TEST_ROOT + "test_key.pubkey");
@@ -72,7 +80,7 @@
         // Verify them - should also succeed, since we just generated them
         android.run(
                 COMPOS_KEY_CMD_BIN,
-                "--start " + INSTANCE_IMAGE,
+                "--cid " + mCid,
                 "verify",
                 TEST_ROOT + "test_key.blob",
                 TEST_ROOT + "test_key.pubkey");
@@ -81,7 +89,7 @@
         result =
                 android.runForResult(
                         COMPOS_KEY_CMD_BIN,
-                        "--start " + INSTANCE_IMAGE,
+                        "--cid " + mCid,
                         "verify",
                         TEST_ROOT + "test_key.pubkey",
                         TEST_ROOT + "test_key.blob");
@@ -90,7 +98,7 @@
         // Generate another set of keys - should succeed
         android.run(
                 COMPOS_KEY_CMD_BIN,
-                "--start " + INSTANCE_IMAGE,
+                "--cid " + mCid,
                 "generate",
                 TEST_ROOT + "test_key2.blob",
                 TEST_ROOT + "test_key2.pubkey");
@@ -98,7 +106,7 @@
         // They should also verify ok
         android.run(
                 COMPOS_KEY_CMD_BIN,
-                "--start " + INSTANCE_IMAGE,
+                "--cid " + mCid,
                 "verify",
                 TEST_ROOT + "test_key2.blob",
                 TEST_ROOT + "test_key2.pubkey");
@@ -107,7 +115,7 @@
         result =
                 android.runForResult(
                         COMPOS_KEY_CMD_BIN,
-                        "--start " + INSTANCE_IMAGE,
+                        "--cid " + mCid,
                         "verify",
                         TEST_ROOT + "test_key.pubkey",
                         TEST_ROOT + "test_key2.blob");
@@ -118,18 +126,52 @@
         // very slow, a new test method unfortunately makes the whole test module to exceed the
         // timeout configured in the test infrastructure.
 
+        // Generate key - should succeed
+        android.run(
+                COMPOS_KEY_CMD_BIN,
+                "--cid " + mCid,
+                "generate",
+                TEST_ROOT + "test_key3.blob",
+                TEST_ROOT + "test_key3.pubkey");
+
         // Generate some data to sign in a writable directory
         android.run("echo something > /data/local/tmp/something.txt");
 
         // Sign something - should succeed
         android.run(
                 COMPOS_KEY_CMD_BIN,
-                "--start " + INSTANCE_IMAGE,
+                "--cid " + mCid,
                 "sign",
-                TEST_ROOT + "test_key2.blob",
+                TEST_ROOT + "test_key3.blob",
                 "/data/local/tmp/something.txt");
 
         // Check existence of the output signature - should succeed
         android.run("test -f /data/local/tmp/something.txt.signature");
     }
+
+    private void startVm() throws Exception {
+        final String apkName = "CompOSPayloadApp.apk";
+        final String packageName = "com.android.compos.payload";
+        mCid =
+                startMicrodroid(
+                        getDevice(),
+                        getBuild(),
+                        apkName,
+                        packageName,
+                        "assets/vm_test_config.json",
+                        /* debug */ false);
+        adbConnectToMicrodroid(getDevice(), mCid);
+    }
+
+    private void waitForServiceRunning() {
+        try {
+            PollingCheck.waitFor(READY_LATENCY_MS, this::isServiceRunning);
+        } catch (Exception e) {
+            throw new RuntimeException("Service unavailable", e);
+        }
+    }
+
+    private boolean isServiceRunning() {
+        return tryRunOnMicrodroid("pidof compsvc") != null;
+    }
 }
diff --git a/compos/tests/java/android/compos/test/ComposTestCase.java b/compos/tests/java/android/compos/test/ComposTestCase.java
index fb6b981..42a323f 100644
--- a/compos/tests/java/android/compos/test/ComposTestCase.java
+++ b/compos/tests/java/android/compos/test/ComposTestCase.java
@@ -22,6 +22,7 @@
 import android.virt.test.CommandRunner;
 import android.virt.test.VirtualizationTestCaseBase;
 
+import com.android.compatibility.common.util.PollingCheck;
 import com.android.tradefed.device.DeviceNotAvailableException;
 import com.android.tradefed.log.LogUtil.CLog;
 import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
@@ -36,10 +37,11 @@
 @RunWith(DeviceJUnit4ClassRunner.class)
 public final class ComposTestCase extends VirtualizationTestCaseBase {
 
-    // Binaries used in test. (These paths are valid both in host and Microdroid.)
+    /** Path to odrefresh on Microdroid */
     private static final String ODREFRESH_BIN = "/apex/com.android.art/bin/odrefresh";
+
+    /** Path to compos_key_cmd on Microdroid */
     private static final String COMPOS_KEY_CMD_BIN = "/apex/com.android.compos/bin/compos_key_cmd";
-    private static final String COMPOSD_CMD_BIN = "/apex/com.android.compos/bin/composd_cmd";
 
     /** Output directory of odrefresh */
     private static final String ODREFRESH_OUTPUT_DIR =
@@ -48,34 +50,38 @@
     /** Timeout of odrefresh to finish */
     private static final int ODREFRESH_TIMEOUT_MS = 10 * 60 * 1000; // 10 minutes
 
+    /** Wait time for compsvc to be ready on boot */
+    private static final int COMPSVC_READY_LATENCY_MS = 10 * 1000; // 10 seconds
+
     // ExitCode expanded from art/odrefresh/include/odrefresh/odrefresh.h.
     private static final int OKAY = 0;
     private static final int COMPILATION_SUCCESS = 80;
 
-    // Files that define the "current" instance of CompOS
-    private static final String COMPOS_CURRENT_ROOT =
-            "/data/misc/apexdata/com.android.compos/current/";
-    private static final String INSTANCE_IMAGE = COMPOS_CURRENT_ROOT + "instance.img";
-    private static final String PUBLIC_KEY = COMPOS_CURRENT_ROOT + "key.pubkey";
-    private static final String PRIVATE_KEY_BLOB = COMPOS_CURRENT_ROOT + "key.blob";
+    private String mCid;
 
     @Before
     public void setUp() throws Exception {
         testIfDeviceIsCapable(getDevice());
+
+        prepareVirtualizationTestSetup(getDevice());
+
+        startComposVm();
     }
 
     @After
     public void tearDown() throws Exception {
-        CommandRunner android = new CommandRunner(getDevice());
+        if (mCid != null) {
+            shutdownMicrodroid(getDevice(), mCid);
+            mCid = null;
+        }
 
-        // kill stale VMs and directories
-        android.tryRun("killall", "crosvm");
-        android.tryRun("rm", "-rf", "/data/misc/virtualizationservice/*");
-        android.tryRun("stop", "virtualizationservice");
+        cleanUpVirtualizationTestSetup(getDevice());
     }
 
     @Test
     public void testOdrefresh() throws Exception {
+        waitForServiceRunning();
+
         CommandRunner android = new CommandRunner(getDevice());
 
         // Prepare the groundtruth. The compilation on Android should finish successfully.
@@ -97,26 +103,26 @@
                 android.runForResultWithTimeout(ODREFRESH_TIMEOUT_MS, ODREFRESH_BIN, "--check");
         assertThat(result.getExitCode()).isEqualTo(OKAY);
 
-        // Make sure the CompOS current directory actually exists
-        android.run("mkdir", "-p", COMPOS_CURRENT_ROOT);
-
-        // Create an empty image file
-        android.run(COMPOS_KEY_CMD_BIN, "make-instance", INSTANCE_IMAGE);
-
-        // Generate keys - should succeed
+        // Initialize the service with the generated key. Should succeed.
         android.run(
                 COMPOS_KEY_CMD_BIN,
-                "--start " + INSTANCE_IMAGE,
+                "--cid " + mCid,
                 "generate",
-                PRIVATE_KEY_BLOB,
-                PUBLIC_KEY);
+                TEST_ROOT + "test_key.blob",
+                TEST_ROOT + "test_key.pubkey");
+        android.run(COMPOS_KEY_CMD_BIN, "--cid " + mCid, "init-key", TEST_ROOT + "test_key.blob");
 
         // Expect the compilation in Compilation OS to finish successfully.
         {
             long start = System.currentTimeMillis();
-            result = android.runForResultWithTimeout(ODREFRESH_TIMEOUT_MS, COMPOSD_CMD_BIN);
+            result =
+                    android.runForResultWithTimeout(
+                            ODREFRESH_TIMEOUT_MS,
+                            ODREFRESH_BIN,
+                            "--use-compilation-os=" + mCid,
+                            "--force-compile");
             long elapsed = System.currentTimeMillis() - start;
-            assertThat(result.getExitCode()).isEqualTo(0);
+            assertThat(result.getExitCode()).isEqualTo(COMPILATION_SUCCESS);
             CLog.i("Comp OS compilation took " + elapsed + "ms");
         }
 
@@ -134,6 +140,32 @@
         assertThat(actualChecksumSnapshot).isEqualTo(expectedChecksumSnapshot);
     }
 
+    private void startComposVm() throws DeviceNotAvailableException {
+        final String apkName = "CompOSPayloadApp.apk";
+        final String packageName = "com.android.compos.payload";
+        mCid =
+                startMicrodroid(
+                        getDevice(),
+                        getBuild(),
+                        apkName,
+                        packageName,
+                        "assets/vm_test_config.json",
+                        /* debug */ false);
+        adbConnectToMicrodroid(getDevice(), mCid);
+    }
+
+    private void waitForServiceRunning() {
+        try {
+            PollingCheck.waitFor(COMPSVC_READY_LATENCY_MS, this::isServiceRunning);
+        } catch (Exception e) {
+            throw new RuntimeException("Service unavailable", e);
+        }
+    }
+
+    private boolean isServiceRunning() {
+        return tryRunOnMicrodroid("pidof compsvc") != null;
+    }
+
     private String checksumDirectoryContent(CommandRunner runner, String path)
             throws DeviceNotAvailableException {
         return runner.run("find " + path + " -type f -exec sha256sum {} \\; | sort");
