diff --git a/Qualcomm/QtiAudio/Android.mk b/Qualcomm/QtiAudio/Android.mk
new file mode 100644
index 0000000..4510faf
--- /dev/null
+++ b/Qualcomm/QtiAudio/Android.mk
@@ -0,0 +1,12 @@
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := optional
+LOCAL_SRC_FILES := $(call all-subdir-java-files)
+
+LOCAL_CERTIFICATE := platform
+LOCAL_PRIVILEGED_MODULE := true
+LOCAL_PACKAGE_NAME := QtiAudio
+LOCAL_PROGUARD_ENABLED := disabled
+
+include $(BUILD_PACKAGE)
diff --git a/Qualcomm/QtiAudio/AndroidManifest.xml b/Qualcomm/QtiAudio/AndroidManifest.xml
new file mode 100644
index 0000000..ca4d429
--- /dev/null
+++ b/Qualcomm/QtiAudio/AndroidManifest.xml
@@ -0,0 +1,15 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+	package="me.phh.qti.audio"
+	android:sharedUserId="android.uid.system">
+
+    <application
+	    android:label="@string/app_label">
+
+	    <receiver android:name=".Starter">
+		    <intent-filter>
+			    <action android:name="android.intent.action.BOOT_COMPLETED"/>
+		    </intent-filter>
+	    </receiver>
+	    <service android:name=".Service" />
+    </application>
+</manifest>
diff --git a/Qualcomm/QtiAudio/res/values/strings.xml b/Qualcomm/QtiAudio/res/values/strings.xml
new file mode 100644
index 0000000..1ced373
--- /dev/null
+++ b/Qualcomm/QtiAudio/res/values/strings.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <string name="app_label">Qualcomm audio</string>
+</resources>
diff --git a/Qualcomm/QtiAudio/src/me/phh/qti/audio/Service.java b/Qualcomm/QtiAudio/src/me/phh/qti/audio/Service.java
new file mode 100644
index 0000000..97ecf60
--- /dev/null
+++ b/Qualcomm/QtiAudio/src/me/phh/qti/audio/Service.java
@@ -0,0 +1,65 @@
+package me.phh.qti.audio;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.util.Log;
+import android.media.AudioSystem;
+import android.os.IBinder;
+
+import vendor.qti.hardware.radio.am.V1_0.IQcRilAudioCallback;
+import vendor.qti.hardware.radio.am.V1_0.IQcRilAudio;
+
+public class Service extends android.app.Service {
+	@Override public void onCreate() {
+		new java.lang.Thread() {
+			@Override
+			public void run() {
+				android.util.Log.d("PHH", "Hello");
+				while(service == null) {
+					try {
+						Thread.sleep(1000);
+						service = IQcRilAudio.getService("slot1");
+						service.setCallback(cb);
+
+						service = IQcRilAudio.getService("slot2");
+						service.setCallback(cb);
+						break;
+					} catch(Exception e) {
+						android.util.Log.d("PHH", "Failed setting callback", e);
+					}
+				}
+			}
+		}.start();
+	}
+
+	IQcRilAudio service;
+	IQcRilAudioCallback cb = new IQcRilAudioCallback.Stub() {
+		@Override
+		public String getParameters(String parameter) {
+			android.util.Log.d("PHH", "Got getParameters " + parameter);
+			try {
+				return AudioSystem.getParameters(parameter);
+			} catch(Exception e) { 
+				android.util.Log.d("PHH", "Failed getting parameters");
+			}
+			return "";
+		}
+
+		@Override
+		public int setParameters(String parameters) {
+			android.util.Log.d("PHH", "Got setParameters " + parameters);
+			try {
+				AudioSystem.setParameters(parameters);
+			} catch(Exception e) { 
+				android.util.Log.d("PHH", "Failed setting parameters");
+			}
+			return 0;
+		}
+	};
+
+	@Override
+	public IBinder onBind(Intent intent) {
+		return null;
+	}
+}
diff --git a/Qualcomm/QtiAudio/src/me/phh/qti/audio/Starter.java b/Qualcomm/QtiAudio/src/me/phh/qti/audio/Starter.java
new file mode 100644
index 0000000..2700ec6
--- /dev/null
+++ b/Qualcomm/QtiAudio/src/me/phh/qti/audio/Starter.java
@@ -0,0 +1,13 @@
+package me.phh.qti.audio;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+
+public class Starter extends BroadcastReceiver {
+
+	@Override
+	public void onReceive(Context ctxt, Intent intent) {
+		ctxt.startService(new Intent(ctxt, Service.class));
+	}
+}
diff --git a/Qualcomm/QtiAudio/src/vendor/qti/hardware/radio/am/V1_0/IQcRilAudio.java b/Qualcomm/QtiAudio/src/vendor/qti/hardware/radio/am/V1_0/IQcRilAudio.java
new file mode 100644
index 0000000..7e08568
--- /dev/null
+++ b/Qualcomm/QtiAudio/src/vendor/qti/hardware/radio/am/V1_0/IQcRilAudio.java
@@ -0,0 +1,490 @@
+package vendor.qti.hardware.radio.am.V1_0;
+
+public interface IQcRilAudio extends android.hidl.base.V1_0.IBase {
+    public static final String kInterfaceName = "vendor.qti.hardware.radio.am@1.0::IQcRilAudio";
+
+    /* package private */ static IQcRilAudio asInterface(android.os.IHwBinder binder) {
+        if (binder == null) {
+            return null;
+        }
+
+        android.os.IHwInterface iface =
+                binder.queryLocalInterface(kInterfaceName);
+
+        if ((iface != null) && (iface instanceof IQcRilAudio)) {
+            return (IQcRilAudio)iface;
+        }
+
+        IQcRilAudio proxy = new IQcRilAudio.Proxy(binder);
+
+        try {
+            for (String descriptor : proxy.interfaceChain()) {
+                if (descriptor.equals(kInterfaceName)) {
+                    return proxy;
+                }
+            }
+        } catch (android.os.RemoteException e) {
+        }
+
+        return null;
+    }
+
+    public static IQcRilAudio castFrom(android.os.IHwInterface iface) {
+        return (iface == null) ? null : IQcRilAudio.asInterface(iface.asBinder());
+    }
+
+    @Override
+    public android.os.IHwBinder asBinder();
+
+    public static IQcRilAudio getService(String serviceName) throws android.os.RemoteException {
+        return IQcRilAudio.asInterface(android.os.HwBinder.getService("vendor.qti.hardware.radio.am@1.0::IQcRilAudio",serviceName));
+    }
+
+    public static IQcRilAudio getService() throws android.os.RemoteException {
+        return IQcRilAudio.asInterface(android.os.HwBinder.getService("vendor.qti.hardware.radio.am@1.0::IQcRilAudio","default"));
+    }
+
+    void setCallback(IQcRilAudioCallback iQcRilAudioCallback)
+        throws android.os.RemoteException;
+    void setError(int error)
+        throws android.os.RemoteException;
+    java.util.ArrayList<String> interfaceChain()
+        throws android.os.RemoteException;
+    String interfaceDescriptor()
+        throws android.os.RemoteException;
+    java.util.ArrayList<byte[/* 32 */]> getHashChain()
+        throws android.os.RemoteException;
+    void setHALInstrumentation()
+        throws android.os.RemoteException;
+    boolean linkToDeath(android.os.IHwBinder.DeathRecipient recipient, long cookie)
+        throws android.os.RemoteException;
+    void ping()
+        throws android.os.RemoteException;
+    android.hidl.base.V1_0.DebugInfo getDebugInfo()
+        throws android.os.RemoteException;
+    void notifySyspropsChanged()
+        throws android.os.RemoteException;
+    boolean unlinkToDeath(android.os.IHwBinder.DeathRecipient recipient)
+        throws android.os.RemoteException;
+
+    public static final class Proxy implements IQcRilAudio {
+        private android.os.IHwBinder mRemote;
+
+        public Proxy(android.os.IHwBinder remote) {
+            mRemote = java.util.Objects.requireNonNull(remote);
+        }
+
+        @Override
+        public android.os.IHwBinder asBinder() {
+            return mRemote;
+        }
+
+        @Override
+        public String toString() {
+            try {
+                return this.interfaceDescriptor() + "@Proxy";
+            } catch (android.os.RemoteException ex) {
+                /* ignored; handled below. */
+            }
+            return "[class or subclass of " + IQcRilAudio.kInterfaceName + "]@Proxy";
+        }
+
+        // Methods from ::vendor::qti::hardware::radio::am::V1_0::IQcRilAudio follow.
+        @Override
+        public void setCallback(IQcRilAudioCallback iQcRilAudioCallback)
+                throws android.os.RemoteException {
+            android.os.HwParcel _hidl_request = new android.os.HwParcel();
+            _hidl_request.writeInterfaceToken(IQcRilAudio.kInterfaceName);
+            _hidl_request.writeStrongBinder(iQcRilAudioCallback == null ? null : iQcRilAudioCallback.asBinder());
+
+            android.os.HwParcel _hidl_reply = new android.os.HwParcel();
+            try {
+                mRemote.transact(1 /* setCallback */, _hidl_request, _hidl_reply, android.os.IHwBinder.FLAG_ONEWAY);
+                _hidl_request.releaseTemporaryStorage();
+            } finally {
+                _hidl_reply.release();
+            }
+        }
+
+        @Override
+        public void setError(int error)
+                throws android.os.RemoteException {
+            android.os.HwParcel _hidl_request = new android.os.HwParcel();
+            _hidl_request.writeInterfaceToken(IQcRilAudio.kInterfaceName);
+            _hidl_request.writeInt32(error);
+
+            android.os.HwParcel _hidl_reply = new android.os.HwParcel();
+            try {
+                mRemote.transact(2 /* setError */, _hidl_request, _hidl_reply, android.os.IHwBinder.FLAG_ONEWAY);
+                _hidl_request.releaseTemporaryStorage();
+            } finally {
+                _hidl_reply.release();
+            }
+        }
+
+        // Methods from ::android::hidl::base::V1_0::IBase follow.
+        @Override
+        public java.util.ArrayList<String> interfaceChain()
+                throws android.os.RemoteException {
+            android.os.HwParcel _hidl_request = new android.os.HwParcel();
+            _hidl_request.writeInterfaceToken(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+            android.os.HwParcel _hidl_reply = new android.os.HwParcel();
+            try {
+                mRemote.transact(256067662 /* interfaceChain */, _hidl_request, _hidl_reply, 0 /* flags */);
+                _hidl_reply.verifySuccess();
+                _hidl_request.releaseTemporaryStorage();
+
+                java.util.ArrayList<String> _hidl_out_descriptors = _hidl_reply.readStringVector();
+                return _hidl_out_descriptors;
+            } finally {
+                _hidl_reply.release();
+            }
+        }
+
+        @Override
+        public String interfaceDescriptor()
+                throws android.os.RemoteException {
+            android.os.HwParcel _hidl_request = new android.os.HwParcel();
+            _hidl_request.writeInterfaceToken(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+            android.os.HwParcel _hidl_reply = new android.os.HwParcel();
+            try {
+                mRemote.transact(256136003 /* interfaceDescriptor */, _hidl_request, _hidl_reply, 0 /* flags */);
+                _hidl_reply.verifySuccess();
+                _hidl_request.releaseTemporaryStorage();
+
+                String _hidl_out_descriptor = _hidl_reply.readString();
+                return _hidl_out_descriptor;
+            } finally {
+                _hidl_reply.release();
+            }
+        }
+
+        @Override
+        public java.util.ArrayList<byte[/* 32 */]> getHashChain()
+                throws android.os.RemoteException {
+            android.os.HwParcel _hidl_request = new android.os.HwParcel();
+            _hidl_request.writeInterfaceToken(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+            android.os.HwParcel _hidl_reply = new android.os.HwParcel();
+            try {
+                mRemote.transact(256398152 /* getHashChain */, _hidl_request, _hidl_reply, 0 /* flags */);
+                _hidl_reply.verifySuccess();
+                _hidl_request.releaseTemporaryStorage();
+
+                java.util.ArrayList<byte[/* 32 */]> _hidl_out_hashchain =  new java.util.ArrayList<byte[/* 32 */]>();
+                {
+                    android.os.HwBlob _hidl_blob = _hidl_reply.readBuffer(16 /* size */);
+                    {
+                        int _hidl_vec_size = _hidl_blob.getInt32(0 /* offset */ + 8 /* offsetof(hidl_vec<T>, mSize) */);
+                        android.os.HwBlob childBlob = _hidl_reply.readEmbeddedBuffer(
+                                _hidl_vec_size * 32,_hidl_blob.handle(),
+                                0 /* offset */ + 0 /* offsetof(hidl_vec<T>, mBuffer) */,true /* nullable */);
+
+                        _hidl_out_hashchain.clear();
+                        for (int _hidl_index_0 = 0; _hidl_index_0 < _hidl_vec_size; ++_hidl_index_0) {
+                            final byte[/* 32 */] _hidl_vec_element = new byte[32];
+                            {
+                                long _hidl_array_offset_1 = _hidl_index_0 * 32;
+                                for (int _hidl_index_1_0 = 0; _hidl_index_1_0 < 32; ++_hidl_index_1_0) {
+                                    _hidl_vec_element[_hidl_index_1_0] = childBlob.getInt8(_hidl_array_offset_1);
+                                    _hidl_array_offset_1 += 1;
+                                }
+                            }
+                            _hidl_out_hashchain.add(_hidl_vec_element);
+                        }
+                    }
+                }
+                return _hidl_out_hashchain;
+            } finally {
+                _hidl_reply.release();
+            }
+        }
+
+        @Override
+        public void setHALInstrumentation()
+                throws android.os.RemoteException {
+            android.os.HwParcel _hidl_request = new android.os.HwParcel();
+            _hidl_request.writeInterfaceToken(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+            android.os.HwParcel _hidl_reply = new android.os.HwParcel();
+            try {
+                mRemote.transact(256462420 /* setHALInstrumentation */, _hidl_request, _hidl_reply, android.os.IHwBinder.FLAG_ONEWAY);
+                _hidl_request.releaseTemporaryStorage();
+            } finally {
+                _hidl_reply.release();
+            }
+        }
+
+        @Override
+        public boolean linkToDeath(android.os.IHwBinder.DeathRecipient recipient, long cookie)
+                throws android.os.RemoteException {
+            return mRemote.linkToDeath(recipient, cookie);
+        }
+        @Override
+        public void ping()
+                throws android.os.RemoteException {
+            android.os.HwParcel _hidl_request = new android.os.HwParcel();
+            _hidl_request.writeInterfaceToken(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+            android.os.HwParcel _hidl_reply = new android.os.HwParcel();
+            try {
+                mRemote.transact(256921159 /* ping */, _hidl_request, _hidl_reply, 0 /* flags */);
+                _hidl_reply.verifySuccess();
+                _hidl_request.releaseTemporaryStorage();
+            } finally {
+                _hidl_reply.release();
+            }
+        }
+
+        @Override
+        public android.hidl.base.V1_0.DebugInfo getDebugInfo()
+                throws android.os.RemoteException {
+            android.os.HwParcel _hidl_request = new android.os.HwParcel();
+            _hidl_request.writeInterfaceToken(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+            android.os.HwParcel _hidl_reply = new android.os.HwParcel();
+            try {
+                mRemote.transact(257049926 /* getDebugInfo */, _hidl_request, _hidl_reply, 0 /* flags */);
+                _hidl_reply.verifySuccess();
+                _hidl_request.releaseTemporaryStorage();
+
+                android.hidl.base.V1_0.DebugInfo _hidl_out_info = new android.hidl.base.V1_0.DebugInfo();
+                _hidl_out_info.readFromParcel(_hidl_reply);
+                return _hidl_out_info;
+            } finally {
+                _hidl_reply.release();
+            }
+        }
+
+        @Override
+        public void notifySyspropsChanged()
+                throws android.os.RemoteException {
+            android.os.HwParcel _hidl_request = new android.os.HwParcel();
+            _hidl_request.writeInterfaceToken(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+            android.os.HwParcel _hidl_reply = new android.os.HwParcel();
+            try {
+                mRemote.transact(257120595 /* notifySyspropsChanged */, _hidl_request, _hidl_reply, android.os.IHwBinder.FLAG_ONEWAY);
+                _hidl_request.releaseTemporaryStorage();
+            } finally {
+                _hidl_reply.release();
+            }
+        }
+
+        @Override
+        public boolean unlinkToDeath(android.os.IHwBinder.DeathRecipient recipient)
+                throws android.os.RemoteException {
+            return mRemote.unlinkToDeath(recipient);
+        }
+    }
+
+    public static abstract class Stub extends android.os.HwBinder implements IQcRilAudio {
+        @Override
+        public android.os.IHwBinder asBinder() {
+            return this;
+        }
+
+        @Override
+        public final java.util.ArrayList<String> interfaceChain() {
+            return new java.util.ArrayList<String>(java.util.Arrays.asList(
+                    IQcRilAudio.kInterfaceName,
+                    android.hidl.base.V1_0.IBase.kInterfaceName));
+        }
+
+        @Override
+        public final String interfaceDescriptor() {
+            return IQcRilAudio.kInterfaceName;
+
+        }
+
+        @Override
+        public final java.util.ArrayList<byte[/* 32 */]> getHashChain() {
+            return new java.util.ArrayList<byte[/* 32 */]>(java.util.Arrays.asList(
+                    new byte[/* 32 */]{35,-44,101,61,83,-91,-11,20,118,-65,-39,105,-3,86,89,122,53,28,5,43,84,86,-31,121,46,5,33,-49,104,103,89,13} /* 23d4653d53a5f51476bfd969fd56597a351c052b5456e1792e0521cf6867590d */,
+                    new byte[/* 32 */]{-67,-38,-74,24,77,122,52,109,-90,-96,125,-64,-126,-116,-15,-102,105,111,76,-86,54,17,-59,31,46,20,86,90,20,-76,15,-39} /* bddab6184d7a346da6a07dc0828cf19a696f4caa3611c51f2e14565a14b40fd9 */));
+
+        }
+
+        @Override
+        public final void setHALInstrumentation() {
+
+        }
+
+        @Override
+        public final boolean linkToDeath(android.os.IHwBinder.DeathRecipient recipient, long cookie) {
+            return true;
+        }
+
+        @Override
+        public final void ping() {
+            return;
+
+        }
+
+        @Override
+        public final android.hidl.base.V1_0.DebugInfo getDebugInfo() {
+            android.hidl.base.V1_0.DebugInfo info = new android.hidl.base.V1_0.DebugInfo();
+            info.pid = -1;
+            info.ptr = 0;
+            info.arch = android.hidl.base.V1_0.DebugInfo.Architecture.UNKNOWN;return info;
+        }
+
+        @Override
+        public final void notifySyspropsChanged() {
+            android.os.SystemProperties.reportSyspropChanged();
+        }
+
+        @Override
+        public final boolean unlinkToDeath(android.os.IHwBinder.DeathRecipient recipient) {
+            return true;
+
+        }
+
+        @Override
+        public android.os.IHwInterface queryLocalInterface(String descriptor) {
+            if (kInterfaceName.equals(descriptor)) {
+                return this;
+            }
+            return null;
+        }
+
+        public void registerAsService(String serviceName) throws android.os.RemoteException {
+            registerService(serviceName);
+        }
+
+        @Override
+        public String toString() {
+            return this.interfaceDescriptor() + "@Stub";
+        }
+
+        @Override
+        public void onTransact(int _hidl_code, android.os.HwParcel _hidl_request, final android.os.HwParcel _hidl_reply, int _hidl_flags)
+                throws android.os.RemoteException {
+            switch (_hidl_code) {
+                case 1 /* setCallback */:
+                {
+                    _hidl_request.enforceInterface(IQcRilAudio.kInterfaceName);
+
+                    IQcRilAudioCallback iQcRilAudioCallback = IQcRilAudioCallback.asInterface(_hidl_request.readStrongBinder());
+                    setCallback(iQcRilAudioCallback);
+                    break;
+                }
+
+                case 2 /* setError */:
+                {
+                    _hidl_request.enforceInterface(IQcRilAudio.kInterfaceName);
+
+                    int error = _hidl_request.readInt32();
+                    setError(error);
+                    break;
+                }
+
+                case 256067662 /* interfaceChain */:
+                {
+                    _hidl_request.enforceInterface(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+                    java.util.ArrayList<String> _hidl_out_descriptors = interfaceChain();
+                    _hidl_reply.writeStatus(android.os.HwParcel.STATUS_SUCCESS);
+                    _hidl_reply.writeStringVector(_hidl_out_descriptors);
+                    _hidl_reply.send();
+                    break;
+                }
+
+                case 256131655 /* debug */:
+                {
+                    _hidl_request.enforceInterface(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+                    _hidl_reply.writeStatus(android.os.HwParcel.STATUS_SUCCESS);
+                    _hidl_reply.send();
+                    break;
+                }
+
+                case 256136003 /* interfaceDescriptor */:
+                {
+                    _hidl_request.enforceInterface(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+                    String _hidl_out_descriptor = interfaceDescriptor();
+                    _hidl_reply.writeStatus(android.os.HwParcel.STATUS_SUCCESS);
+                    _hidl_reply.writeString(_hidl_out_descriptor);
+                    _hidl_reply.send();
+                    break;
+                }
+
+                case 256398152 /* getHashChain */:
+                {
+                    _hidl_request.enforceInterface(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+                    java.util.ArrayList<byte[/* 32 */]> _hidl_out_hashchain = getHashChain();
+                    _hidl_reply.writeStatus(android.os.HwParcel.STATUS_SUCCESS);
+                    {
+                        android.os.HwBlob _hidl_blob = new android.os.HwBlob(16 /* size */);
+                        {
+                            int _hidl_vec_size = _hidl_out_hashchain.size();
+                            _hidl_blob.putInt32(0 /* offset */ + 8 /* offsetof(hidl_vec<T>, mSize) */, _hidl_vec_size);
+                            _hidl_blob.putBool(0 /* offset */ + 12 /* offsetof(hidl_vec<T>, mOwnsBuffer) */, false);
+                            android.os.HwBlob childBlob = new android.os.HwBlob((int)(_hidl_vec_size * 32));
+                            for (int _hidl_index_0 = 0; _hidl_index_0 < _hidl_vec_size; ++_hidl_index_0) {
+                                {
+                                    long _hidl_array_offset_1 = _hidl_index_0 * 32;
+                                    for (int _hidl_index_1_0 = 0; _hidl_index_1_0 < 32; ++_hidl_index_1_0) {
+                                        childBlob.putInt8(_hidl_array_offset_1, _hidl_out_hashchain.get(_hidl_index_0)[_hidl_index_1_0]);
+                                        _hidl_array_offset_1 += 1;
+                                    }
+                                }
+                            }
+                            _hidl_blob.putBlob(0 /* offset */ + 0 /* offsetof(hidl_vec<T>, mBuffer) */, childBlob);
+                        }
+                        _hidl_reply.writeBuffer(_hidl_blob);
+                    }
+                    _hidl_reply.send();
+                    break;
+                }
+
+                case 256462420 /* setHALInstrumentation */:
+                {
+                    _hidl_request.enforceInterface(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+                    setHALInstrumentation();
+                    break;
+                }
+
+                case 256660548 /* linkToDeath */:
+                {
+                break;
+                }
+
+                case 256921159 /* ping */:
+                {
+                break;
+                }
+
+                case 257049926 /* getDebugInfo */:
+                {
+                    _hidl_request.enforceInterface(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+                    android.hidl.base.V1_0.DebugInfo _hidl_out_info = getDebugInfo();
+                    _hidl_reply.writeStatus(android.os.HwParcel.STATUS_SUCCESS);
+                    _hidl_out_info.writeToParcel(_hidl_reply);
+                    _hidl_reply.send();
+                    break;
+                }
+
+                case 257120595 /* notifySyspropsChanged */:
+                {
+                    _hidl_request.enforceInterface(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+                    notifySyspropsChanged();
+                    break;
+                }
+
+                case 257250372 /* unlinkToDeath */:
+                {
+                break;
+                }
+
+            }
+        }
+    }
+}
diff --git a/Qualcomm/QtiAudio/src/vendor/qti/hardware/radio/am/V1_0/IQcRilAudioCallback.java b/Qualcomm/QtiAudio/src/vendor/qti/hardware/radio/am/V1_0/IQcRilAudioCallback.java
new file mode 100644
index 0000000..6be55a3
--- /dev/null
+++ b/Qualcomm/QtiAudio/src/vendor/qti/hardware/radio/am/V1_0/IQcRilAudioCallback.java
@@ -0,0 +1,504 @@
+package vendor.qti.hardware.radio.am.V1_0;
+
+public interface IQcRilAudioCallback extends android.hidl.base.V1_0.IBase {
+    public static final String kInterfaceName = "vendor.qti.hardware.radio.am@1.0::IQcRilAudioCallback";
+
+    /* package private */ static IQcRilAudioCallback asInterface(android.os.IHwBinder binder) {
+        if (binder == null) {
+            return null;
+        }
+
+        android.os.IHwInterface iface =
+                binder.queryLocalInterface(kInterfaceName);
+
+        if ((iface != null) && (iface instanceof IQcRilAudioCallback)) {
+            return (IQcRilAudioCallback)iface;
+        }
+
+        IQcRilAudioCallback proxy = new IQcRilAudioCallback.Proxy(binder);
+
+        try {
+            for (String descriptor : proxy.interfaceChain()) {
+                if (descriptor.equals(kInterfaceName)) {
+                    return proxy;
+                }
+            }
+        } catch (android.os.RemoteException e) {
+        }
+
+        return null;
+    }
+
+    public static IQcRilAudioCallback castFrom(android.os.IHwInterface iface) {
+        return (iface == null) ? null : IQcRilAudioCallback.asInterface(iface.asBinder());
+    }
+
+    @Override
+    public android.os.IHwBinder asBinder();
+
+    public static IQcRilAudioCallback getService(String serviceName) throws android.os.RemoteException {
+        return IQcRilAudioCallback.asInterface(android.os.HwBinder.getService("vendor.qti.hardware.radio.am@1.0::IQcRilAudioCallback",serviceName));
+    }
+
+    public static IQcRilAudioCallback getService() throws android.os.RemoteException {
+        return IQcRilAudioCallback.asInterface(android.os.HwBinder.getService("vendor.qti.hardware.radio.am@1.0::IQcRilAudioCallback","default"));
+    }
+
+    String getParameters(String str)
+        throws android.os.RemoteException;
+    int setParameters(String str)
+        throws android.os.RemoteException;
+    java.util.ArrayList<String> interfaceChain()
+        throws android.os.RemoteException;
+    String interfaceDescriptor()
+        throws android.os.RemoteException;
+    java.util.ArrayList<byte[/* 32 */]> getHashChain()
+        throws android.os.RemoteException;
+    void setHALInstrumentation()
+        throws android.os.RemoteException;
+    boolean linkToDeath(android.os.IHwBinder.DeathRecipient recipient, long cookie)
+        throws android.os.RemoteException;
+    void ping()
+        throws android.os.RemoteException;
+    android.hidl.base.V1_0.DebugInfo getDebugInfo()
+        throws android.os.RemoteException;
+    void notifySyspropsChanged()
+        throws android.os.RemoteException;
+    boolean unlinkToDeath(android.os.IHwBinder.DeathRecipient recipient)
+        throws android.os.RemoteException;
+
+    public static final class Proxy implements IQcRilAudioCallback {
+        private android.os.IHwBinder mRemote;
+
+        public Proxy(android.os.IHwBinder remote) {
+            mRemote = java.util.Objects.requireNonNull(remote);
+        }
+
+        @Override
+        public android.os.IHwBinder asBinder() {
+            return mRemote;
+        }
+
+        @Override
+        public String toString() {
+            try {
+                return this.interfaceDescriptor() + "@Proxy";
+            } catch (android.os.RemoteException ex) {
+                /* ignored; handled below. */
+            }
+            return "[class or subclass of " + IQcRilAudioCallback.kInterfaceName + "]@Proxy";
+        }
+
+        // Methods from ::vendor::qti::hardware::radio::am::V1_0::IQcRilAudioCallback follow.
+        @Override
+        public String getParameters(String str)
+                throws android.os.RemoteException {
+            android.os.HwParcel _hidl_request = new android.os.HwParcel();
+            _hidl_request.writeInterfaceToken(IQcRilAudioCallback.kInterfaceName);
+            _hidl_request.writeString(str);
+
+            android.os.HwParcel _hidl_reply = new android.os.HwParcel();
+            try {
+                mRemote.transact(1 /* getParameters */, _hidl_request, _hidl_reply, 0 /* flags */);
+                _hidl_reply.verifySuccess();
+                _hidl_request.releaseTemporaryStorage();
+
+                String _hidl_out_result = _hidl_reply.readString();
+                return _hidl_out_result;
+            } finally {
+                _hidl_reply.release();
+            }
+        }
+
+        @Override
+        public int setParameters(String str)
+                throws android.os.RemoteException {
+            android.os.HwParcel _hidl_request = new android.os.HwParcel();
+            _hidl_request.writeInterfaceToken(IQcRilAudioCallback.kInterfaceName);
+            _hidl_request.writeString(str);
+
+            android.os.HwParcel _hidl_reply = new android.os.HwParcel();
+            try {
+                mRemote.transact(2 /* setParameters */, _hidl_request, _hidl_reply, 0 /* flags */);
+                _hidl_reply.verifySuccess();
+                _hidl_request.releaseTemporaryStorage();
+
+                int _hidl_out_success = _hidl_reply.readInt32();
+                return _hidl_out_success;
+            } finally {
+                _hidl_reply.release();
+            }
+        }
+
+        // Methods from ::android::hidl::base::V1_0::IBase follow.
+        @Override
+        public java.util.ArrayList<String> interfaceChain()
+                throws android.os.RemoteException {
+            android.os.HwParcel _hidl_request = new android.os.HwParcel();
+            _hidl_request.writeInterfaceToken(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+            android.os.HwParcel _hidl_reply = new android.os.HwParcel();
+            try {
+                mRemote.transact(256067662 /* interfaceChain */, _hidl_request, _hidl_reply, 0 /* flags */);
+                _hidl_reply.verifySuccess();
+                _hidl_request.releaseTemporaryStorage();
+
+                java.util.ArrayList<String> _hidl_out_descriptors = _hidl_reply.readStringVector();
+                return _hidl_out_descriptors;
+            } finally {
+                _hidl_reply.release();
+            }
+        }
+
+        @Override
+        public String interfaceDescriptor()
+                throws android.os.RemoteException {
+            android.os.HwParcel _hidl_request = new android.os.HwParcel();
+            _hidl_request.writeInterfaceToken(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+            android.os.HwParcel _hidl_reply = new android.os.HwParcel();
+            try {
+                mRemote.transact(256136003 /* interfaceDescriptor */, _hidl_request, _hidl_reply, 0 /* flags */);
+                _hidl_reply.verifySuccess();
+                _hidl_request.releaseTemporaryStorage();
+
+                String _hidl_out_descriptor = _hidl_reply.readString();
+                return _hidl_out_descriptor;
+            } finally {
+                _hidl_reply.release();
+            }
+        }
+
+        @Override
+        public java.util.ArrayList<byte[/* 32 */]> getHashChain()
+                throws android.os.RemoteException {
+            android.os.HwParcel _hidl_request = new android.os.HwParcel();
+            _hidl_request.writeInterfaceToken(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+            android.os.HwParcel _hidl_reply = new android.os.HwParcel();
+            try {
+                mRemote.transact(256398152 /* getHashChain */, _hidl_request, _hidl_reply, 0 /* flags */);
+                _hidl_reply.verifySuccess();
+                _hidl_request.releaseTemporaryStorage();
+
+                java.util.ArrayList<byte[/* 32 */]> _hidl_out_hashchain =  new java.util.ArrayList<byte[/* 32 */]>();
+                {
+                    android.os.HwBlob _hidl_blob = _hidl_reply.readBuffer(16 /* size */);
+                    {
+                        int _hidl_vec_size = _hidl_blob.getInt32(0 /* offset */ + 8 /* offsetof(hidl_vec<T>, mSize) */);
+                        android.os.HwBlob childBlob = _hidl_reply.readEmbeddedBuffer(
+                                _hidl_vec_size * 32,_hidl_blob.handle(),
+                                0 /* offset */ + 0 /* offsetof(hidl_vec<T>, mBuffer) */,true /* nullable */);
+
+                        _hidl_out_hashchain.clear();
+                        for (int _hidl_index_0 = 0; _hidl_index_0 < _hidl_vec_size; ++_hidl_index_0) {
+                            final byte[/* 32 */] _hidl_vec_element = new byte[32];
+                            {
+                                long _hidl_array_offset_1 = _hidl_index_0 * 32;
+                                for (int _hidl_index_1_0 = 0; _hidl_index_1_0 < 32; ++_hidl_index_1_0) {
+                                    _hidl_vec_element[_hidl_index_1_0] = childBlob.getInt8(_hidl_array_offset_1);
+                                    _hidl_array_offset_1 += 1;
+                                }
+                            }
+                            _hidl_out_hashchain.add(_hidl_vec_element);
+                        }
+                    }
+                }
+                return _hidl_out_hashchain;
+            } finally {
+                _hidl_reply.release();
+            }
+        }
+
+        @Override
+        public void setHALInstrumentation()
+                throws android.os.RemoteException {
+            android.os.HwParcel _hidl_request = new android.os.HwParcel();
+            _hidl_request.writeInterfaceToken(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+            android.os.HwParcel _hidl_reply = new android.os.HwParcel();
+            try {
+                mRemote.transact(256462420 /* setHALInstrumentation */, _hidl_request, _hidl_reply, android.os.IHwBinder.FLAG_ONEWAY);
+                _hidl_request.releaseTemporaryStorage();
+            } finally {
+                _hidl_reply.release();
+            }
+        }
+
+        @Override
+        public boolean linkToDeath(android.os.IHwBinder.DeathRecipient recipient, long cookie)
+                throws android.os.RemoteException {
+            return mRemote.linkToDeath(recipient, cookie);
+        }
+        @Override
+        public void ping()
+                throws android.os.RemoteException {
+            android.os.HwParcel _hidl_request = new android.os.HwParcel();
+            _hidl_request.writeInterfaceToken(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+            android.os.HwParcel _hidl_reply = new android.os.HwParcel();
+            try {
+                mRemote.transact(256921159 /* ping */, _hidl_request, _hidl_reply, 0 /* flags */);
+                _hidl_reply.verifySuccess();
+                _hidl_request.releaseTemporaryStorage();
+            } finally {
+                _hidl_reply.release();
+            }
+        }
+
+        @Override
+        public android.hidl.base.V1_0.DebugInfo getDebugInfo()
+                throws android.os.RemoteException {
+            android.os.HwParcel _hidl_request = new android.os.HwParcel();
+            _hidl_request.writeInterfaceToken(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+            android.os.HwParcel _hidl_reply = new android.os.HwParcel();
+            try {
+                mRemote.transact(257049926 /* getDebugInfo */, _hidl_request, _hidl_reply, 0 /* flags */);
+                _hidl_reply.verifySuccess();
+                _hidl_request.releaseTemporaryStorage();
+
+                android.hidl.base.V1_0.DebugInfo _hidl_out_info = new android.hidl.base.V1_0.DebugInfo();
+                _hidl_out_info.readFromParcel(_hidl_reply);
+                return _hidl_out_info;
+            } finally {
+                _hidl_reply.release();
+            }
+        }
+
+        @Override
+        public void notifySyspropsChanged()
+                throws android.os.RemoteException {
+            android.os.HwParcel _hidl_request = new android.os.HwParcel();
+            _hidl_request.writeInterfaceToken(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+            android.os.HwParcel _hidl_reply = new android.os.HwParcel();
+            try {
+                mRemote.transact(257120595 /* notifySyspropsChanged */, _hidl_request, _hidl_reply, android.os.IHwBinder.FLAG_ONEWAY);
+                _hidl_request.releaseTemporaryStorage();
+            } finally {
+                _hidl_reply.release();
+            }
+        }
+
+        @Override
+        public boolean unlinkToDeath(android.os.IHwBinder.DeathRecipient recipient)
+                throws android.os.RemoteException {
+            return mRemote.unlinkToDeath(recipient);
+        }
+    }
+
+    public static abstract class Stub extends android.os.HwBinder implements IQcRilAudioCallback {
+        @Override
+        public android.os.IHwBinder asBinder() {
+            return this;
+        }
+
+        @Override
+        public final java.util.ArrayList<String> interfaceChain() {
+            return new java.util.ArrayList<String>(java.util.Arrays.asList(
+                    IQcRilAudioCallback.kInterfaceName,
+                    android.hidl.base.V1_0.IBase.kInterfaceName));
+        }
+
+        @Override
+        public final String interfaceDescriptor() {
+            return IQcRilAudioCallback.kInterfaceName;
+
+        }
+
+        @Override
+        public final java.util.ArrayList<byte[/* 32 */]> getHashChain() {
+            return new java.util.ArrayList<byte[/* 32 */]>(java.util.Arrays.asList(
+                    new byte[/* 32 */]{-52,108,-122,12,-23,-127,-15,-89,-101,-41,-8,-38,67,-55,-25,-127,86,-27,-94,-49,-69,-90,93,89,61,-12,102,18,-25,61,16,47} /* cc6c860ce981f1a79bd7f8da43c9e78156e5a2cfbba65d593df46612e73d102f */,
+                    new byte[/* 32 */]{-67,-38,-74,24,77,122,52,109,-90,-96,125,-64,-126,-116,-15,-102,105,111,76,-86,54,17,-59,31,46,20,86,90,20,-76,15,-39} /* bddab6184d7a346da6a07dc0828cf19a696f4caa3611c51f2e14565a14b40fd9 */));
+
+        }
+
+        @Override
+        public final void setHALInstrumentation() {
+
+        }
+
+        @Override
+        public final boolean linkToDeath(android.os.IHwBinder.DeathRecipient recipient, long cookie) {
+            return true;
+        }
+
+        @Override
+        public final void ping() {
+            return;
+
+        }
+
+        @Override
+        public final android.hidl.base.V1_0.DebugInfo getDebugInfo() {
+            android.hidl.base.V1_0.DebugInfo info = new android.hidl.base.V1_0.DebugInfo();
+            info.pid = -1;
+            info.ptr = 0;
+            info.arch = android.hidl.base.V1_0.DebugInfo.Architecture.UNKNOWN;return info;
+        }
+
+        @Override
+        public final void notifySyspropsChanged() {
+            android.os.SystemProperties.reportSyspropChanged();
+        }
+
+        @Override
+        public final boolean unlinkToDeath(android.os.IHwBinder.DeathRecipient recipient) {
+            return true;
+
+        }
+
+        @Override
+        public android.os.IHwInterface queryLocalInterface(String descriptor) {
+            if (kInterfaceName.equals(descriptor)) {
+                return this;
+            }
+            return null;
+        }
+
+        public void registerAsService(String serviceName) throws android.os.RemoteException {
+            registerService(serviceName);
+        }
+
+        @Override
+        public String toString() {
+            return this.interfaceDescriptor() + "@Stub";
+        }
+
+        @Override
+        public void onTransact(int _hidl_code, android.os.HwParcel _hidl_request, final android.os.HwParcel _hidl_reply, int _hidl_flags)
+                throws android.os.RemoteException {
+            switch (_hidl_code) {
+                case 1 /* getParameters */:
+                {
+                    _hidl_request.enforceInterface(IQcRilAudioCallback.kInterfaceName);
+
+                    String str = _hidl_request.readString();
+                    String _hidl_out_result = getParameters(str);
+                    _hidl_reply.writeStatus(android.os.HwParcel.STATUS_SUCCESS);
+                    _hidl_reply.writeString(_hidl_out_result);
+                    _hidl_reply.send();
+                    break;
+                }
+
+                case 2 /* setParameters */:
+                {
+                    _hidl_request.enforceInterface(IQcRilAudioCallback.kInterfaceName);
+
+                    String str = _hidl_request.readString();
+                    int _hidl_out_success = setParameters(str);
+                    _hidl_reply.writeStatus(android.os.HwParcel.STATUS_SUCCESS);
+                    _hidl_reply.writeInt32(_hidl_out_success);
+                    _hidl_reply.send();
+                    break;
+                }
+
+                case 256067662 /* interfaceChain */:
+                {
+                    _hidl_request.enforceInterface(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+                    java.util.ArrayList<String> _hidl_out_descriptors = interfaceChain();
+                    _hidl_reply.writeStatus(android.os.HwParcel.STATUS_SUCCESS);
+                    _hidl_reply.writeStringVector(_hidl_out_descriptors);
+                    _hidl_reply.send();
+                    break;
+                }
+
+                case 256131655 /* debug */:
+                {
+                    _hidl_request.enforceInterface(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+                    _hidl_reply.writeStatus(android.os.HwParcel.STATUS_SUCCESS);
+                    _hidl_reply.send();
+                    break;
+                }
+
+                case 256136003 /* interfaceDescriptor */:
+                {
+                    _hidl_request.enforceInterface(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+                    String _hidl_out_descriptor = interfaceDescriptor();
+                    _hidl_reply.writeStatus(android.os.HwParcel.STATUS_SUCCESS);
+                    _hidl_reply.writeString(_hidl_out_descriptor);
+                    _hidl_reply.send();
+                    break;
+                }
+
+                case 256398152 /* getHashChain */:
+                {
+                    _hidl_request.enforceInterface(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+                    java.util.ArrayList<byte[/* 32 */]> _hidl_out_hashchain = getHashChain();
+                    _hidl_reply.writeStatus(android.os.HwParcel.STATUS_SUCCESS);
+                    {
+                        android.os.HwBlob _hidl_blob = new android.os.HwBlob(16 /* size */);
+                        {
+                            int _hidl_vec_size = _hidl_out_hashchain.size();
+                            _hidl_blob.putInt32(0 /* offset */ + 8 /* offsetof(hidl_vec<T>, mSize) */, _hidl_vec_size);
+                            _hidl_blob.putBool(0 /* offset */ + 12 /* offsetof(hidl_vec<T>, mOwnsBuffer) */, false);
+                            android.os.HwBlob childBlob = new android.os.HwBlob((int)(_hidl_vec_size * 32));
+                            for (int _hidl_index_0 = 0; _hidl_index_0 < _hidl_vec_size; ++_hidl_index_0) {
+                                {
+                                    long _hidl_array_offset_1 = _hidl_index_0 * 32;
+                                    for (int _hidl_index_1_0 = 0; _hidl_index_1_0 < 32; ++_hidl_index_1_0) {
+                                        childBlob.putInt8(_hidl_array_offset_1, _hidl_out_hashchain.get(_hidl_index_0)[_hidl_index_1_0]);
+                                        _hidl_array_offset_1 += 1;
+                                    }
+                                }
+                            }
+                            _hidl_blob.putBlob(0 /* offset */ + 0 /* offsetof(hidl_vec<T>, mBuffer) */, childBlob);
+                        }
+                        _hidl_reply.writeBuffer(_hidl_blob);
+                    }
+                    _hidl_reply.send();
+                    break;
+                }
+
+                case 256462420 /* setHALInstrumentation */:
+                {
+                    _hidl_request.enforceInterface(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+                    setHALInstrumentation();
+                    break;
+                }
+
+                case 256660548 /* linkToDeath */:
+                {
+                break;
+                }
+
+                case 256921159 /* ping */:
+                {
+                break;
+                }
+
+                case 257049926 /* getDebugInfo */:
+                {
+                    _hidl_request.enforceInterface(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+                    android.hidl.base.V1_0.DebugInfo _hidl_out_info = getDebugInfo();
+                    _hidl_reply.writeStatus(android.os.HwParcel.STATUS_SUCCESS);
+                    _hidl_out_info.writeToParcel(_hidl_reply);
+                    _hidl_reply.send();
+                    break;
+                }
+
+                case 257120595 /* notifySyspropsChanged */:
+                {
+                    _hidl_request.enforceInterface(android.hidl.base.V1_0.IBase.kInterfaceName);
+
+                    notifySyspropsChanged();
+                    break;
+                }
+
+                case 257250372 /* unlinkToDeath */:
+                {
+                break;
+                }
+
+            }
+        }
+    }
+}
diff --git a/overlay.mk b/overlay.mk
index 16ab8e5..8822bb8 100644
--- a/overlay.mk
+++ b/overlay.mk
@@ -3,7 +3,8 @@
 	treble-overlay-NightMode \
 	treble-overlay-Telephony-LTE \
 	treble-overlay-SystemUI-FalseLocks \
-	HardwareOverlayPicker
+	HardwareOverlayPicker \
+	QtiAudio
 
 
 PRODUCT_PACKAGES += \
