diff --git a/Android.bp b/Android.bp
index 4175047..9649f23 100644
--- a/Android.bp
+++ b/Android.bp
@@ -3,7 +3,8 @@
     srcs: ["src/**/*.java"],
     platform_apis: true,
     certificate: "platform",
-    static_libs: ["android.hardware.secure_element-V1.0-java"],
+    static_libs: ["android.hardware.secure_element-V1.0-java",
+                  "android.hardware.secure_element-V1.1-java"],
     optimize: {
         enabled: false,
     },
diff --git a/src/com/android/se/Terminal.java b/src/com/android/se/Terminal.java
index efdb2b3..00382ef 100644
--- a/src/com/android/se/Terminal.java
+++ b/src/com/android/se/Terminal.java
@@ -81,30 +81,46 @@
     private ISecureElementHalCallback.Stub mHalCallback = new ISecureElementHalCallback.Stub() {
         @Override
         public void onStateChange(boolean state) {
-            synchronized (mLock) {
-                Log.i(mTag, "OnStateChange:" + state);
-                mIsConnected = state;
-                if (!state) {
-                    if (mAccessControlEnforcer != null) {
-                        mAccessControlEnforcer.reset();
-                    }
-                } else {
-                    // If any logical channel in use is in the channel list, it should be closed
-                    // because the access control enfocer allowed to open it by checking the access
-                    // rules retrieved before. Now we are going to retrieve the rules again and
-                    // the new rules can be different from the previous ones.
-                    closeChannels();
-                    try {
-                        initializeAccessControl();
-                    } catch (Exception e) {
-                        // ignore
-                    }
-                    mDefaultApplicationSelectedOnBasicChannel = true;
-                }
-            }
+            stateChange(state, "");
         }
     };
 
+    private android.hardware.secure_element.V1_1.ISecureElementHalCallback.Stub mHalCallback11 =
+            new android.hardware.secure_element.V1_1.ISecureElementHalCallback.Stub() {
+        @Override
+        public void onStateChange_1_1(boolean state, String reason) {
+            stateChange(state, reason);
+        }
+
+        public void onStateChange(boolean state) {
+            return;
+        }
+    };
+
+    private void stateChange(boolean state, String reason) {
+        synchronized (mLock) {
+            Log.i(mTag, "OnStateChange:" + state + " reason:" + reason);
+            mIsConnected = state;
+            if (!state) {
+                if (mAccessControlEnforcer != null) {
+                    mAccessControlEnforcer.reset();
+                }
+            } else {
+                // If any logical channel in use is in the channel list, it should be closed
+                // because the access control enfocer allowed to open it by checking the access
+                // rules retrieved before. Now we are going to retrieve the rules again and
+                // the new rules can be different from the previous ones.
+                closeChannels();
+                try {
+                    initializeAccessControl();
+                } catch (Exception e) {
+                    // ignore
+                }
+                mDefaultApplicationSelectedOnBasicChannel = true;
+            }
+        }
+    }
+
     class SecureElementDeathRecipient implements HwBinder.DeathRecipient {
         @Override
         public void serviceDied(long cookie) {
@@ -155,11 +171,20 @@
      */
     public void initialize() throws NoSuchElementException, RemoteException {
         synchronized (mLock) {
-            mSEHal = ISecureElement.getService(mName, true);
-            if (mSEHal == null) {
-                throw new NoSuchElementException("No HAL is provided for " + mName);
+            android.hardware.secure_element.V1_1.ISecureElement seHal11 =
+                    android.hardware.secure_element.V1_1.ISecureElement.getService(mName, true);
+            if (seHal11 == null) {
+                mSEHal = ISecureElement.getService(mName, true);
+                if (mSEHal == null) {
+                    throw new NoSuchElementException("No HAL is provided for " + mName);
+                }
             }
-            mSEHal.init(mHalCallback);
+            if (seHal11 != null) {
+                seHal11.init_1_1(mHalCallback11);
+                mSEHal = seHal11;
+            } else {
+                mSEHal.init(mHalCallback);
+            }
             mSEHal.linkToDeath(mDeathRecipient, 0);
         }
         Log.i(mTag, mName + " was initialized");
