diff --git a/src/com/android/settings/bluetooth/DockEventReceiver.java b/src/com/android/settings/bluetooth/DockEventReceiver.java
index 261ec1d..73f90e5 100644
--- a/src/com/android/settings/bluetooth/DockEventReceiver.java
+++ b/src/com/android/settings/bluetooth/DockEventReceiver.java
@@ -17,6 +17,7 @@
 package com.android.settings.bluetooth;
 
 import android.app.Service;
+import android.bluetooth.BluetoothAdapter;
 import android.bluetooth.BluetoothDevice;
 import android.content.BroadcastReceiver;
 import android.content.Context;
@@ -35,9 +36,11 @@
 
     private static final int EXTRA_INVALID = -1234;
 
-    static final Object mStartingServiceSync = new Object();
+    private static final Object mStartingServiceSync = new Object();
 
-    static PowerManager.WakeLock mStartingService;
+    private static final long WAKELOCK_TIMEOUT = 5000;
+
+    private static PowerManager.WakeLock mStartingService;
 
     @Override
     public void onReceive(Context context, Intent intent) {
@@ -84,14 +87,12 @@
                 PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
                 mStartingService = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
                         "StartingDockService");
-                mStartingService.setReferenceCounted(false);
             }
 
-            mStartingService.acquire();
+            mStartingService.acquire(WAKELOCK_TIMEOUT);
 
             if (context.startService(intent) == null) {
                 Log.e(TAG, "Can't start DockService");
-                mStartingService.release();
             }
         }
     }
@@ -104,9 +105,7 @@
         synchronized (mStartingServiceSync) {
             if (mStartingService != null) {
                 if (DEBUG) Log.d(TAG, "stopSelf id = "+ startId);
-                if (service.stopSelfResult(startId)) {
-                    mStartingService.release();
-                }
+                service.stopSelfResult(startId);
             }
         }
     }
diff --git a/src/com/android/settings/bluetooth/DockService.java b/src/com/android/settings/bluetooth/DockService.java
index 1ad2987..46e3d08 100644
--- a/src/com/android/settings/bluetooth/DockService.java
+++ b/src/com/android/settings/bluetooth/DockService.java
@@ -16,12 +16,8 @@
 
 package com.android.settings.bluetooth;
 
-import com.android.settings.R;
-import com.android.settings.bluetooth.LocalBluetoothProfileManager.Profile;
-
 import android.app.AlertDialog;
 import android.app.Notification;
-import android.app.PendingIntent;
 import android.app.Service;
 import android.bluetooth.BluetoothAdapter;
 import android.bluetooth.BluetoothDevice;
@@ -42,13 +38,15 @@
 import android.widget.CheckBox;
 import android.widget.CompoundButton;
 
+import com.android.settings.R;
+import com.android.settings.bluetooth.LocalBluetoothProfileManager.Profile;
+
 public class DockService extends Service implements AlertDialog.OnMultiChoiceClickListener,
         DialogInterface.OnClickListener, DialogInterface.OnDismissListener,
         CompoundButton.OnCheckedChangeListener {
 
     private static final String TAG = "DockService";
 
-    // TODO clean up logs. Disable DEBUG flag for this file and receiver's too
     private static final boolean DEBUG = false;
 
     // Time allowed for the device to be undocked and redocked without severing
@@ -166,7 +164,7 @@
     }
 
     // This method gets messages from both onStartCommand and mServiceHandler/mServiceLooper
-    void processMessage(Message msg) {
+    private synchronized void processMessage(Message msg) {
         int msgType = msg.what;
         int state = msg.arg1;
         int startId = msg.arg2;
@@ -424,7 +422,7 @@
         }
     };
 
-    private void applyBtSettings(final BluetoothDevice device, int startId) {
+    private synchronized void applyBtSettings(final BluetoothDevice device, int startId) {
         if (device == null || mProfiles == null || mCheckedItems == null)
             return;
 
@@ -465,14 +463,13 @@
         for (int i = 0; i < mProfiles.length; i++) {
             LocalBluetoothProfileManager profileManager = LocalBluetoothProfileManager
                     .getProfileManager(mBtManager, mProfiles[i]);
-            boolean isConnected = profileManager.isConnected(device);
 
             if (DEBUG) Log.d(TAG, mProfiles[i].toString() + " = " + mCheckedItems[i]);
 
-            if (mCheckedItems[i] && !isConnected) {
+            if (mCheckedItems[i]) {
                 // Checked but not connected
                 callConnect = true;
-            } else if (!mCheckedItems[i] && isConnected) {
+            } else if (!mCheckedItems[i]) {
                 // Unchecked but connected
                 if (DEBUG) Log.d(TAG, "applyBtSettings - Disconnecting");
                 cachedDevice.disconnect(mProfiles[i]);
@@ -491,7 +488,7 @@
         }
     }
 
-    void handleUndocked(Context context, LocalBluetoothManager localManager,
+    private synchronized void handleUndocked(Context context, LocalBluetoothManager localManager,
             BluetoothDevice device) {
         if (mDialog != null) {
             mDialog.dismiss();
@@ -513,20 +510,4 @@
         }
         return cachedBluetoothDevice;
     }
-
-    // TODO Delete this method if not needed.
-    private Notification getNotification(Service service) {
-        CharSequence title = service.getString(R.string.dock_settings_title);
-
-        Notification n = new Notification(R.drawable.ic_bt_headphones_a2dp, title, System
-                .currentTimeMillis());
-
-        CharSequence contentText = service.getString(R.string.dock_settings_summary);
-        Intent notificationIntent = new Intent(service, DockEventReceiver.class);
-        notificationIntent.setAction(DockEventReceiver.ACTION_DOCK_SHOW_UI);
-        PendingIntent pendingIntent = PendingIntent.getActivity(service, 0, notificationIntent, 0);
-
-        n.setLatestEventInfo(service, title, contentText, pendingIntent);
-        return n;
-    }
 }
