diff --git a/compatibility_matrices/compatibility_matrix.current.xml b/compatibility_matrices/compatibility_matrix.current.xml
index 62067bf..f03008a 100644
--- a/compatibility_matrices/compatibility_matrix.current.xml
+++ b/compatibility_matrices/compatibility_matrix.current.xml
@@ -536,7 +536,7 @@
     </hal>
     <hal format="hidl" optional="true">
         <name>android.hardware.soundtrigger</name>
-        <version>2.3-4</version>
+        <version>2.3</version>
         <interface>
             <name>ISoundTriggerHw</name>
             <instance>default</instance>
diff --git a/soundtrigger/2.4/Android.bp b/soundtrigger/2.4/Android.bp
deleted file mode 100644
index 44befc3..0000000
--- a/soundtrigger/2.4/Android.bp
+++ /dev/null
@@ -1,30 +0,0 @@
-// This file is autogenerated by hidl-gen -Landroidbp.
-
-package {
-    // See: http://go/android-license-faq
-    // A large-scale-change added 'default_applicable_licenses' to import
-    // all of the 'license_kinds' from "hardware_interfaces_license"
-    // to get the below license kinds:
-    //   SPDX-license-identifier-Apache-2.0
-    default_applicable_licenses: ["hardware_interfaces_license"],
-}
-
-hidl_interface {
-    name: "android.hardware.soundtrigger@2.4",
-    root: "android.hardware",
-    srcs: [
-        "ISoundTriggerHw.hal",
-        "ISoundTriggerHwCallback.hal",
-        "ISoundTriggerHwGlobalCallback.hal",
-    ],
-    interfaces: [
-        "android.hardware.audio.common@2.0",
-        "android.hardware.soundtrigger@2.0",
-        "android.hardware.soundtrigger@2.1",
-        "android.hardware.soundtrigger@2.2",
-        "android.hardware.soundtrigger@2.3",
-        "android.hidl.base@1.0",
-        "android.hidl.safe_union@1.0",
-    ],
-    gen_java: true,
-}
diff --git a/soundtrigger/2.4/ISoundTriggerHw.hal b/soundtrigger/2.4/ISoundTriggerHw.hal
deleted file mode 100644
index fd39303..0000000
--- a/soundtrigger/2.4/ISoundTriggerHw.hal
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.hardware.soundtrigger@2.4;
-
-import @2.0::SoundModelHandle;
-import @2.1::ISoundTriggerHw.SoundModel;
-import @2.1::ISoundTriggerHw.PhraseSoundModel;
-import @2.3::ISoundTriggerHw;
-import @2.3::RecognitionConfig;
-import ISoundTriggerHwCallback;
-import ISoundTriggerHwGlobalCallback;
-
-/**
- * SoundTrigger HAL interface. Used for hardware recognition of hotwords
- * and other sounds.
- *
- * Important notes about the threading model:
- * ==========================================
- * Both this interface and the corresponding callback interface use a synchronized calling
- * convention. This model comes with some advantages, but also with some risks of deadlocks if the
- * implementation does not handle this correctly. Please consider the following:
- * - After stopRecognition() returns no more recognition events for that model may be sent. This
- *   implies that any queues holding such events must be flushed before the call returns and that
- *   may imply that callback from the HAL to the client are done while stopRecognition() is blocked.
- *   This is OK, and supported by the framework.
- * - Similarly, the same relationship applies between unloadModel() and subsequent callbacks to
- *   modelUnloaded().
- * - Other than these two cases, calls into the HAL *MAY NOT* block on callbacks from the HAL, or
- *   else deadlock conditions may result, which may be handled by rebooting of the HAL process and
- *   cause service outages.
- *
- * Similarly, it is expected that a single call to startRecognition() generates at most one event
- * (the model automatically becomes stopped when the event occurs, until explicitly started again)
- * and that after a modelUnloaded() event no more events would be sent regarding the model.
- * Note that a getModelState() call may generate a recognition event, but this event DOES NOT modify
- * the model state - the model remains started.
- *
- * The HAL is expected to correctly handle a stopRecognition() call even after it sent an event
- * indicating that recognition is stopped and an unloadModel() call even after it sent an event
- * indicating that it has been unloaded. This is required in order to prevent race conditions
- * between these calls. This also implies that model handles should generally not be reused until
- * explicitly unloaded. To avoid the rare possibility of running out of handles, the framework will
- * call unloadModel() on models that have been preemptively unloaded by the HAL.
- *
- * Due to the asynchronous nature of recognition events and preemptive model unloading, the HAL must
- * correctly handle requests that would have been valid before an event has been delivered, but
- * became moot as result of the event. Namely:
- * - stopRecognition() may be called on a model that has already delivered an event and became
- *   inactive as a result. The HAL must return a successful return code in this case.
- * - Furthermore, if a model is preemptively unloaded after it triggers (typically, this would
- *   happen when it is first aborted and immediately preemptively unloaded), stopRecognition() may
- *   be called on it. The HAL must return a successful return code in this case.
- * - startRecognition() may be called on a model that has been preemptively unloaded. In this case,
- *   the HAL must return -EBUSY to indicate that the operation is temporarily unsuccessful.
- * - unloadSoundModel() may be called on a model that has been preemptively unloaded. The HAL must
- *   return a successful return code in this case.
- *
- * Important notes about resource constraints and concurrency
- * =========================================================
- * Up until this version, the framework would enforce concurrency constraints expressed by the
- * Properties presented by the soundtrigger instance. These include constraints on the maximum
- * amount of models that can be loaded at the same time and on running recognition while capturing
- * from the microphone.
- * This version changes the approach for how these constraints are modeled, both offering the HAL
- * implementation more flexibility and simplifying the framework's job in enforcing these
- * limitations. Note that there is no change for how the framework behaves with earlier versions,
- * everything described below only applies to this version and onward.
- * The way this is achieved is as following:
- * - The framework will no longer enforce constraints on concurrent loading of models, as expressed
- *   in the Properties.maxSoundModels field (this property is merely a hint at this point and may be
- *   deprecated in the future.
- * - The framework will no longer enforce constraints on concurrency of audio recording and
- *   soundtrigger operation, as expressed in the Properties.concurrentCapture field (this property
- *   is merely a hint at this point and may be deprecated in the future).
- * - The framework will no longer enforce constraints on concurrent loading of models, as expressed
- *   in the Properties (these properties are merely hints at this point and may be deprecated in the
- *   future.
- * - The HAL implementation is free to reject starting of any model at any time by having the
- *   respective start*() method return -EBUSY.
- * - The HAL implementation is free to reject loading of any model at any time by having the
- *   respective load*() method return -EBUSY.
- * - The HAL implementation is free to preemptively stop a previously started model at its own
- *   discretion (for example, if a higher priority use-case which cannot coexist with detection
- *   has been requested). The HAL must notify the framework of the preemption by sending a
- *   recognition event with an `ABORT` status. The implementation must NOT attempt to restart the
- *   recognition automatically when conditions change.
- * - The HAL implementation is free to preemptively unload a previously loaded model at its own
- *   discretion (for example, if a higher-priority model is being loaded and the two cannot
- *   coexist). When doing so, it must first abort the detection if active (as per above) and then
- *   notify the framework of the unload using the newly added modelUnloaded callback.
- * - When conditions change, such that a model that couldn't previously load or start or that had
- *   previously been preemptively stopped or unloaded, the HAL must notify the framework via the
- *   newly added tryAgain() callback. This callback is not a guarantee that any operation would now
- *   succeed, but merely a hint that retrying something that had previously failed, now MAY succeed.
- *   Until this callback arrives, the framework may assume that any operation that had previously
- *   failed or aborted would still fail if retried, so the implementation should not forget to
- *   deliver it. There are no guarantees regarding how the framework may respond to this event and
- *   the order in which it may choose to reload/restart its models. Typically, as result of this
- *   event the framework will make a single attempt per model to bring this model to its desired
- *   state (loaded, started).
- */
-interface ISoundTriggerHw extends @2.3::ISoundTriggerHw {
-    /**
-     * This will get called at most once per every attachment to the service.
-     *
-     * All events not tied to a specific model should go through this callback.
-     */
-    registerGlobalCallback(ISoundTriggerHwGlobalCallback callback);
-
-    /**
-     * Load a sound model. Once loaded, recognition of this model can be
-     * started and stopped.
-     * The implementation returns a unique handle used by other functions
-     * (unloadSoundModel(), startRecognition*(), etc...
-     *
-     * Must have the exact same semantics as loadSoundModel from ISoundTriggerHw@2.3 except that the
-     * return values have changed and that there is no cookie provided (the implementation may pass
-     * any value to the callback, as it is ignored).
-     *
-     * @param soundModel A SoundModel structure describing the sound model
-     *     to load.
-     * @param callback The callback interface on which the soundModelCallback*()
-     *     method must be called upon completion and modelUnloaded() upon preempted unload.
-     * @return retval Operation completion status: 0 in case of success,
-     *     -EBUSY in case the operation is temporarily unavailable (but possible in general).
-     * @return modelHandle A unique handle assigned by the HAL for use by the
-     *     framework when controlling activity for this sound model.
-     */
-    loadSoundModel_2_4(SoundModel soundModel, ISoundTriggerHwCallback callback)
-            generates (int32_t retval, SoundModelHandle modelHandle);
-
-    /**
-     * Load a key phrase sound model. Once loaded, recognition of this model can
-     * be started and stopped. Only one active recognition per model at a time.
-     * The SoundTrigger service must handle concurrent recognition requests by
-     * different users/applications on the same model.
-     * The implementation returns a unique handle used by other functions
-     * (unloadSoundModel(), startRecognition*(), etc...
-     *
-     * Must have the exact same semantics as loadPhraseSoundModel from ISoundTriggerHw@2.3 except
-     * that the return values have changed and that there is no cookie provided (the implementation
-     * may pass any value to the callback, as it is ignored).
-     *
-     * @param soundModel A PhraseSoundModel structure describing the sound model
-     *     to load.
-     * @param callback The callback interface on which the soundModelCallback*()
-     *     method must be called upon completion and modelUnloaded() upon preempted unload.
-     * @return retval Operation completion status: 0 in case of success,
-     *     -EBUSY in case the operation is temporarily unavailable (but possible in general).
-     * @return modelHandle A unique handle assigned by the HAL for use by the
-     *     framework when controlling activity for this sound model.
-     */
-    loadPhraseSoundModel_2_4(PhraseSoundModel soundModel, ISoundTriggerHwCallback callback)
-            generates (int32_t retval, SoundModelHandle modelHandle);
-
-    /**
-     * Start recognition on a given model. Only one recognition active
-     * at a time per model. Once recognition succeeds or fails, the callback
-     * associated with the model handle is called.
-     *
-     * Must have the exact same semantics as startRecognition from ISoundTriggerHw@2.3 except that
-     * there are different expectations of the return value and that there is no cookie provided
-     * (the implementation may pass any value to the callback, as it is ignored).
-     *
-     * @param modelHandle the handle of the sound model to use for recognition
-     * @param config A RecognitionConfig structure containing attributes of the
-     *     recognition to perform
-     * @param callback The callback interface on which the recognitionCallback()
-     *     method must be called upon recognition.
-     * @return retval Operation completion status: 0 in case of success,
-     *     -EBUSY in case the operation is temporarily unavailable (but possible in general), or in
-     *            case model has been preemtively unloaded.
-     */
-    startRecognition_2_4(SoundModelHandle modelHandle, RecognitionConfig config)
-            generates (int32_t retval);
-};
diff --git a/soundtrigger/2.4/ISoundTriggerHwCallback.hal b/soundtrigger/2.4/ISoundTriggerHwCallback.hal
deleted file mode 100644
index 594deb0..0000000
--- a/soundtrigger/2.4/ISoundTriggerHwCallback.hal
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.hardware.soundtrigger@2.4;
-
-import @2.0::SoundModelHandle;
-import @2.1::ISoundTriggerHwCallback;
-
-/**
- * SoundTrigger HAL per-model Callback interface.
- */
-interface ISoundTriggerHwCallback extends @2.1::ISoundTriggerHwCallback {
-    /**
-     * Callback method called by the HAL when a model has been unloaded at the HAL implementation's
-     * discretion. Only a stopped model may be unloaded.
-     * This event is NOT sent as part of an unload sequence initiated by the client.
-     *
-     * @param model The model handle.
-     */
-    modelUnloaded(SoundModelHandle model);
-};
diff --git a/soundtrigger/2.4/ISoundTriggerHwGlobalCallback.hal b/soundtrigger/2.4/ISoundTriggerHwGlobalCallback.hal
deleted file mode 100644
index 2f1a977..0000000
--- a/soundtrigger/2.4/ISoundTriggerHwGlobalCallback.hal
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.hardware.soundtrigger@2.4;
-
-/**
- * SoundTrigger HAL callback interface for events not associated with a particular model.
- */
-interface ISoundTriggerHwGlobalCallback {
-    /**
-     * Callback method called by the HAL whenever internal conditions have been made available, such
-     * that a call that would previously have failed with an -EBUSY status may now succeed.
-     * There is no guarantee that any call would succeed following this event. It is merely a hint
-     * to the client that it may retry.
-     * Conversely, any call that have failed previously with -EBUSY is guaranteed to fail again if
-     * retried, until this callback is delivered.
-     */
-    onResourcesAvailable();
-};
diff --git a/soundtrigger/2.4/cli/Android.bp b/soundtrigger/2.4/cli/Android.bp
deleted file mode 100644
index 8d0979b..0000000
--- a/soundtrigger/2.4/cli/Android.bp
+++ /dev/null
@@ -1,17 +0,0 @@
-package {
-    // See: http://go/android-license-faq
-    // A large-scale-change added 'default_applicable_licenses' to import
-    // all of the 'license_kinds' from "hardware_interfaces_license"
-    // to get the below license kinds:
-    //   SPDX-license-identifier-Apache-2.0
-    default_applicable_licenses: ["hardware_interfaces_license"],
-}
-
-java_binary {
-    name: "sthal_cli_2.4",
-    wrapper: "sthal_cli_2.4",
-    srcs: ["java/**/*.java"],
-    static_libs: [
-        "android.hardware.soundtrigger-V2.4-java",
-    ],
-}
diff --git a/soundtrigger/2.4/cli/OWNERS b/soundtrigger/2.4/cli/OWNERS
deleted file mode 100644
index e21b66e..0000000
--- a/soundtrigger/2.4/cli/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-include /media/java/android/media/soundtrigger_middleware/OWNERS
diff --git a/soundtrigger/2.4/cli/java/android/hardware/soundtrigger/V2_4/cli/SthalCli.java b/soundtrigger/2.4/cli/java/android/hardware/soundtrigger/V2_4/cli/SthalCli.java
deleted file mode 100644
index 4931105..0000000
--- a/soundtrigger/2.4/cli/java/android/hardware/soundtrigger/V2_4/cli/SthalCli.java
+++ /dev/null
@@ -1,401 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.hardware.soundtrigger.V2_4.cli;
-
-import android.hardware.soundtrigger.V2_0.PhraseRecognitionExtra;
-import android.hardware.soundtrigger.V2_0.RecognitionMode;
-import android.hardware.soundtrigger.V2_0.SoundModelType;
-import android.hardware.soundtrigger.V2_3.OptionalModelParameterRange;
-import android.hardware.soundtrigger.V2_4.ISoundTriggerHw;
-import android.hardware.soundtrigger.V2_4.ISoundTriggerHwCallback;
-import android.hardware.soundtrigger.V2_4.ISoundTriggerHwGlobalCallback;
-import android.os.HidlMemoryUtil;
-import android.os.HwBinder;
-import android.os.RemoteException;
-import android.os.SystemProperties;
-
-import java.util.Scanner;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-
-/**
- * This is a quick-and-dirty sound trigger HAL console mock.
- *
- * It would only work on userdebug builds.
- *
- * When this app is started, it will initially:
- * - Register a ISoundTriggerHw HAL with an instance name "mock".
- * - Set a sysprop that tells SoundTriggerMiddlewareService to try to connect to the mock instance
- * rather than the default one.
- * - Reboot the real (default) HAL.
- *
- * In response to that, SoundTriggerMiddlewareService is going to connect to the mock HAL and resume
- * normal operation.
- *
- * Our mock HAL will print to stdout every call it receives as well as expose a basic set of
- * operations for sending event callbacks to the client. This allows us to simulate the frameworks
- * behavior in response to different HAL behaviors.
- */
-public class SthalCli {
-    private static SoundTriggerImpl mService;
-    private static final Scanner scanner = new Scanner(System.in);
-
-    public static void main(String[] args) {
-        try {
-            System.out.println("Registering mock STHAL");
-            HwBinder.setTrebleTestingOverride(true);
-            mService = new SoundTriggerImpl();
-            mService.registerAsService("mock");
-
-            System.out.println("Rebooting STHAL");
-            SystemProperties.set("debug.soundtrigger_middleware.use_mock_hal", "2");
-            SystemProperties.set("sys.audio.restart.hal", "1");
-
-            while (processCommand()) ;
-        } catch (Exception e) {
-            e.printStackTrace();
-        } finally {
-            cleanup();
-        }
-    }
-
-    private static void cleanup() {
-        System.out.println("Cleaning up.");
-        SystemProperties.set("debug.soundtrigger_middleware.use_mock_hal", null);
-        HwBinder.setTrebleTestingOverride(false);
-    }
-
-    private static boolean processCommand() {
-        String line = scanner.nextLine();
-        String[] tokens = line.split("\\s+");
-        if (tokens.length < 1) {
-            return false;
-        }
-        switch (tokens[0]) {
-            case "q":
-                return false;
-
-            case "a":
-                mService.sendOnResourcesAvailable();
-                return true;
-
-            case "u":
-                mService.sendModelUnloaded(Integer.parseInt(tokens[1]));
-                return true;
-
-            case "r":
-                mService.sendRecognitionEvent(Integer.parseInt(tokens[1]),
-                        Integer.parseInt(tokens[2]));
-                return true;
-
-            case "p":
-                mService.sendPhraseRecognitionEvent(Integer.parseInt(tokens[1]),
-                        Integer.parseInt(tokens[2]));
-                return true;
-
-            case "d":
-                mService.dumpModels();
-                return true;
-
-            case "h":
-                System.out.print("Available commands:\n" + "h - help\n" + "q - quit\n"
-                        + "a - send onResourcesAvailable event\n"
-                        + "u <model> - send modelUnloaded event\n"
-                        + "r <model> <status> - send recognitionEvent\n"
-                        + "p <model> <status> - send phraseRecognitionEvent\n"
-                        + "d - dump models\n");
-
-            default:
-                return true;
-        }
-    }
-
-    private static class SoundTriggerImpl extends ISoundTriggerHw.Stub {
-        static class Model {
-            final ISoundTriggerHwCallback callback;
-            final SoundModel model;
-            final PhraseSoundModel phraseModel;
-            public android.hardware.soundtrigger.V2_3.RecognitionConfig config = null;
-
-            Model(ISoundTriggerHwCallback callback, SoundModel model) {
-                this.callback = callback;
-                this.model = model;
-                this.phraseModel = null;
-            }
-
-            Model(ISoundTriggerHwCallback callback, PhraseSoundModel model) {
-                this.callback = callback;
-                this.model = null;
-                this.phraseModel = model;
-            }
-        }
-
-        private ISoundTriggerHwGlobalCallback mGlobalCallback;
-        private final ConcurrentMap<Integer, Model> mLoadedModels = new ConcurrentHashMap<>();
-        private int mHandleCounter = 1;
-
-        public void dumpModels() {
-            mLoadedModels.forEach((handle, model) -> {
-                System.out.println("+++ Model " + handle);
-                System.out.println("    config = " + model.config);
-                android.hardware.soundtrigger.V2_3.RecognitionConfig recognitionConfig =
-                        model.config;
-                if (recognitionConfig != null) {
-                    System.out.println("    ACTIVE recognitionConfig = " + recognitionConfig);
-                } else {
-                    System.out.println("    INACTIVE");
-                }
-            });
-        }
-
-        public void sendOnResourcesAvailable() {
-            if (mGlobalCallback != null) {
-                try {
-                    mGlobalCallback.onResourcesAvailable();
-                } catch (RemoteException e) {
-                    e.printStackTrace();
-                }
-            }
-        }
-
-        public void sendRecognitionEvent(int modelHandle, int status) {
-            Model model = mLoadedModels.get(modelHandle);
-            if (model != null && model.config != null) {
-                android.hardware.soundtrigger.V2_1.ISoundTriggerHwCallback.RecognitionEvent event =
-                        new android.hardware.soundtrigger.V2_1.ISoundTriggerHwCallback.RecognitionEvent();
-                event.header.model = modelHandle;
-                event.header.type = SoundModelType.GENERIC;
-                event.header.status = status;
-                event.header.captureSession = model.config.base.header.captureHandle;
-                event.header.captureAvailable = true;
-                event.header.audioConfig.channelMask = 16;
-                event.header.audioConfig.format = 1;
-                event.header.audioConfig.sampleRateHz = 16000;
-                event.data = HidlMemoryUtil.byteArrayToHidlMemory(new byte[0]);
-                try {
-                    model.callback.recognitionCallback_2_1(event, 0);
-                } catch (RemoteException e) {
-                    e.printStackTrace();
-                }
-                model.config = null;
-            }
-        }
-
-        public void sendPhraseRecognitionEvent(int modelHandle, int status) {
-            Model model = mLoadedModels.get(modelHandle);
-            if (model != null && model.config != null) {
-                android.hardware.soundtrigger.V2_1.ISoundTriggerHwCallback.PhraseRecognitionEvent
-                        event =
-                        new android.hardware.soundtrigger.V2_1.ISoundTriggerHwCallback.PhraseRecognitionEvent();
-                event.common.header.model = modelHandle;
-                event.common.header.type = SoundModelType.KEYPHRASE;
-                event.common.header.status = status;
-                event.common.header.captureSession = model.config.base.header.captureHandle;
-                event.common.header.captureAvailable = true;
-                event.common.header.audioConfig.channelMask = 16;
-                event.common.header.audioConfig.format = 1;
-                event.common.header.audioConfig.sampleRateHz = 16000;
-                event.common.data = HidlMemoryUtil.byteArrayToHidlMemory(new byte[0]);
-                if (!model.phraseModel.phrases.isEmpty()) {
-                    PhraseRecognitionExtra extra = new PhraseRecognitionExtra();
-                    extra.id = model.phraseModel.phrases.get(0).id;
-                    extra.confidenceLevel = 100;
-                    extra.recognitionModes = model.phraseModel.phrases.get(0).recognitionModes;
-                    event.phraseExtras.add(extra);
-                }
-                try {
-                    model.callback.phraseRecognitionCallback_2_1(event, 0);
-                } catch (RemoteException e) {
-                    e.printStackTrace();
-                }
-                model.config = null;
-            }
-        }
-
-        public void sendModelUnloaded(int modelHandle) {
-            Model model = mLoadedModels.remove(modelHandle);
-            if (model != null) {
-                try {
-                    model.callback.modelUnloaded(modelHandle);
-                } catch (RemoteException e) {
-                    e.printStackTrace();
-                }
-            }
-        }
-
-        @Override
-        public void registerGlobalCallback(ISoundTriggerHwGlobalCallback callback) {
-            System.out.println("registerGlobalCallback()");
-            mGlobalCallback = callback;
-        }
-
-        @Override
-        public void loadSoundModel_2_4(SoundModel soundModel, ISoundTriggerHwCallback callback,
-                loadSoundModel_2_4Callback _hidl_cb) {
-            int handle = mHandleCounter++;
-            System.out.printf("loadSoundModel_2_4(soundModel=%s) -> %d%n", soundModel, handle);
-            mLoadedModels.put(handle, new Model(callback, soundModel));
-            _hidl_cb.onValues(0, handle);
-        }
-
-        @Override
-        public void loadPhraseSoundModel_2_4(PhraseSoundModel soundModel,
-                ISoundTriggerHwCallback callback, loadPhraseSoundModel_2_4Callback _hidl_cb) {
-            int handle = mHandleCounter++;
-            System.out.printf("loadPhraseSoundModel_2_4(soundModel=%s) -> %d%n", soundModel,
-                    handle);
-            mLoadedModels.put(handle, new Model(callback, soundModel));
-            _hidl_cb.onValues(0, handle);
-        }
-
-        @Override
-        public int startRecognition_2_4(int modelHandle,
-                android.hardware.soundtrigger.V2_3.RecognitionConfig config) {
-            System.out.printf("startRecognition_2_4(modelHandle=%d)%n", modelHandle);
-            Model model = mLoadedModels.get(modelHandle);
-            if (model != null) {
-                model.config = config;
-            }
-            return 0;
-        }
-
-        @Override
-        public void getProperties_2_3(getProperties_2_3Callback _hidl_cb) {
-            System.out.println("getProperties_2_3()");
-            android.hardware.soundtrigger.V2_3.Properties properties =
-                    new android.hardware.soundtrigger.V2_3.Properties();
-            properties.base.implementor = "Android";
-            properties.base.description = "Mock STHAL";
-            properties.base.maxSoundModels = 2;
-            properties.base.maxKeyPhrases = 1;
-            properties.base.recognitionModes =
-                    RecognitionMode.VOICE_TRIGGER | RecognitionMode.GENERIC_TRIGGER;
-            _hidl_cb.onValues(0, properties);
-        }
-
-        @Override
-        public void queryParameter(int modelHandle, int modelParam,
-                queryParameterCallback _hidl_cb) {
-            _hidl_cb.onValues(0, new OptionalModelParameterRange());
-        }
-
-        @Override
-        public int getModelState(int modelHandle) {
-            System.out.printf("getModelState(modelHandle=%d)%n", modelHandle);
-            return 0;
-        }
-
-        @Override
-        public int unloadSoundModel(int modelHandle) {
-            System.out.printf("unloadSoundModel(modelHandle=%d)%n", modelHandle);
-            return 0;
-        }
-
-        @Override
-        public int stopRecognition(int modelHandle) {
-            System.out.printf("stopRecognition(modelHandle=%d)%n", modelHandle);
-            Model model = mLoadedModels.get(modelHandle);
-            if (model != null) {
-                model.config = null;
-            }
-            return 0;
-        }
-
-        @Override
-        public void debug(android.os.NativeHandle fd, java.util.ArrayList<String> options) {
-            if (!options.isEmpty()) {
-                switch (options.get(0)) {
-                    case "reboot":
-                        System.out.println("Received a reboot request. Exiting.");
-                        cleanup();
-                        System.exit(1);
-                }
-            }
-        }
-
-        ////////////////////////////////////////////////////////////////////////////////////////////
-        // Everything below is not implemented and not expected to be called.
-
-        @Override
-        public int startRecognition_2_3(int modelHandle,
-                android.hardware.soundtrigger.V2_3.RecognitionConfig config) {
-            throw new UnsupportedOperationException();
-        }
-
-        @Override
-        public int setParameter(int modelHandle, int modelParam, int value) {
-            throw new UnsupportedOperationException();
-        }
-
-        @Override
-        public void getParameter(int modelHandle, int modelParam, getParameterCallback _hidl_cb) {
-            throw new UnsupportedOperationException();
-        }
-
-        @Override
-        public void loadSoundModel_2_1(SoundModel soundModel,
-                android.hardware.soundtrigger.V2_1.ISoundTriggerHwCallback callback, int cookie,
-                loadSoundModel_2_1Callback _hidl_cb) {
-            throw new UnsupportedOperationException();
-        }
-
-        @Override
-        public void loadPhraseSoundModel_2_1(PhraseSoundModel soundModel,
-                android.hardware.soundtrigger.V2_1.ISoundTriggerHwCallback callback, int cookie,
-                loadPhraseSoundModel_2_1Callback _hidl_cb) {
-            throw new UnsupportedOperationException();
-        }
-
-        @Override
-        public int startRecognition_2_1(int modelHandle, RecognitionConfig config,
-                android.hardware.soundtrigger.V2_1.ISoundTriggerHwCallback callback, int cookie) {
-            throw new UnsupportedOperationException();
-        }
-
-        @Override
-        public void getProperties(getPropertiesCallback _hidl_cb) {
-            throw new UnsupportedOperationException();
-        }
-
-        @Override
-        public void loadSoundModel(
-                android.hardware.soundtrigger.V2_0.ISoundTriggerHw.SoundModel soundModel,
-                android.hardware.soundtrigger.V2_0.ISoundTriggerHwCallback callback, int cookie,
-                loadSoundModelCallback _hidl_cb) {
-            throw new UnsupportedOperationException();
-        }
-
-        @Override
-        public void loadPhraseSoundModel(
-                android.hardware.soundtrigger.V2_0.ISoundTriggerHw.PhraseSoundModel soundModel,
-                android.hardware.soundtrigger.V2_0.ISoundTriggerHwCallback callback, int cookie,
-                loadPhraseSoundModelCallback _hidl_cb) {
-            throw new UnsupportedOperationException();
-        }
-
-        @Override
-        public int startRecognition(int modelHandle,
-                android.hardware.soundtrigger.V2_0.ISoundTriggerHw.RecognitionConfig config,
-                android.hardware.soundtrigger.V2_0.ISoundTriggerHwCallback callback, int cookie) {
-            throw new UnsupportedOperationException();
-        }
-
-        @Override
-        public int stopAllRecognitions() {
-            throw new UnsupportedOperationException();
-        }
-    }
-}
diff --git a/soundtrigger/2.4/cli/sthal_cli_2.4 b/soundtrigger/2.4/cli/sthal_cli_2.4
deleted file mode 100644
index 0801464..0000000
--- a/soundtrigger/2.4/cli/sthal_cli_2.4
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/system/bin/sh
-# Script to start "sthal_cli_2.4" on the device
-#
-base=/system
-export CLASSPATH=$base/framework/sthal_cli_2.4.jar
-exec app_process $base/bin android.hardware.soundtrigger.V2_4.cli.SthalCli "$@"
-
diff --git a/soundtrigger/2.4/vts/functional/Android.bp b/soundtrigger/2.4/vts/functional/Android.bp
deleted file mode 100644
index 4b7ae91..0000000
--- a/soundtrigger/2.4/vts/functional/Android.bp
+++ /dev/null
@@ -1,41 +0,0 @@
-//
-// Copyright (C) 2021 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-
-package {
-    // See: http://go/android-license-faq
-    // A large-scale-change added 'default_applicable_licenses' to import
-    // all of the 'license_kinds' from "hardware_interfaces_license"
-    // to get the below license kinds:
-    //   SPDX-license-identifier-Apache-2.0
-    default_applicable_licenses: ["hardware_interfaces_license"],
-}
-
-cc_test {
-    name: "VtsHalSoundtriggerV2_4TargetTest",
-    defaults: ["VtsHalTargetTestDefaults"],
-    srcs: ["VtsHalSoundtriggerV2_4TargetTest.cpp"],
-    static_libs: [
-        "android.hardware.soundtrigger@2.0",
-        "android.hardware.soundtrigger@2.1",
-        "android.hardware.soundtrigger@2.2",
-        "android.hardware.soundtrigger@2.3",
-        "android.hardware.soundtrigger@2.4",
-    ],
-    test_suites: [
-        "general-tests",
-        "vts",
-    ],
-}
diff --git a/soundtrigger/2.4/vts/functional/VtsHalSoundtriggerV2_4TargetTest.cpp b/soundtrigger/2.4/vts/functional/VtsHalSoundtriggerV2_4TargetTest.cpp
deleted file mode 100644
index 13d7005..0000000
--- a/soundtrigger/2.4/vts/functional/VtsHalSoundtriggerV2_4TargetTest.cpp
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define LOG_TAG "SoundTriggerHidlHalTest"
-
-#include <android-base/logging.h>
-#include <android/hardware/audio/common/2.0/types.h>
-#include <android/hardware/soundtrigger/2.4/ISoundTriggerHwGlobalCallback.h>
-#include <android/hardware/soundtrigger/2.4/ISoundTriggerHw.h>
-#include <gtest/gtest.h>
-#include <hidl/GtestPrinter.h>
-#include <hidl/ServiceManagement.h>
-
-using ::android::sp;
-using ::android::hardware::Return;
-using ::android::hardware::Status;
-using ::android::hardware::soundtrigger::V2_4::ISoundTriggerHw;
-using ::android::hardware::soundtrigger::V2_4::ISoundTriggerHwGlobalCallback;
-
-/**
- * Test class holding the instance of the SoundTriggerHW service to test.
- * The passed parameter is the registered name of the implementing service
- * supplied by INSTANTIATE_TEST_SUITE_P() call.
- */
-class SoundTriggerHidlTest : public testing::TestWithParam<std::string> {
-public:
-    void SetUp() override {
-        mSoundtrigger = ISoundTriggerHw::getService(GetParam());
-
-        ASSERT_NE(mSoundtrigger, nullptr);
-        LOG(INFO) << "Test is remote " << mSoundtrigger->isRemote();
-    }
-
-protected:
-    sp<ISoundTriggerHw> mSoundtrigger;
-};
-
-/**
- * Empty test is in place to ensure service is initialized.
- * Due to the nature of SoundTrigger HAL providing an interface for
- * proprietary or vendor specific implementations, limited testing on
- * individual APIs is possible.
- */
-TEST_P(SoundTriggerHidlTest, ServiceIsInstantiated) {}
-
-class GlobalCallback : public ISoundTriggerHwGlobalCallback {
-    Return<void> onResourcesAvailable() override {
-        return Status::ok();
-    }
-};
-
-/**
- * Test ISoundTriggerHw::registerGlobalCallback method
- *
- * Verifies that:
- * - the implementation implements the method
- * - the method returns no error
- */
-TEST_P(SoundTriggerHidlTest, RegisterGlobalCallback) {
-    Return<void> hidlReturn;
-    sp<ISoundTriggerHwGlobalCallback> callback = new GlobalCallback();
-    hidlReturn = mSoundtrigger->registerGlobalCallback(callback);
-    EXPECT_TRUE(hidlReturn.isOk());
-}
-
-GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(SoundTriggerHidlTest);
-
-INSTANTIATE_TEST_SUITE_P(
-        PerInstance, SoundTriggerHidlTest,
-        testing::ValuesIn(android::hardware::getAllHalInstanceNames(ISoundTriggerHw::descriptor)),
-        android::hardware::PrintInstanceNameToString);
