diff --git a/src/com/android/settings/HotspotOffReceiver.java b/src/com/android/settings/HotspotOffReceiver.java
index 06ced1f..f3c3fee 100644
--- a/src/com/android/settings/HotspotOffReceiver.java
+++ b/src/com/android/settings/HotspotOffReceiver.java
@@ -5,6 +5,7 @@
 import android.content.Context;
 import android.content.Intent;
 import android.net.wifi.WifiManager;
+import android.util.Log;
 
 import com.android.settingslib.TetherUtil;
 
@@ -14,11 +15,15 @@
  */
 public class HotspotOffReceiver extends BroadcastReceiver {
 
+    private static final String TAG = "HotspotOffReceiver";
+    private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
+
     @Override
     public void onReceive(Context context, Intent intent) {
         if (WifiManager.WIFI_AP_STATE_CHANGED_ACTION.equals(intent.getAction())) {
             WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
             if (wifiManager.getWifiApState() == WifiManager.WIFI_AP_STATE_DISABLED) {
+                if (DEBUG) Log.d(TAG, "TetherService.cancelRecheckAlarmIfNecessary called");
                 // The hotspot has been turned off, we don't need to recheck tethering.
                 TetherService.cancelRecheckAlarmIfNecessary(context, TetherUtil.TETHERING_WIFI);
             }
diff --git a/src/com/android/settings/TetherService.java b/src/com/android/settings/TetherService.java
index b6effad..346a175 100644
--- a/src/com/android/settings/TetherService.java
+++ b/src/com/android/settings/TetherService.java
@@ -89,21 +89,28 @@
                 mCurrentTethers.add(type);
             }
         }
+
         if (intent.hasExtra(TetherUtil.EXTRA_REM_TETHER_TYPE)) {
-            int type = intent.getIntExtra(TetherUtil.EXTRA_REM_TETHER_TYPE,
-                    TetherUtil.TETHERING_INVALID);
-            if (DEBUG) Log.d(TAG, "Removing tether " + type);
-            int index = mCurrentTethers.indexOf(type);
-            if (index >= 0) {
-                mCurrentTethers.remove(index);
-                // If we are currently in the middle of a check, we may need to adjust the
-                // index accordingly.
-                if (index <= mCurrentTypeIndex && mCurrentTypeIndex > 0) {
-                    mCurrentTypeIndex--;
+            if (!mInProvisionCheck) {
+                int type = intent.getIntExtra(TetherUtil.EXTRA_REM_TETHER_TYPE,
+                        TetherUtil.TETHERING_INVALID);
+                int index = mCurrentTethers.indexOf(type);
+                if (DEBUG) Log.d(TAG, "Removing tether " + type + ", index " + index);
+                if (index >= 0) {
+                    mCurrentTethers.remove(index);
+                    // If we are currently in the middle of a check, we may need to adjust the
+                    // index accordingly.
+                    if (DEBUG) Log.d(TAG, "mCurrentTypeIndex: " + mCurrentTypeIndex);
+                    if (index <= mCurrentTypeIndex && mCurrentTypeIndex > 0) {
+                        mCurrentTypeIndex--;
+                    }
                 }
+                cancelAlarmIfNecessary();
+            } else {
+                if (DEBUG) Log.d(TAG, "Don't cancel alarm during provisioning");
             }
-            cancelAlarmIfNecessary();
         }
+
         // Only set the alarm if we have one tether, meaning the one just added,
         // to avoid setting it when it was already set previously for another
         // type.
@@ -199,15 +206,17 @@
     }
 
     private void startProvisioning(int index) {
-        String provisionAction = getResources().getString(
-                com.android.internal.R.string.config_mobile_hotspot_provision_app_no_ui);
-        if (DEBUG) Log.d(TAG, "Sending provisioning broadcast: " + provisionAction + " type: "
-                + mCurrentTethers.get(index));
-        Intent intent = new Intent(provisionAction);
-        intent.putExtra(TETHER_CHOICE, mCurrentTethers.get(index));
-        intent.setFlags(Intent.FLAG_RECEIVER_FOREGROUND);
-        sendBroadcast(intent);
-        mInProvisionCheck = true;
+        if (index < mCurrentTethers.size()) {
+            String provisionAction = getResources().getString(
+                    com.android.internal.R.string.config_mobile_hotspot_provision_app_no_ui);
+            if (DEBUG) Log.d(TAG, "Sending provisioning broadcast: " + provisionAction + " type: "
+                    + mCurrentTethers.get(index));
+            Intent intent = new Intent(provisionAction);
+            intent.putExtra(TETHER_CHOICE, mCurrentTethers.get(index));
+            intent.setFlags(Intent.FLAG_RECEIVER_FOREGROUND);
+            sendBroadcast(intent);
+            mInProvisionCheck = true;
+        }
     }
 
     public static void scheduleRecheckAlarm(Context context, int type) {
@@ -261,13 +270,14 @@
             if (DEBUG) Log.d(TAG, "Got provision result " + intent);
             String provisionResponse = context.getResources().getString(
                     com.android.internal.R.string.config_mobile_hotspot_provision_response);
+
             if (provisionResponse.equals(intent.getAction())) {
                 if (!mInProvisionCheck) {
                     Log.e(TAG, "Unexpected provision response " + intent);
                     return;
                 }
-                mInProvisionCheck = false;
                 int checkType = mCurrentTethers.get(mCurrentTypeIndex);
+                mInProvisionCheck = false;
                 if (intent.getIntExtra(EXTRA_RESULT, RESULT_DEFAULT) == RESULT_OK) {
                     if (checkType == TetherUtil.TETHERING_WIFI && mEnableWifiAfterCheck) {
                         enableWifiTetheringIfNeeded();
@@ -286,7 +296,8 @@
                             break;
                     }
                 }
-                if (++mCurrentTypeIndex == mCurrentTethers.size()) {
+
+                if (++mCurrentTypeIndex >= mCurrentTethers.size()) {
                     // We are done with all checks, time to die.
                     stopSelf();
                 } else {
