diff --git a/android/vm/src/main.rs b/android/vm/src/main.rs
index 81ca8fa..110e0ca 100644
--- a/android/vm/src/main.rs
+++ b/android/vm/src/main.rs
@@ -155,10 +155,10 @@
     #[arg(long)]
     devices: Vec<PathBuf>,
 
-    /// Version of GKI to use. If set, use instead of microdroid kernel
-    #[cfg(vendor_modules)]
+    /// Version of OS to use. If not set, defaults to microdroid.
+    /// You can list all available OSes via `vm info` command.
     #[arg(long)]
-    gki: Option<String>,
+    os: Option<String>,
 }
 
 impl MicrodroidConfig {
@@ -172,16 +172,6 @@
         }
     }
 
-    fn gki(&self) -> Option<&str> {
-        cfg_if::cfg_if! {
-            if #[cfg(vendor_modules)] {
-                self.gki.as_deref()
-            } else {
-                None
-            }
-        }
-    }
-
     fn devices(&self) -> &[PathBuf] {
         cfg_if::cfg_if! {
             if #[cfg(device_assignment)] {
diff --git a/android/vm/src/run.rs b/android/vm/src/run.rs
index 0e1f4cc..b07a472 100644
--- a/android/vm/src/run.rs
+++ b/android/vm/src/run.rs
@@ -140,11 +140,7 @@
         bail!("Either --config-path or --payload-binary-name must be defined")
     };
 
-    let os_name = if let Some(ver) = config.microdroid.gki() {
-        format!("microdroid_gki-{ver}")
-    } else {
-        "microdroid".to_owned()
-    };
+    let os_name = if let Some(ref os) = config.microdroid.os { os } else { "microdroid" };
 
     let payload_config_str = format!("{:?}!{:?}", config.apk, payload);
 
@@ -192,7 +188,7 @@
         memoryMib: config.common.mem.unwrap_or(0) as i32, // 0 means use the VM default
         cpuTopology: config.common.cpu_topology,
         customConfig: Some(custom_config),
-        osName: os_name,
+        osName: os_name.to_string(),
         hugePages: config.common.hugepages,
         boostUclamp: config.common.boost_uclamp,
     });
diff --git a/tests/hostside/helper/java/com/android/microdroid/test/host/MicrodroidHostTestCaseBase.java b/tests/hostside/helper/java/com/android/microdroid/test/host/MicrodroidHostTestCaseBase.java
index c5e0171..811d8db 100644
--- a/tests/hostside/helper/java/com/android/microdroid/test/host/MicrodroidHostTestCaseBase.java
+++ b/tests/hostside/helper/java/com/android/microdroid/test/host/MicrodroidHostTestCaseBase.java
@@ -40,11 +40,8 @@
 import java.io.File;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashSet;
 import java.util.List;
-import java.util.Set;
-import java.util.stream.Collectors;
+import java.util.Map;
 
 public abstract class MicrodroidHostTestCaseBase extends BaseHostJUnit4Test {
     protected static final String TEST_ROOT = "/data/local/tmp/virt/";
@@ -70,8 +67,13 @@
                             * 1000
                             / MICRODROID_COMMAND_RETRY_INTERVAL_MILLIS);
 
-    protected static final Set<String> SUPPORTED_GKI_VERSIONS =
-            Collections.unmodifiableSet(new HashSet(Arrays.asList("android15-6.6")));
+    // We use a map here because the parameterizer `DeviceParameterizedRunner` doesn't support "-"
+    // in test names.
+    // The key of the map is the name of the parameter while the value is the actual OS variant.
+    protected static final Map<String, String> SUPPORTED_OSES =
+            Map.ofEntries(
+                    Map.entry("microdroid", "microdroid"),
+                    Map.entry("android15_66", "microdroid_gki-android15-6.6"));
 
     /* Keep this sync with AssignableDevice.aidl */
     public static final class AssignableDevice {
@@ -261,13 +263,6 @@
         return parseStringArrayFieldsFromVmInfo("Available OS list: ");
     }
 
-    public List<String> getSupportedGKIVersions() throws Exception {
-        return getSupportedOSList().stream()
-                .filter(os -> os.startsWith("microdroid_gki-"))
-                .map(os -> os.replaceFirst("^microdroid_gki-", ""))
-                .collect(Collectors.toList());
-    }
-
     protected boolean isPkvmHypervisor() throws DeviceNotAvailableException {
         return "kvm.arm-protected".equals(getDevice().getProperty("ro.boot.hypervisor.version"));
     }
diff --git a/tests/hostside/java/com/android/microdroid/test/MicrodroidHostTests.java b/tests/hostside/java/com/android/microdroid/test/MicrodroidHostTests.java
index ee2da09..0f77f7a 100644
--- a/tests/hostside/java/com/android/microdroid/test/MicrodroidHostTests.java
+++ b/tests/hostside/java/com/android/microdroid/test/MicrodroidHostTests.java
@@ -78,7 +78,6 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -112,36 +111,18 @@
         }
     }
 
-    // This map is needed because the parameterizer `DeviceParameterizedRunner` doesn't support "-"
-    // in test names. The key is the test name, while the value is the actual kernel version.
-    private static HashMap<String, String> sGkiVersions = new HashMap<>();
-
-    private static void initGkiVersions() {
-        if (!sGkiVersions.isEmpty()) {
-            return;
-        }
-        sGkiVersions.put("null", null); /* use microdroid kernel */
-        // TODO(b/302465542): run only the latest GKI on presubmit to reduce running time
-        for (String gki : SUPPORTED_GKI_VERSIONS) {
-            String key = gki.split("-")[0];
-            assertThat(sGkiVersions.containsKey(key)).isFalse();
-            sGkiVersions.put(key, gki);
-        }
-    }
-
     public static List<Object[]> params() {
         List<Object[]> ret = new ArrayList<>();
-        for (Object[] gki : gkiVersions()) {
-            ret.add(new Object[] {true /* protectedVm */, gki[0]});
-            ret.add(new Object[] {false /* protectedVm */, gki[0]});
+        for (Object[] osKey : osVersions()) {
+            ret.add(new Object[] {true /* protectedVm */, osKey[0]});
+            ret.add(new Object[] {false /* protectedVm */, osKey[0]});
         }
         return ret;
     }
 
-    public static List<Object[]> gkiVersions() {
-        initGkiVersions();
-        return sGkiVersions.keySet().stream()
-                .map(gki -> new Object[] {gki})
+    public static List<Object[]> osVersions() {
+        return SUPPORTED_OSES.keySet().stream()
+                .map(osKey -> new Object[] {osKey})
                 .collect(Collectors.toList());
     }
 
@@ -304,10 +285,10 @@
             Map<String, File> keyOverrides,
             boolean isProtected,
             boolean updateBootconfigs,
-            String gki)
+            String os)
             throws Exception {
         CommandRunner android = new CommandRunner(getDevice());
-        gki = sGkiVersions.get(gki);
+        os = SUPPORTED_OSES.get(os);
 
         File virtApexDir = FileUtil.createTempDir("virt_apex");
 
@@ -359,7 +340,6 @@
         //   - its idsig
 
         // Load etc/microdroid.json
-        final String os = (gki == null) ? "microdroid" : "microdroid_gki-" + gki;
         File microdroidConfigFile = new File(virtApexEtcDir, os + ".json");
         JSONObject config = new JSONObject(FileUtil.readStringFromFile(microdroidConfigFile));
 
@@ -424,9 +404,6 @@
                         "--console " + CONSOLE_PATH,
                         "--log " + LOG_PATH,
                         configPath);
-        if (gki != null) {
-            args.add("--gki " + gki);
-        }
 
         PipedInputStream pis = new PipedInputStream();
         Process process = createRunUtil().runCmdInBackground(args, new PipedOutputStream(pis));
@@ -500,12 +477,12 @@
     }
 
     @Test
-    @Parameters(method = "gkiVersions")
-    @TestCaseName("{method}_gki_{0}")
+    @Parameters(method = "osVersions")
+    @TestCaseName("{method}_os_{0}")
     @CddTest(requirements = {"9.17/C-2-1", "9.17/C-2-2", "9.17/C-2-6"})
-    public void protectedVmRunsPvmfw(String gki) throws Exception {
+    public void protectedVmRunsPvmfw(String os) throws Exception {
         // Arrange
-        assumeKernelSupported(gki);
+        assumeKernelSupported(os);
         assumeVmTypeSupported(true);
         final String configPath = "assets/vm_config_apex.json";
 
@@ -516,7 +493,7 @@
                         .memoryMib(minMemorySize())
                         .cpuTopology("match_host")
                         .protectedVm(true)
-                        .gki(sGkiVersions.get(gki))
+                        .os(SUPPORTED_OSES.get(os))
                         .name("protected_vm_runs_pvmfw")
                         .build(getAndroidDevice());
 
@@ -533,12 +510,12 @@
     }
 
     @Test
-    @Parameters(method = "gkiVersions")
-    @TestCaseName("{method}_gki_{0}")
+    @Parameters(method = "osVersions")
+    @TestCaseName("{method}_os_{0}")
     @CddTest(requirements = {"9.17/C-2-1", "9.17/C-2-2", "9.17/C-2-5", "9.17/C-2-6"})
-    public void protectedVmWithImageSignedWithDifferentKeyFailsToVerifyPayload(String gki)
+    public void protectedVmWithImageSignedWithDifferentKeyFailsToVerifyPayload(String os)
             throws Exception {
-        assumeKernelSupported(gki);
+        assumeKernelSupported(os);
         assumeVmTypeSupported(true);
         File key = findTestFile("test.com.android.virt.pem");
 
@@ -549,7 +526,7 @@
                         /* keyOverrides= */ Map.of(),
                         /* isProtected= */ true,
                         /* updateBootconfigs= */ true,
-                        gki);
+                        os);
 
         // Assert
         vmInfo.mProcess.waitFor(5L, TimeUnit.SECONDS);
@@ -562,13 +539,13 @@
     }
 
     @Test
-    @Parameters(method = "gkiVersions")
-    @TestCaseName("{method}_gki_{0}")
+    @Parameters(method = "osVersions")
+    @TestCaseName("{method}_os_{0}")
     @CddTest(requirements = {"9.17/C-2-2", "9.17/C-2-6"})
-    public void testBootSucceedsWhenNonProtectedVmStartsWithImagesSignedWithDifferentKey(String gki)
+    public void testBootSucceedsWhenNonProtectedVmStartsWithImagesSignedWithDifferentKey(String os)
             throws Exception {
         // Preconditions
-        assumeKernelSupported(gki);
+        assumeKernelSupported(os);
 
         File key = findTestFile("test.com.android.virt.pem");
         Map<String, File> keyOverrides = Map.of();
@@ -578,7 +555,7 @@
                         keyOverrides,
                         /* isProtected= */ false,
                         /* updateBootconfigs= */ true,
-                        gki);
+                        os);
         assertThatEventually(
                 100000,
                 () ->
@@ -590,12 +567,12 @@
     }
 
     @Test
-    @Parameters(method = "gkiVersions")
-    @TestCaseName("{method}_gki_{0}")
+    @Parameters(method = "osVersions")
+    @TestCaseName("{method}_os_{0}")
     @CddTest(requirements = {"9.17/C-2-2", "9.17/C-2-5", "9.17/C-2-6"})
-    public void testBootFailsWhenVbMetaDigestDoesNotMatchBootconfig(String gki) throws Exception {
+    public void testBootFailsWhenVbMetaDigestDoesNotMatchBootconfig(String os) throws Exception {
         // protectedVmWithImageSignedWithDifferentKeyRunsPvmfw() is the protected case.
-        assumeKernelSupported(gki);
+        assumeKernelSupported(os);
 
         // Sign everything with key1 except vbmeta
         File key = findTestFile("test.com.android.virt.pem");
@@ -606,7 +583,7 @@
                         Map.of(),
                         /* isProtected= */ false,
                         /* updateBootconfigs= */ false,
-                        gki);
+                        os);
         // Wait so that init can print errors to console (time in cuttlefish >> in real device)
         assertThatEventually(
                 100000,
@@ -654,7 +631,7 @@
     }
 
     private boolean isTombstoneGeneratedWithCmd(
-            boolean protectedVm, String gki, String configPath, String... crashCommand)
+            boolean protectedVm, String os, String configPath, String... crashCommand)
             throws Exception {
         CommandRunner android = new CommandRunner(getDevice());
         String testStartTime = android.runWithTimeout(1000, "date", "'+%Y-%m-%d %H:%M:%S.%N'");
@@ -665,7 +642,7 @@
                         .memoryMib(minMemorySize())
                         .cpuTopology("match_host")
                         .protectedVm(protectedVm)
-                        .gki(sGkiVersions.get(gki))
+                        .os(SUPPORTED_OSES.get(os))
                         .build(getAndroidDevice());
         mMicrodroidDevice.waitForBootComplete(BOOT_COMPLETE_TIMEOUT);
         mMicrodroidDevice.enableAdbRoot();
@@ -682,18 +659,18 @@
 
     @Test
     @Parameters(method = "params")
-    @TestCaseName("{method}_protectedVm_{0}_gki_{1}")
-    public void testTombstonesAreGeneratedUponUserspaceCrash(boolean protectedVm, String gki)
+    @TestCaseName("{method}_protectedVm_{0}_os_{1}")
+    public void testTombstonesAreGeneratedUponUserspaceCrash(boolean protectedVm, String os)
             throws Exception {
         // Preconditions
-        assumeKernelSupported(gki);
+        assumeKernelSupported(os);
         assumeVmTypeSupported(protectedVm);
         // TODO(b/291867858): tombstones are failing in HWASAN enabled Microdroid.
         assumeFalse("tombstones are failing in HWASAN enabled Microdroid.", isHwasan());
         assertThat(
                         isTombstoneGeneratedWithCmd(
                                 protectedVm,
-                                gki,
+                                os,
                                 "assets/vm_config.json",
                                 "kill",
                                 "-SIGSEGV",
@@ -703,18 +680,18 @@
 
     @Test
     @Parameters(method = "params")
-    @TestCaseName("{method}_protectedVm_{0}_gki_{1}")
+    @TestCaseName("{method}_protectedVm_{0}_os_{1}")
     public void testTombstonesAreNotGeneratedIfNotExportedUponUserspaceCrash(
-            boolean protectedVm, String gki) throws Exception {
+            boolean protectedVm, String os) throws Exception {
         // Preconditions
-        assumeKernelSupported(gki);
+        assumeKernelSupported(os);
         assumeVmTypeSupported(protectedVm);
         // TODO(b/291867858): tombstones are failing in HWASAN enabled Microdroid.
         assumeFalse("tombstones are failing in HWASAN enabled Microdroid.", isHwasan());
         assertThat(
                         isTombstoneGeneratedWithCmd(
                                 protectedVm,
-                                gki,
+                                os,
                                 "assets/vm_config_no_tombstone.json",
                                 "kill",
                                 "-SIGSEGV",
@@ -724,12 +701,12 @@
 
     @Test
     @Parameters(method = "params")
-    @TestCaseName("{method}_protectedVm_{0}_gki_{1}")
+    @TestCaseName("{method}_protectedVm_{0}_os_{1}")
     @Ignore("b/341087884") // TODO(b/341087884): fix & re-enable
-    public void testTombstonesAreGeneratedUponKernelCrash(boolean protectedVm, String gki)
+    public void testTombstonesAreGeneratedUponKernelCrash(boolean protectedVm, String os)
             throws Exception {
         // Preconditions
-        assumeKernelSupported(gki);
+        assumeKernelSupported(os);
         assumeVmTypeSupported(protectedVm);
         assumeFalse("Cuttlefish is not supported", isCuttlefish());
         assumeFalse("Skipping test because ramdump is disabled on user build", isUserBuild());
@@ -738,7 +715,7 @@
         assertThat(
                         isTombstoneGeneratedWithCmd(
                                 protectedVm,
-                                gki,
+                                os,
                                 "assets/vm_config.json",
                                 "echo",
                                 "c",
@@ -748,12 +725,12 @@
     }
 
     private boolean isTombstoneGeneratedWithVmRunApp(
-            boolean protectedVm, String gki, boolean debuggable, String... additionalArgs)
+            boolean protectedVm, String os, boolean debuggable, String... additionalArgs)
             throws Exception {
         // we can't use microdroid builder as it wants ADB connection (debuggable)
         CommandRunner android = new CommandRunner(getDevice());
         String testStartTime = android.runWithTimeout(1000, "date", "'+%Y-%m-%d %H:%M:%S.%N'");
-        gki = sGkiVersions.get(gki);
+        os = SUPPORTED_OSES.get(os);
 
         android.run("rm", "-rf", TEST_ROOT + "*");
         android.run("mkdir", "-p", TEST_ROOT + "*");
@@ -780,10 +757,8 @@
         if (protectedVm) {
             cmd.add("--protected");
         }
-        if (gki != null) {
-            cmd.add("--gki");
-            cmd.add(gki);
-        }
+        cmd.add("--os");
+        cmd.add(os);
         Collections.addAll(cmd, additionalArgs);
 
         android.run(cmd.toArray(new String[0]));
@@ -791,10 +766,10 @@
     }
 
     private boolean isTombstoneGeneratedWithCrashPayload(
-            boolean protectedVm, String gki, boolean debuggable) throws Exception {
+            boolean protectedVm, String os, boolean debuggable) throws Exception {
         return isTombstoneGeneratedWithVmRunApp(
                 protectedVm,
-                gki,
+                os,
                 debuggable,
                 "--payload-binary-name",
                 "MicrodroidCrashNativeLib.so");
@@ -802,76 +777,76 @@
 
     @Test
     @Parameters(method = "params")
-    @TestCaseName("{method}_protectedVm_{0}_gki_{1}")
-    public void testTombstonesAreGeneratedWithCrashPayload(boolean protectedVm, String gki)
+    @TestCaseName("{method}_protectedVm_{0}_os_{1}")
+    public void testTombstonesAreGeneratedWithCrashPayload(boolean protectedVm, String os)
             throws Exception {
         // Preconditions
         // TODO(b/291867858): tombstones are failing in HWASAN enabled Microdroid.
         assumeFalse("tombstones are failing in HWASAN enabled Microdroid.", isHwasan());
-        assumeKernelSupported(gki);
+        assumeKernelSupported(os);
         assumeVmTypeSupported(protectedVm);
 
         // Act
-        assertThat(isTombstoneGeneratedWithCrashPayload(protectedVm, gki, /* debuggable= */ true))
+        assertThat(isTombstoneGeneratedWithCrashPayload(protectedVm, os, /* debuggable= */ true))
                 .isTrue();
     }
 
     @Test
     @Parameters(method = "params")
-    @TestCaseName("{method}_protectedVm_{0}_gki_{1}")
+    @TestCaseName("{method}_protectedVm_{0}_os_{1}")
     public void testTombstonesAreNotGeneratedWithCrashPayloadWhenNonDebuggable(
-            boolean protectedVm, String gki) throws Exception {
+            boolean protectedVm, String os) throws Exception {
         // Preconditions
         // TODO(b/291867858): tombstones are failing in HWASAN enabled Microdroid.
         assumeFalse("tombstones are failing in HWASAN enabled Microdroid.", isHwasan());
-        assumeKernelSupported(gki);
+        assumeKernelSupported(os);
         assumeVmTypeSupported(protectedVm);
 
         // Act
-        assertThat(isTombstoneGeneratedWithCrashPayload(protectedVm, gki, /* debuggable= */ false))
+        assertThat(isTombstoneGeneratedWithCrashPayload(protectedVm, os, /* debuggable= */ false))
                 .isFalse();
     }
 
     private boolean isTombstoneGeneratedWithCrashConfig(
-            boolean protectedVm, String gki, boolean debuggable) throws Exception {
+            boolean protectedVm, String os, boolean debuggable) throws Exception {
         return isTombstoneGeneratedWithVmRunApp(
-                protectedVm, gki, debuggable, "--config-path", "assets/vm_config_crash.json");
+                protectedVm, os, debuggable, "--config-path", "assets/vm_config_crash.json");
     }
 
     @Test
     @Parameters(method = "params")
-    @TestCaseName("{method}_protectedVm_{0}_gki_{1}")
-    public void testTombstonesAreGeneratedWithCrashConfig(boolean protectedVm, String gki)
+    @TestCaseName("{method}_protectedVm_{0}_os_{1}")
+    public void testTombstonesAreGeneratedWithCrashConfig(boolean protectedVm, String os)
             throws Exception {
         // Preconditions
         // TODO(b/291867858): tombstones are failing in HWASAN enabled Microdroid.
         assumeFalse("tombstones are failing in HWASAN enabled Microdroid.", isHwasan());
-        assumeKernelSupported(gki);
+        assumeKernelSupported(os);
         assumeVmTypeSupported(protectedVm);
 
         // Act
-        assertThat(isTombstoneGeneratedWithCrashConfig(protectedVm, gki, /* debuggable= */ true))
+        assertThat(isTombstoneGeneratedWithCrashConfig(protectedVm, os, /* debuggable= */ true))
                 .isTrue();
     }
 
     @Test
     @Parameters(method = "params")
-    @TestCaseName("{method}_protectedVm_{0}_gki_{1}")
+    @TestCaseName("{method}_protectedVm_{0}_os_{1}")
     public void testTombstonesAreNotGeneratedWithCrashConfigWhenNonDebuggable(
-            boolean protectedVm, String gki) throws Exception {
+            boolean protectedVm, String os) throws Exception {
         // TODO(b/291867858): tombstones are failing in HWASAN enabled Microdroid.
         assumeFalse("tombstones are failing in HWASAN enabled Microdroid.", isHwasan());
-        assumeKernelSupported(gki);
+        assumeKernelSupported(os);
         assumeVmTypeSupported(protectedVm);
-        assertThat(isTombstoneGeneratedWithCrashConfig(protectedVm, gki, /* debuggable= */ false))
+        assertThat(isTombstoneGeneratedWithCrashConfig(protectedVm, os, /* debuggable= */ false))
                 .isFalse();
     }
 
     @Test
     @Parameters(method = "params")
-    @TestCaseName("{method}_protectedVm_{0}_gki_{1}")
-    public void testTelemetryPushedAtoms(boolean protectedVm, String gki) throws Exception {
-        assumeKernelSupported(gki);
+    @TestCaseName("{method}_protectedVm_{0}_os_{1}")
+    public void testTelemetryPushedAtoms(boolean protectedVm, String os) throws Exception {
+        assumeKernelSupported(os);
         assumeVmTypeSupported(protectedVm);
         // Reset statsd config and report before the test
         ConfigUtils.removeConfig(getDevice());
@@ -894,7 +869,7 @@
                         .memoryMib(minMemorySize())
                         .cpuTopology("match_host")
                         .protectedVm(protectedVm)
-                        .gki(sGkiVersions.get(gki))
+                        .os(SUPPORTED_OSES.get(os))
                         .name("test_telemetry_pushed_atoms")
                         .build(device);
         microdroid.waitForBootComplete(BOOT_COMPLETE_TIMEOUT);
@@ -1031,11 +1006,11 @@
 
     @Test
     @Parameters(method = "params")
-    @TestCaseName("{method}_protectedVm_{0}_gki_{1}")
+    @TestCaseName("{method}_protectedVm_{0}_os_{1}")
     @CddTest(requirements = {"9.17/C-1-1", "9.17/C-1-2", "9.17/C/1-3"})
-    public void testMicrodroidBoots(boolean protectedVm, String gki) throws Exception {
+    public void testMicrodroidBoots(boolean protectedVm, String os) throws Exception {
         // Preconditions
-        assumeKernelSupported(gki);
+        assumeKernelSupported(os);
         assumeVmTypeSupported(protectedVm);
 
         final String configPath = "assets/vm_config.json"; // path inside the APK
@@ -1046,34 +1021,34 @@
                         .cpuTopology("match_host")
                         .protectedVm(protectedVm)
                         .name("test_microdroid_boots")
-                        .gki(sGkiVersions.get(gki)));
+                        .os(SUPPORTED_OSES.get(os)));
     }
 
     @Test
-    public void testMicrodroidRamUsage_protectedVm_true_gki_null() throws Exception {
-        checkMicrodroidRamUsage(/* protectedVm= */ true, /* gki= */ "null");
+    public void testMicrodroidRamUsage_protectedVm_true_os_microdroid() throws Exception {
+        checkMicrodroidRamUsage(/* protectedVm= */ true, /* os= */ "microdroid");
     }
 
     @Test
-    public void testMicrodroidRamUsage_protectedVm_false_gki_null() throws Exception {
-        checkMicrodroidRamUsage(/* protectedVm= */ false, /* gki= */ "null");
+    public void testMicrodroidRamUsage_protectedVm_false_os_microdroid() throws Exception {
+        checkMicrodroidRamUsage(/* protectedVm= */ false, /* os= */ "microdroid");
     }
 
     @Test
-    public void testMicrodroidRamUsage_protectedVm_true_gki_android15() throws Exception {
-        checkMicrodroidRamUsage(/* protectedVm= */ true, /* gki= */ "android15");
+    public void testMicrodroidRamUsage_protectedVm_true_os_android15_66() throws Exception {
+        checkMicrodroidRamUsage(/* protectedVm= */ true, /* os= */ "android15_66");
     }
 
     @Test
-    public void testMicrodroidRamUsage_protectedVm_false_gki_android15() throws Exception {
-        checkMicrodroidRamUsage(/* protectedVm= */ false, /* gki= */ "android15");
+    public void testMicrodroidRamUsage_protectedVm_false_os_android15_66() throws Exception {
+        checkMicrodroidRamUsage(/* protectedVm= */ false, /* os= */ "android15_66");
     }
 
     // TODO(b/209036125): Upgrade this function to a parameterized test once metrics can be
     // collected with tradefed parameterizer.
-    void checkMicrodroidRamUsage(boolean protectedVm, String gki) throws Exception {
+    void checkMicrodroidRamUsage(boolean protectedVm, String os) throws Exception {
         // Preconditions
-        assumeKernelSupported(gki);
+        assumeKernelSupported(os);
         assumeVmTypeSupported(protectedVm);
 
         final String configPath = "assets/vm_config.json";
@@ -1083,7 +1058,7 @@
                         .memoryMib(minMemorySize())
                         .cpuTopology("match_host")
                         .protectedVm(protectedVm)
-                        .gki(sGkiVersions.get(gki))
+                        .os(SUPPORTED_OSES.get(os))
                         .name("test_microdroid_ram_usage")
                         .build(getAndroidDevice());
         mMicrodroidDevice.waitForBootComplete(BOOT_COMPLETE_TIMEOUT);
@@ -1266,10 +1241,10 @@
 
     @Test
     @Parameters(method = "params")
-    @TestCaseName("{method}_protectedVm_{0}_gki_{1}")
-    public void testDeviceAssignment(boolean protectedVm, String gki) throws Exception {
+    @TestCaseName("{method}_protectedVm_{0}_os_{1}")
+    public void testDeviceAssignment(boolean protectedVm, String os) throws Exception {
         // Preconditions
-        assumeKernelSupported(gki);
+        assumeKernelSupported(os);
         assumeVmTypeSupported(protectedVm);
         assumeVfioPlatformSupported();
 
@@ -1280,7 +1255,7 @@
 
         // Try assign devices one by one
         for (AssignableDevice device : devices) {
-            launchWithDeviceAssignment(device.node, protectedVm, gki);
+            launchWithDeviceAssignment(device.node, protectedVm, os);
 
             String dtPath =
                     new CommandRunner(mMicrodroidDevice)
@@ -1302,7 +1277,7 @@
         }
     }
 
-    private void launchWithDeviceAssignment(String device, boolean protectedVm, String gki)
+    private void launchWithDeviceAssignment(String device, boolean protectedVm, String os)
             throws Exception {
         Objects.requireNonNull(device);
         final String configPath = "assets/vm_config.json";
@@ -1313,7 +1288,7 @@
                         .memoryMib(minMemorySize())
                         .cpuTopology("match_host")
                         .protectedVm(protectedVm)
-                        .gki(sGkiVersions.get(gki))
+                        .os(SUPPORTED_OSES.get(os))
                         .addAssignableDevice(device)
                         .build(getAndroidDevice());
 
@@ -1322,20 +1297,18 @@
     }
 
     @Test
-    public void testGkiVersions() throws Exception {
-        for (String gki : getSupportedGKIVersions()) {
-            assertTrue(
-                    "Unknown gki \"" + gki + "\". Supported gkis: " + SUPPORTED_GKI_VERSIONS,
-                    SUPPORTED_GKI_VERSIONS.contains(gki));
+    public void testOsVersions() throws Exception {
+        for (String os : getSupportedOSList()) {
+            assertWithMessage("Unknown OS \"%s\"", os).that(SUPPORTED_OSES.values()).contains(os);
         }
     }
 
     @Test
     @Parameters(method = "params")
-    @TestCaseName("{method}_protectedVm_{0}_gki_{1}")
-    public void testHugePages(boolean protectedVm, String gki) throws Exception {
+    @TestCaseName("{method}_protectedVm_{0}_os_{1}")
+    public void testHugePages(boolean protectedVm, String os) throws Exception {
         // Preconditions
-        assumeKernelSupported(gki);
+        assumeKernelSupported(os);
         assumeVmTypeSupported(protectedVm);
 
         ITestDevice device = getDevice();
@@ -1359,7 +1332,7 @@
                         .memoryMib(minMemorySize())
                         .cpuTopology("match_host")
                         .protectedVm(protectedVm)
-                        .gki(sGkiVersions.get(gki))
+                        .os(SUPPORTED_OSES.get(os))
                         .hugePages(true)
                         .name("test_huge_pages")
                         .build(getAndroidDevice());
@@ -1439,13 +1412,11 @@
         return runUtil;
     }
 
-    private void assumeKernelSupported(String gki) throws Exception {
-        String gkiVersion = sGkiVersions.get(gki);
-        if (gkiVersion != null) {
-            assumeTrue(
-                    "Skipping test as the GKI is not supported: " + gkiVersion,
-                    getSupportedGKIVersions().contains(gkiVersion));
-        }
+    private void assumeKernelSupported(String osKey) throws Exception {
+        String os = SUPPORTED_OSES.get(osKey);
+        assumeTrue(
+                "Skipping test as OS \"" + os + "\" is not supported",
+                getSupportedOSList().contains(os));
     }
 
     private void assumeVmTypeSupported(boolean protectedVm) throws Exception {
