Automated import from //branches/donutburger/...@141696,141696
diff --git a/core/java/android/server/BluetoothDeviceService.java b/core/java/android/server/BluetoothDeviceService.java
index a815e57..c61b25a 100644
--- a/core/java/android/server/BluetoothDeviceService.java
+++ b/core/java/android/server/BluetoothDeviceService.java
@@ -63,8 +63,10 @@
     private BluetoothEventLoop mEventLoop;
     private IntentFilter mIntentFilter;
     private boolean mIsAirplaneSensitive;
-    private final BondState mBondState = new BondState();  // local cache of bondings
     private int mBluetoothState;
+    private boolean mRestart = false;  // need to call enable() after disable()
+
+    private final BondState mBondState = new BondState();  // local cache of bondings
     private boolean mIsDiscovering;
     private final IBatteryStats mBatteryStats;
 
@@ -218,6 +220,11 @@
         } finally {
             Binder.restoreCallingIdentity(ident);
         }
+
+        if (mRestart) {
+            mRestart = false;
+            enable();
+        }
     }
 
     /** Bring up BT and persist BT on in settings */
@@ -252,6 +259,17 @@
         return true;
     }
 
+    /** Forcibly restart Bluetooth if it is on */
+    /* package */ synchronized void restart() {
+        if (mBluetoothState != BluetoothDevice.BLUETOOTH_STATE_ON) {
+            return;
+        }
+        mRestart = true;
+        if (!disable(false)) {
+            mRestart = false;
+        }
+    }   
+
     private synchronized void setBluetoothState(int state) {
         if (state == mBluetoothState) {
             return;
diff --git a/core/java/android/server/BluetoothEventLoop.java b/core/java/android/server/BluetoothEventLoop.java
index 6eabea4..11c297c 100644
--- a/core/java/android/server/BluetoothEventLoop.java
+++ b/core/java/android/server/BluetoothEventLoop.java
@@ -76,8 +76,7 @@
                 }
                 break;
             case EVENT_RESTART_BLUETOOTH:
-                mBluetoothService.disable();
-                mBluetoothService.enable();
+                mBluetoothService.restart();
                 break;
             }
         }
@@ -170,6 +169,7 @@
         if (mode >= 0) {
             Intent intent = new Intent(BluetoothIntent.SCAN_MODE_CHANGED_ACTION);
             intent.putExtra(BluetoothIntent.SCAN_MODE, mode);
+            intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
             mContext.sendBroadcast(intent, BLUETOOTH_PERM);
         }
     }