diff --git a/tests/gpu_test/OWNERS b/tests/gpu_test/OWNERS
index d599d91..528bf6e 100644
--- a/tests/gpu_test/OWNERS
+++ b/tests/gpu_test/OWNERS
@@ -1,8 +1,8 @@
-# Bug template url: https://b.corp.google.com/issues/new?component=122570&template=195524
+# Bug template url: https://b.corp.google.com/issues/new?component=24939&template=1715593
 cclao@google.com
 chrisforbes@google.com
 cnorthrop@google.com
 ianelliott@google.com
 lpy@google.com
 vantablack@google.com
-chrisglover@google.com
+kocdemir@google.com
diff --git a/tests/gpu_test/src/com/android/gpu/vts/OpenGlEsTest.java b/tests/gpu_test/src/com/android/gpu/vts/OpenGlEsTest.java
index b7cdbf8..348ba81 100644
--- a/tests/gpu_test/src/com/android/gpu/vts/OpenGlEsTest.java
+++ b/tests/gpu_test/src/com/android/gpu/vts/OpenGlEsTest.java
@@ -33,7 +33,7 @@
      * Verify that FEATURE_OPENGLES_DEQP_LEVEL (feature:android.software.opengles.deqp.level) has a
      * sufficiently high version in relation to the vendor and first product API level.
      */
-    @VsrTest(requirements = {"VSR-5.1-001", "VSR-5.1-003"})
+    @VsrTest(requirements = {"VSR-5.1-001", "VSR-5.1-003", "VSR-5.1-004"})
     @Test
     public void checkOpenGlEsDeqpLevelIsHighEnough() throws Exception {
         final int apiLevel = Util.getVendorApiLevelOrFirstProductApiLevel(getDevice());
@@ -53,8 +53,11 @@
             case Build.UDC:
                 requiredOpenGlEsDeqpLevel = VulkanTest.DEQP_LEVEL_FOR_T;
                 break;
+            case Build.VIC:
+                requiredOpenGlEsDeqpLevel = VulkanTest.DEQP_LEVEL_FOR_V;
+                break;
             default:
-                fail("Test should only run for API levels: S, Sv2, T, ...");
+                fail("Test should only run for API levels: S, Sv2, T, UDC, VIC...");
                 return;
         }
 
diff --git a/tests/gpu_test/src/com/android/gpu/vts/VulkanTest.java b/tests/gpu_test/src/com/android/gpu/vts/VulkanTest.java
index e7c2fac..2e145d4 100644
--- a/tests/gpu_test/src/com/android/gpu/vts/VulkanTest.java
+++ b/tests/gpu_test/src/com/android/gpu/vts/VulkanTest.java
@@ -16,6 +16,7 @@
 package com.android.gpu.vts;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 import static org.junit.Assume.assumeTrue;
@@ -62,7 +63,17 @@
             "VK_EXT_device_memory_report";
     private static final int VK_EXT_DEVICE_MEMORY_REPORT_SPEC_VERSION = 1;
 
+    private static final String VK_EXT_GLOBAL_PRIORITY_EXTENSION_NAME = "VK_EXT_global_priority";
+    private static final int VK_EXT_GLOBAL_PRIORITY_SPEC_VERSION = 1;
+    private static final String VK_KHR_GLOBAL_PRIORITY_EXTENSION_NAME = "VK_KHR_global_priority";
+    private static final int VK_KHR_GLOBAL_PRIORITY_SPEC_VERSION = 1;
+
+    // the string to parse to confirm that Skia is using vulkan
+    private static final String SKIA_PIPELINE = "Pipeline=Skia";
+    private static final String SKIA_VULKAN_PIPELINE = "Pipeline=Skia (Vulkan)";
+
     private JSONObject[] mVulkanDevices;
+    private JSONObject mVulkanProfiles;
 
     /**
      * Test specific setup
@@ -81,18 +92,21 @@
         for (int i = 0; i < vkjson.length(); i++) {
             mVulkanDevices[i] = vkjson.getJSONObject(i);
         }
+
+        final String profiles = getDevice().executeShellCommand("cmd gpu vkprofiles");
+        mVulkanProfiles = new JSONObject(profiles);
     }
 
     /**
-     * 64-bits devices released with Q must support Vulkan 1.1.
+     * 64-bit SoCs released with Q must support Vulkan 1.1.
      */
     @VsrTest(requirements = {"VSR-3.2.1-001.001"})
     @Test
     public void checkVulkan1_1Requirements() throws Exception {
-        // Only test for new 64-bits devices that is Q and above.
-        assumeTrue("Test does not apply for devices released before Q",
+        // Only test for new 64-bit SoCs that are Q and above.
+        assumeTrue("Test does not apply for SoCs released before Q",
                 PropertyUtil.getVsrApiLevel(getDevice()) >= Build.QT);
-        assumeTrue("Test does not apply for 32-bits devices",
+        assumeTrue("Test does not apply for 32-bit SoCs",
                 getDevice().getProperty("ro.product.cpu.abi").contains("64"));
 
         assertTrue(mVulkanDevices.length > 0);
@@ -109,19 +123,24 @@
     }
 
     /**
-     * 64-bits devices released with U must support Vulkan 1.3.
+     * 64-bit SoCs released with U must support Vulkan 1.3.
+     * All SoCs released with V must support Vulkan 1.3.
      */
-    @VsrTest(requirements = {"VSR-3.2.1-001.003"})
+    @VsrTest(requirements = {"VSR-3.2.1-001.003", "VSR-3.2.1-007"})
     @Test
     public void checkVulkan1_3Requirements() throws Exception {
-        // Only test for new 64-bits devices that is U and above.
-        assumeTrue("Test does not apply for devices released before U",
+        assumeTrue("Test does not apply for SoCs released before U",
                 PropertyUtil.getVsrApiLevel(getDevice()) >= Build.UDC);
         assumeTrue("Test does not apply for automotive devices released before V",
                 !FeatureUtil.isAutomotive(getDevice())
                         || PropertyUtil.getVsrApiLevel(getDevice()) > Build.UDC);
-        assumeTrue("Test does not apply for 32-bits devices",
-                getDevice().getProperty("ro.product.cpu.abi").contains("64"));
+
+        // Don't test if an SoC released during U is 32 bit
+        // If an SoC is released with V then both 32 and 64 bit are to be tested
+        if (PropertyUtil.getVsrApiLevel(getDevice()) == Build.UDC) {
+            assumeTrue("Test does not apply for 32-bit SoCs released with Android U",
+                    getDevice().getProperty("ro.product.cpu.abi").contains("64"));
+        }
 
         assertTrue(mVulkanDevices.length > 0);
 
@@ -137,13 +156,13 @@
     }
 
     /**
-     * Devices with only CPU Vulkan must properly set "ro.cpuvulkan.version" property.
+     * SoCs with only CPU Vulkan must properly set "ro.cpuvulkan.version" property.
      */
     @VsrTest(requirements = {"VSR-3.2.1-002"})
     @Test
     public void checkCpuVulkanRequirements() throws Exception {
-        // Only test for new devices that is Q and above.
-        assumeTrue("Test does not apply for devices released before Q",
+        // Only test for new SoCs that are Q and above.
+        assumeTrue("Test does not apply for SoCs released before Q",
                 PropertyUtil.getVsrApiLevel(getDevice()) >= Build.QT);
 
         if (mVulkanDevices.length == 0) {
@@ -179,15 +198,15 @@
      * Verify that FEATURE_VULKAN_DEQP_LEVEL (feature:android.software.vulkan.deqp.level) has a
      * sufficiently high version in relation to the vendor and first product API level.
      */
-    @VsrTest(requirements =
-                     {"VSR-3.2.2-001/VSR-3.2.2-002/VSR-3.2.2-003/VSR-3.2.2-004/VSR-3.2.2-005"})
+    @VsrTest(requirements = {"VSR-3.2.2-001", "VSR-3.2.2-002", "VSR-3.2.2-003", "VSR-3.2.2-004",
+                     "VSR-3.2.2-005", "VSR-3.2.2-006"})
     @Test
     public void
     checkVulkanDeqpLevelIsHighEnough() throws Exception {
         final int apiLevel = Util.getVendorApiLevelOrFirstProductApiLevel(getDevice());
 
         assumeTrue("Test does not apply for API level lower than R", apiLevel >= Build.RVC);
-        assumeTrue("Test does not apply for devices without Vulkan", mVulkanDevices.length > 0);
+        assumeTrue("Test does not apply for SoCs without Vulkan", mVulkanDevices.length > 0);
 
         // Map from API level to required dEQP level.
         final int requiredVulkanDeqpLevel;
@@ -230,7 +249,7 @@
     }
 
     /**
-     * For devices launching with Android 12 or higher, if the device supports Vulkan 1.1 or higher,
+     * For SoCs launching with Android 12 or higher, if the SoC supports Vulkan 1.1 or higher,
      * VK_EXT_device_memory_report extension must be supported.
      */
     @VsrTest(requirements = {"VSR-3.2.1-006"})
@@ -240,8 +259,8 @@
 
         assumeTrue("Test does not apply for API level lower than S", apiLevel >= Build.SC);
 
-        assumeTrue("Test does not apply for devices without Vulkan support",
-                mVulkanDevices.length > 0);
+        assumeTrue(
+                "Test does not apply for SoCs without Vulkan support", mVulkanDevices.length > 0);
 
         for (int i = 0; i < mVulkanDevices.length; ++i) {
             final JSONObject device = mVulkanDevices[i];
@@ -266,6 +285,126 @@
         }
     }
 
+    /**
+     * All SoCs released with V must support Skia Vulkan with HWUI
+     */
+    @VsrTest(requirements = {"VSR-3.2.1-009"})
+    @Test
+    public void checkSkiaVulkanSupport() throws Exception {
+        final int apiLevel = Util.getVendorApiLevelOrFirstProductApiLevel(getDevice());
+
+        assumeTrue("Test does not apply for SoCs launched before V", apiLevel >= Build.VIC);
+
+        final String gfxinfo = getDevice().executeShellCommand("dumpsys gfxinfo");
+        assertNotNull(gfxinfo);
+        assertTrue(gfxinfo.length() > 0);
+
+        int skiaDataIndex = gfxinfo.indexOf(SKIA_PIPELINE);
+        assertTrue("The SoCs adb shell dumpsys gfxinfo must contain a Skia pipeline",
+                skiaDataIndex >= 0);
+
+        String tmpinfo = gfxinfo;
+        while (skiaDataIndex != -1) {
+            // Remove string before next Skia pipeline
+            tmpinfo = tmpinfo.substring(skiaDataIndex);
+
+            // Get the pipeline descriptor line
+            final int newlinecharacter = tmpinfo.indexOf(System.getProperty("line.separator"));
+            String line = tmpinfo.substring(0, newlinecharacter);
+
+            // Confirm that the pipeline uses Vulkan
+            assertTrue("All Skia pipelines must use Vulkan", line.equals(SKIA_VULKAN_PIPELINE));
+
+            // Remove line and find next pipeline
+            tmpinfo = tmpinfo.substring(newlinecharacter + 1);
+            skiaDataIndex = tmpinfo.indexOf(SKIA_PIPELINE);
+        }
+    }
+
+    /**
+     * All SoCs released with V must support ABP 2022
+     */
+    @VsrTest(requirements = {"VSR-3.2.1-008"})
+    @Test
+    public void checkAndroidBaselineProfile2022Support() throws Exception {
+        final int apiLevel = Util.getVendorApiLevelOrFirstProductApiLevel(getDevice());
+
+        assumeTrue("Test does not apply for SoCs launched before V", apiLevel >= Build.VIC);
+
+        boolean hasOnlyCpuDevice = true;
+        for (JSONObject device : mVulkanDevices) {
+            if (device.getJSONObject("properties").getInt("deviceType")
+                    != VK_PHYSICAL_DEVICE_TYPE_CPU) {
+                hasOnlyCpuDevice = false;
+            }
+        }
+
+        if (hasOnlyCpuDevice) {
+            return;
+        }
+
+        String supported = mVulkanProfiles.getString("VP_ANDROID_baseline_2022");
+        assertEquals("This SoC must support VP_ANDROID_baseline_2022.", "SUPPORTED", supported);
+    }
+
+    /**
+     * All SoCs released with V must support VPA15
+     */
+    @VsrTest(requirements = {"VSR-3.2.1-008"})
+    @Test
+    public void checkVpAndroid15MinimumsSupport() throws Exception {
+        final int apiLevel = Util.getVendorApiLevelOrFirstProductApiLevel(getDevice());
+
+        assumeTrue("Test does not apply for SoCs launched before V", apiLevel >= Build.VIC);
+
+        boolean hasOnlyCpuDevice = true;
+        for (JSONObject device : mVulkanDevices) {
+            if (device.getJSONObject("properties").getInt("deviceType")
+                    != VK_PHYSICAL_DEVICE_TYPE_CPU) {
+                hasOnlyCpuDevice = false;
+            }
+        }
+
+        if (hasOnlyCpuDevice) {
+            return;
+        }
+
+        String supported = mVulkanProfiles.getString("VP_ANDROID_15_minimums");
+        assertEquals("This SoC must support VP_ANDROID_15_minimums.", "SUPPORTED", supported);
+    }
+
+    /**
+     * All SoCs released with V must support protectedMemory and VK_EXT_global_priority
+     */
+    @VsrTest(requirements = {"VSR-3.2.1-011"})
+    @Test
+    public void checkProtectedMemoryAndGlobalPrioritySupport() throws Exception {
+        final int apiLevel = Util.getVendorApiLevelOrFirstProductApiLevel(getDevice());
+
+        assumeTrue("Test does not apply for SoCs launched before V", apiLevel >= Build.VIC);
+
+        assertTrue(mVulkanDevices.length > 0);
+
+        for (JSONObject device : mVulkanDevices) {
+            if (device.getJSONObject("properties").getInt("deviceType")
+                    != VK_PHYSICAL_DEVICE_TYPE_CPU) {
+                continue;
+            }
+
+            final boolean extGlobalPriority = hasExtension(device,
+                    VK_EXT_GLOBAL_PRIORITY_EXTENSION_NAME, VK_EXT_GLOBAL_PRIORITY_SPEC_VERSION);
+            final boolean khrGlobalPriority = hasExtension(device,
+                    VK_KHR_GLOBAL_PRIORITY_EXTENSION_NAME, VK_KHR_GLOBAL_PRIORITY_SPEC_VERSION);
+            assertTrue("All non-cpu Vulkan devices must support global_priority",
+                    extGlobalPriority || khrGlobalPriority);
+
+            final int protectedMemory =
+                    device.getJSONObject("protectedMemoryFeatures").getInt("protectedMemory");
+            assertTrue("All non-cpu Vulkan devices must support protectedMemory",
+                    protectedMemory == 1);
+        }
+    }
+
     private boolean hasExtension(JSONObject device, String name, int minVersion) throws Exception {
         JSONArray extensions = device.getJSONArray("extensions");
         for (int i = 0; i < extensions.length(); i++) {
diff --git a/tools/vts-core-tradefed/Android.bp b/tools/vts-core-tradefed/Android.bp
index e766014..d54fd84 100644
--- a/tools/vts-core-tradefed/Android.bp
+++ b/tools/vts-core-tradefed/Android.bp
@@ -35,7 +35,7 @@
     wrapper: "etc/vts-tradefed",
     short_name: "VTS",
     full_name: "Vendor Test Suite",
-    version: "14_r1",
+    version: "15_r1",
     static_libs: [
         "vts-core-tradefed-harness",
         "cts-tradefed-harness",
