diff --git a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothA2dpFacade.java b/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothA2dpFacade.java
index 932bcbd..cee0fe9 100644
--- a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothA2dpFacade.java
+++ b/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothA2dpFacade.java
@@ -140,8 +140,9 @@
         if (sA2dpProfile == null) {
             return false;
         }
-        BluetoothDevice mDevice = BluetoothFacade.getDevice(
-                BluetoothFacade.DiscoveredDevices, deviceID);
+        BluetoothDevice mDevice =
+                BluetoothFacade.getDevice(
+                        mBluetoothAdapter.getBondedDevices(), deviceID);
         Log.d("Connecting to device " + mDevice.getAliasName());
         return a2dpConnect(mDevice);
     }
@@ -161,9 +162,11 @@
         if (sA2dpProfile == null) {
             return false;
         }
-        List<BluetoothDevice> connectedA2dpDevices = sA2dpProfile.getConnectedDevices();
+        List<BluetoothDevice> connectedA2dpDevices =
+                sA2dpProfile.getConnectedDevices();
         Log.d("Connected a2dp devices " + connectedA2dpDevices);
-        BluetoothDevice mDevice = BluetoothFacade.getDevice(connectedA2dpDevices, deviceID);
+        BluetoothDevice mDevice = BluetoothFacade.getDevice(
+                connectedA2dpDevices, deviceID);
         return a2dpDisconnect(mDevice);
     }
 
@@ -179,10 +182,9 @@
             continue;
         }
         return sA2dpProfile.getDevicesMatchingConnectionStates(
-                    new int[] {
-                            BluetoothProfile.STATE_CONNECTED,
-                            BluetoothProfile.STATE_CONNECTING,
-                            BluetoothProfile.STATE_DISCONNECTING});
+                new int[] { BluetoothProfile.STATE_CONNECTED,
+                    BluetoothProfile.STATE_CONNECTING,
+                    BluetoothProfile.STATE_DISCONNECTING});
     }
 
     @Override
diff --git a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothA2dpSinkFacade.java b/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothA2dpSinkFacade.java
index 1b1e5b6..5d07200 100644
--- a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothA2dpSinkFacade.java
+++ b/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothA2dpSinkFacade.java
@@ -16,9 +16,6 @@
 
 package com.googlecode.android_scripting.facade.bluetooth;
 
-import java.util.List;
-import java.util.ArrayList;
-
 import android.app.Service;
 import android.bluetooth.BluetoothA2dpSink;
 import android.bluetooth.BluetoothAdapter;
@@ -33,131 +30,182 @@
 import com.googlecode.android_scripting.rpc.Rpc;
 import com.googlecode.android_scripting.rpc.RpcParameter;
 
+import java.util.ArrayList;
+import java.util.List;
+
 public class BluetoothA2dpSinkFacade extends RpcReceiver {
-  static final ParcelUuid[] SOURCE_UUIDS = {
-    BluetoothUuid.AudioSource,
-  };
+    static final ParcelUuid[] SOURCE_UUIDS = {
+        BluetoothUuid.AudioSource,
+    };
 
-  private final Service mService;
-  private final BluetoothAdapter mBluetoothAdapter;
+    private final Service mService;
+    private final BluetoothAdapter mBluetoothAdapter;
 
-  private static BluetoothA2dpSink sA2dpSinkProfile = null;
+    private static BluetoothA2dpSink sA2dpSinkProfile = null;
 
-  public BluetoothA2dpSinkFacade(FacadeManager manager) {
-    super(manager);
-    mService = manager.getService();
-    mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
-    mBluetoothAdapter.getProfileProxy(mService, new A2dpSinkServiceListener(),
+    public BluetoothA2dpSinkFacade(FacadeManager manager) {
+        super(manager);
+        mService = manager.getService();
+        mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
+        mBluetoothAdapter.getProfileProxy(mService, new A2dpSinkServiceListener(),
         BluetoothProfile.A2DP_SINK);
-  }
+    }
 
-  class A2dpSinkServiceListener implements BluetoothProfile.ServiceListener {
-    @Override
-    public void onServiceConnected(int profile, BluetoothProfile proxy) {
-      sA2dpSinkProfile = (BluetoothA2dpSink) proxy;
+    class A2dpSinkServiceListener implements BluetoothProfile.ServiceListener {
+        @Override
+        public void onServiceConnected(int profile, BluetoothProfile proxy) {
+            sA2dpSinkProfile = (BluetoothA2dpSink) proxy;
+        }
+
+        @Override
+        public void onServiceDisconnected(int profile) {
+            sA2dpSinkProfile = null;
+        }
+    }
+
+    /**
+     * Connect A2dp Sink profile.
+     * @param device - the Bluetooth Device object to connect.
+     * @return if the A2dp Sink Profile connection was successful or not.
+     */
+    public Boolean a2dpSinkConnect(BluetoothDevice device) {
+        if (sA2dpSinkProfile == null) return false;
+        return sA2dpSinkProfile.connect(device);
+    }
+
+    /**
+     * Disconnect A2dp Sink profile.
+     * @param device - the Bluetooth Device object to connect.
+     * @return if the A2dp Sink Profile disconnection was successful or not.
+     */
+    public Boolean a2dpSinkDisconnect(BluetoothDevice device) {
+        if (sA2dpSinkProfile == null) return false;
+        return sA2dpSinkProfile.disconnect(device);
+    }
+
+    /**
+     * Set priority of the profile.
+     * @param deviceStr - Mac address of a Bluetooth device.
+     * @param priority - Priority that needs to be set.
+     */
+    @Rpc(description = "Set priority of the profile")
+    public void bluetoothA2dpSinkSetPriority(
+            @RpcParameter(name = "device", description = "Mac address of a BT device.")
+            String deviceStr,
+            @RpcParameter(name = "priority", description = "Priority that needs to be set.")
+            Integer priority)
+            throws Exception {
+        if (sA2dpSinkProfile == null) return;
+        BluetoothDevice device =
+                BluetoothFacade.getDevice(
+                        mBluetoothAdapter.getBondedDevices(), deviceStr);
+        Log.d("Changing priority of device "
+                + device.getAliasName() + " p: " + priority);
+        sA2dpSinkProfile.setPriority(device, priority);
+    }
+
+    /**
+     * Get priority of the profile.
+      * @param deviceStr - Mac address of a Bluetooth device.
+      * @return priority of the device.
+     */
+    @Rpc(description = "get priority of the profile")
+    public Integer bluetoothA2dpSinkGetPriority(
+            @RpcParameter(name = "device", description = "Mac address of a BT device.")
+                String deviceStr)
+            throws Exception {
+        if (sA2dpSinkProfile == null) return BluetoothProfile.PRIORITY_UNDEFINED;
+        BluetoothDevice device =
+                BluetoothFacade.getDevice(
+                mBluetoothAdapter.getBondedDevices(), deviceStr);
+        return sA2dpSinkProfile.getPriority(device);
+    }
+
+    /**
+     * Is A2dpSink profile ready.
+     * @return if the Profile is ready or not.
+     */
+    @Rpc(description = "Is A2dpSink profile ready.")
+    public Boolean bluetoothA2dpSinkIsReady() {
+        return sA2dpSinkProfile != null;
+    }
+
+    /**
+     * Connect to an A2DP Sink device.
+     * @param deviceStr - Name or MAC address of a bluetooth device.
+     * @return connection to A2DP was successful.
+     */
+    @Rpc(description = "Connect to an A2DP Sink device.")
+    public Boolean bluetoothA2dpSinkConnect(
+            @RpcParameter(name = "device", description =
+                "Name or MAC address of a bluetooth device.") String deviceStr)
+            throws Exception {
+        if (sA2dpSinkProfile == null) return false;
+        BluetoothDevice device =
+                BluetoothFacade.getDevice(
+                BluetoothFacade.DiscoveredDevices, deviceStr);
+        Log.d("Connecting to device " + device.getAliasName());
+        return a2dpSinkConnect(device);
+    }
+
+    /**
+     * Disconnect to an A2DP Sink device.
+     * @param deviceStr - Name or MAC address of a bluetooth device.
+     * @return disconnection to A2DP was successful or not.
+     */
+    @Rpc(description = "Disconnect an A2DP Sink device.")
+    public Boolean bluetoothA2dpSinkDisconnect(
+            @RpcParameter(name = "device", description = "Name or MAC address of a device.")
+                String deviceStr) {
+        if (sA2dpSinkProfile == null) return false;
+        Log.d("Connected devices: " + sA2dpSinkProfile.getConnectedDevices());
+        BluetoothDevice device = null;
+        try {
+            device = BluetoothFacade.getDevice(
+                    sA2dpSinkProfile.getConnectedDevices(), deviceStr);
+            return a2dpSinkDisconnect(device);
+        } catch (Exception e) {
+            // Do nothing here. Since it is disconnect this function should force shutdown anyways.
+            Log.d("bluetoothA2dpSinkDisconnect error while getDevice " + e);
+        }
+        return false;
+    }
+
+    /**
+     * Get all the devices connected through A2DP Sink.
+     * @return List of all the devices connected through A2dp Sink.
+     */
+    @Rpc(description = "Get all the devices connected through A2DP Sink.")
+    public List<BluetoothDevice> bluetoothA2dpSinkGetConnectedDevices() {
+        if (sA2dpSinkProfile == null) return new ArrayList<BluetoothDevice>();
+        return sA2dpSinkProfile.getConnectedDevices();
+    }
+
+    /**
+     * Get the connection status of a device.
+     * @param deviceID - Name or MAC address of a bluetooth device.
+     * @return connection status of the device.
+     */
+    @Rpc(description = "Get the connection status of a device.")
+    public Integer bluetoothA2dpSinkGetConnectionStatus(
+            @RpcParameter(name = "deviceID",
+                description = "Name or MAC address of a bluetooth device.")
+                String deviceID) {
+        if (sA2dpSinkProfile == null) {
+            return BluetoothProfile.STATE_DISCONNECTED;
+        }
+        List<BluetoothDevice> deviceList = sA2dpSinkProfile.getConnectedDevices();
+        BluetoothDevice device;
+        try {
+            device = BluetoothFacade.getDevice(deviceList, deviceID);
+        } catch (Exception e) {
+            Log.e(e);
+            return BluetoothProfile.STATE_DISCONNECTED;
+        }
+        return sA2dpSinkProfile.getConnectionState(device);
     }
 
     @Override
-    public void onServiceDisconnected(int profile) {
-      sA2dpSinkProfile = null;
+    public void shutdown() {
     }
-  }
-
-  public Boolean a2dpSinkConnect(BluetoothDevice device) {
-    if (sA2dpSinkProfile == null) return false;
-    return sA2dpSinkProfile.connect(device);
-  }
-
-  public Boolean a2dpSinkDisconnect(BluetoothDevice device) {
-    if (sA2dpSinkProfile == null) return false;
-    return sA2dpSinkProfile.disconnect(device);
-  }
-
-  @Rpc(description = "Set priority of the profile")
-  public void bluetoothA2dpSinkSetPriority(
-      @RpcParameter(name = "device", description = "Mac address of a BT device.")
-      String deviceStr,
-      @RpcParameter(name = "priority", description = "Priority that needs to be set.")
-      Integer priority)
-      throws Exception {
-    if (sA2dpSinkProfile == null) return;
-    BluetoothDevice device =
-        BluetoothFacade.getDevice(mBluetoothAdapter.getBondedDevices(), deviceStr);
-    Log.d("Changing priority of device " + device.getAliasName() + " p: " + priority);
-    sA2dpSinkProfile.setPriority(device, priority);
-  }
-
-  @Rpc(description = "get priority of the profile")
-  public Integer bluetoothA2dpSinkGetPriority(
-      @RpcParameter(name = "device", description = "Mac address of a BT device.")
-      String deviceStr)
-      throws Exception {
-    if (sA2dpSinkProfile == null) return BluetoothProfile.PRIORITY_UNDEFINED;
-    BluetoothDevice device =
-        BluetoothFacade.getDevice(mBluetoothAdapter.getBondedDevices(), deviceStr);
-    return sA2dpSinkProfile.getPriority(device);
-  }
-
-  @Rpc(description = "Is A2dpSink profile ready.")
-  public Boolean bluetoothA2dpSinkIsReady() {
-    return (sA2dpSinkProfile != null);
-  }
-
-  @Rpc(description = "Connect to an A2DP Sink device.")
-  public Boolean bluetoothA2dpSinkConnect(
-      @RpcParameter(name = "device", description = "Name or MAC address of a bluetooth device.")
-      String deviceStr)
-      throws Exception {
-    if (sA2dpSinkProfile == null) return false;
-    BluetoothDevice device =
-        BluetoothFacade.getDevice(BluetoothFacade.DiscoveredDevices, deviceStr);
-    Log.d("Connecting to device " + device.getAliasName());
-    return a2dpSinkConnect(device);
-  }
-
-  @Rpc(description = "Disconnect an A2DP Sink device.")
-  public Boolean bluetoothA2dpSinkDisconnect(
-      @RpcParameter(name = "device", description = "Name or MAC address of a device.")
-      String deviceStr) {
-    if (sA2dpSinkProfile == null) return false;
-    Log.d("Connected devices: " + sA2dpSinkProfile.getConnectedDevices());
-    BluetoothDevice device = null;
-    try {
-      device = BluetoothFacade.getDevice(sA2dpSinkProfile.getConnectedDevices(), deviceStr);
-      return a2dpSinkDisconnect(device);
-    } catch (Exception e) {
-        // Do nothing here. Since it is disconnect this function should force shutdown anyways.
-        Log.d("bluetoothA2dpSinkDisconnect error while getDevice " + e);
-    }
-    return false;
-  }
-
-  @Rpc(description = "Get all the devices connected through A2DP Sink.")
-  public List<BluetoothDevice> bluetoothA2dpSinkGetConnectedDevices() {
-    if (sA2dpSinkProfile == null) return new ArrayList<BluetoothDevice>();
-    return sA2dpSinkProfile.getConnectedDevices();
-  }
-
-  @Rpc(description = "Get the connection status of a device.")
-  public Integer bluetoothA2dpSinkGetConnectionStatus(
-      @RpcParameter(name = "deviceID",
-                    description = "Name or MAC address of a bluetooth device.")
-        String deviceID) {
-    if (sA2dpSinkProfile == null) {
-      return BluetoothProfile.STATE_DISCONNECTED;
-    }
-    List<BluetoothDevice> deviceList = sA2dpSinkProfile.getConnectedDevices();
-    BluetoothDevice device;
-    try {
-      device = BluetoothFacade.getDevice(deviceList, deviceID);
-    } catch (Exception e) {
-      Log.e(e);
-      return BluetoothProfile.STATE_DISCONNECTED;
-    }
-    return sA2dpSinkProfile.getConnectionState(device);
-  }
-
-  @Override
-  public void shutdown() {
-  }
 }
diff --git a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothAvrcpFacade.java b/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothAvrcpFacade.java
index 4ecba05..52bb36d 100644
--- a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothAvrcpFacade.java
+++ b/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothAvrcpFacade.java
@@ -16,9 +16,6 @@
 
 package com.googlecode.android_scripting.facade.bluetooth;
 
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.List;
 
 import android.app.Service;
 import android.bluetooth.BluetoothAdapter;
@@ -33,65 +30,79 @@
 import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
 import com.googlecode.android_scripting.rpc.Rpc;
 
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.List;
+
 public class BluetoothAvrcpFacade extends RpcReceiver {
-  static final ParcelUuid[] AVRCP_UUIDS = {
-    BluetoothUuid.AvrcpTarget, BluetoothUuid.AvrcpController
-  };
-  private final Service mService;
-  private final BluetoothAdapter mBluetoothAdapter;
+    static final ParcelUuid[] AVRCP_UUIDS = {
+        BluetoothUuid.AvrcpTarget, BluetoothUuid.AvrcpController
+    };
+    private final Service mService;
+    private final BluetoothAdapter mBluetoothAdapter;
 
-  private static boolean sIsAvrcpReady = false;
-  private static BluetoothAvrcpController sAvrcpProfile = null;
+    private static boolean sIsAvrcpReady = false;
+    private static BluetoothAvrcpController sAvrcpProfile = null;
 
-  public BluetoothAvrcpFacade(FacadeManager manager) {
-    super(manager);
-    mService = manager.getService();
-    mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
-    mBluetoothAdapter.getProfileProxy(mService, new AvrcpServiceListener(),
+    public BluetoothAvrcpFacade(FacadeManager manager) {
+        super(manager);
+        mService = manager.getService();
+        mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
+        mBluetoothAdapter.getProfileProxy(mService, new AvrcpServiceListener(),
         BluetoothProfile.AVRCP_CONTROLLER);
-  }
+    }
 
-  class AvrcpServiceListener implements BluetoothProfile.ServiceListener {
-    @Override
-    public void onServiceConnected(int profile, BluetoothProfile proxy) {
-      sAvrcpProfile = (BluetoothAvrcpController) proxy;
-      sIsAvrcpReady = true;
+    class AvrcpServiceListener implements BluetoothProfile.ServiceListener {
+        @Override
+        public void onServiceConnected(int profile, BluetoothProfile proxy) {
+            sAvrcpProfile = (BluetoothAvrcpController) proxy;
+            sIsAvrcpReady = true;
+        }
+
+        @Override
+        public void onServiceDisconnected(int profile) {
+            sIsAvrcpReady = false;
+        }
+    }
+
+    /**
+     * Is Avrcp profile ready.
+     * @return Avrcp profile is ready or not.
+     */
+    @Rpc(description = "Is Avrcp profile ready.")
+    public Boolean bluetoothAvrcpIsReady() {
+        return sIsAvrcpReady;
+    }
+
+    /**
+     * Get all the devices connected through AVRCP.
+     * @return Lsit of the devices connected through AVRCP.
+     */
+    @Rpc(description = "Get all the devices connected through AVRCP.")
+    public List<BluetoothDevice> bluetoothAvrcpGetConnectedDevices() {
+        if (!sIsAvrcpReady) {
+            Log.d("AVRCP profile is not ready.");
+            return null;
+        }
+        return sAvrcpProfile.getConnectedDevices();
+    }
+
+    /**
+     * Close AVRCP connection.
+     */
+    @Rpc(description = "Close AVRCP connection.")
+    public void bluetoothAvrcpDisconnect() throws NoSuchMethodException,
+            IllegalAccessException, IllegalArgumentException,
+                InvocationTargetException {
+        if (!sIsAvrcpReady) {
+            Log.d("AVRCP profile is not ready.");
+            return;
+        }
+        Method m = sAvrcpProfile.getClass().getMethod("close");
+        m.invoke(sAvrcpProfile);
     }
 
     @Override
-    public void onServiceDisconnected(int profile) {
-      sIsAvrcpReady = false;
+    public void shutdown() {
     }
-  }
-
-  @Rpc(description = "Is Avrcp profile ready.")
-  public Boolean bluetoothAvrcpIsReady() {
-    return sIsAvrcpReady;
-  }
-
-  @Rpc(description = "Get all the devices connected through AVRCP.")
-  public List<BluetoothDevice> bluetoothAvrcpGetConnectedDevices() {
-    if (!sIsAvrcpReady) {
-        Log.d("AVRCP profile is not ready.");
-        return null;
-    }
-    return sAvrcpProfile.getConnectedDevices();
-  }
-
-  @Rpc(description = "Close AVRCP connection.")
-  public void bluetoothAvrcpDisconnect() throws NoSuchMethodException,
-                                                IllegalAccessException,
-                                                IllegalArgumentException,
-                                                InvocationTargetException {
-      if (!sIsAvrcpReady) {
-          Log.d("AVRCP profile is not ready.");
-          return;
-      }
-      Method m = sAvrcpProfile.getClass().getMethod("close");
-      m.invoke(sAvrcpProfile);
-  }
-
-  @Override
-  public void shutdown() {
-  }
 }
diff --git a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothBroadcastHelper.java b/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothBroadcastHelper.java
index f3bc288..aab5e63 100644
--- a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothBroadcastHelper.java
+++ b/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothBroadcastHelper.java
@@ -25,36 +25,45 @@
 
 public class BluetoothBroadcastHelper {
 
-  private static BroadcastReceiver mListener;
-  private final Context mContext;
-  private final BroadcastReceiver mReceiver;
-  private final String[] mActions = {BluetoothDevice.ACTION_FOUND,
-                                     BluetoothDevice.ACTION_UUID,
-                                     BluetoothAdapter.ACTION_DISCOVERY_STARTED,
-                                     BluetoothAdapter.ACTION_DISCOVERY_FINISHED};
+    private static BroadcastReceiver sListener;
+    private final Context mContext;
+    private final BroadcastReceiver mReceiver;
+    private final String[] mActions = {BluetoothDevice.ACTION_FOUND,
+            BluetoothDevice.ACTION_UUID,
+            BluetoothAdapter.ACTION_DISCOVERY_STARTED,
+            BluetoothAdapter.ACTION_DISCOVERY_FINISHED};
 
-  public BluetoothBroadcastHelper(Context context, BroadcastReceiver listener) {
-    mContext = context;
-    mListener = listener;
-    mReceiver = new BluetoothReceiver();
-  }
-
-  public void startReceiver() {
-    IntentFilter mIntentFilter = new IntentFilter();
-    for(String action : mActions) {
-      mIntentFilter.addAction(action);
+    public BluetoothBroadcastHelper(Context context, BroadcastReceiver listener) {
+        mContext = context;
+        sListener = listener;
+        mReceiver = new BluetoothReceiver();
     }
-    mContext.registerReceiver(mReceiver, mIntentFilter);
-  }
 
-  public static class BluetoothReceiver extends BroadcastReceiver {
-    @Override
-    public void onReceive(Context context, Intent intent) {
-      mListener.onReceive(context, intent);
+    /**
+     * Start the Receiver.
+     */
+    public void startReceiver() {
+        IntentFilter mIntentFilter = new IntentFilter();
+        for (String action : mActions) {
+            mIntentFilter.addAction(action);
+        }
+        mContext.registerReceiver(mReceiver, mIntentFilter);
     }
-  }
 
-  public void stopReceiver() {
-    mContext.unregisterReceiver(mReceiver);
-  }
+    /**
+     * Bluetooth Receiver Class.
+     */
+    public static class BluetoothReceiver extends BroadcastReceiver {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            sListener.onReceive(context, intent);
+        }
+    }
+
+    /**
+     * Unregister the receiver.
+     */
+    public void stopReceiver() {
+        mContext.unregisterReceiver(mReceiver);
+    }
 }
diff --git a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothConnectionFacade.java b/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothConnectionFacade.java
index 8443883..6945f9e 100644
--- a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothConnectionFacade.java
+++ b/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothConnectionFacade.java
@@ -16,13 +16,6 @@
 
 package com.googlecode.android_scripting.facade.bluetooth;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
 import android.app.Service;
 import android.bluetooth.BluetoothA2dp;
 import android.bluetooth.BluetoothA2dpSink;
@@ -58,6 +51,13 @@
 import org.json.JSONArray;
 import org.json.JSONException;
 
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
 public class BluetoothConnectionFacade extends RpcReceiver {
 
     private final Service mService;
diff --git a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothDiscoveryHelper.java b/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothDiscoveryHelper.java
index 11a240c..51ebf5f 100644
--- a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothDiscoveryHelper.java
+++ b/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothDiscoveryHelper.java
@@ -23,74 +23,98 @@
 import android.content.Intent;
 import android.content.IntentFilter;
 
-import java.util.Set;
-
 import com.googlecode.android_scripting.Log;
 
+import java.util.Set;
+
+/**
+ * This class is used to put the device in discovery mode.
+ */
 public class BluetoothDiscoveryHelper {
 
-  public static interface BluetoothDiscoveryListener {
-    public void addBondedDevice(String name, String address);
+    /**
+     * BLuetooth discovery listener Interface.
+     */
+    public interface BluetoothDiscoveryListener {
 
-    public void addDevice(String name, String address);
+        /**
+         * Add Bonded device.
+         */
+        void addBondedDevice(String name, String address);
 
-    public void scanDone();
-  }
+        /**
+         * Add Devices.
+         */
+        void addDevice(String name, String address);
 
-  private final Context mContext;
-  private final BluetoothDiscoveryListener mListener;
-  private final BroadcastReceiver mReceiver;
+        /**
+         * Complete scanning.
+         */
+        void scanDone();
+    }
 
-  public BluetoothDiscoveryHelper(Context context, BluetoothDiscoveryListener listener) {
+    private final Context mContext;
+    private final BluetoothDiscoveryListener mListener;
+    private final BroadcastReceiver mReceiver;
+
+    public BluetoothDiscoveryHelper(
+            Context context, BluetoothDiscoveryListener listener) {
     mContext = context;
     mListener = listener;
     mReceiver = new BluetoothReceiver();
-  }
+    }
 
-  private class BluetoothReceiver extends BroadcastReceiver {
+    private class BluetoothReceiver extends BroadcastReceiver {
     @Override
-    public void onReceive(Context context, Intent intent) {
-      final String action = intent.getAction();
+        public void onReceive(Context context, Intent intent) {
+            final String action = intent.getAction();
 
-      if (BluetoothDevice.ACTION_FOUND.equals(action)) {
-        // Get the BluetoothDevice object from the Intent.
-        BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
-        Log.d("Found device " + device.getAliasName());
-        // If it's already paired, skip it, because it's been listed already.
-        if (device.getBondState() != BluetoothDevice.BOND_BONDED) {
-          mListener.addDevice(device.getName(), device.getAddress());
+            if (BluetoothDevice.ACTION_FOUND.equals(action)) {
+                // Get the BluetoothDevice object from the Intent.
+                BluetoothDevice device = intent.getParcelableExtra(
+                        BluetoothDevice.EXTRA_DEVICE);
+                Log.d("Found device " + device.getAliasName());
+                // If it's already paired, skip it, because it's been listed already.
+                if (device.getBondState() != BluetoothDevice.BOND_BONDED) {
+                    mListener.addDevice(device.getName(), device.getAddress());
+                }
+            } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
+                mListener.scanDone();
+            }
         }
-      } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
+    }
+    /**
+     * Start Bluetooth Discovery.
+     */
+
+    public void startDiscovery() {
+        BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
+
+        if (bluetoothAdapter.isDiscovering()) {
+            bluetoothAdapter.cancelDiscovery();
+        }
+
+        Set<BluetoothDevice> pairedDevices = bluetoothAdapter.getBondedDevices();
+        for (BluetoothDevice device : pairedDevices) {
+            mListener.addBondedDevice(device.getName(), device.getAddress());
+        }
+
+        IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
+        filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
+        mContext.registerReceiver(mReceiver, filter);
+
+        if (!bluetoothAdapter.isEnabled()) {
+            bluetoothAdapter.enable();
+        }
+
+        bluetoothAdapter.startDiscovery();
+    }
+
+    /**
+     * Cancel.
+     */
+    public void cancel() {
+        mContext.unregisterReceiver(mReceiver);
         mListener.scanDone();
-      }
     }
-  }
-
-  public void startDiscovery() {
-    BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
-
-    if (bluetoothAdapter.isDiscovering()) {
-      bluetoothAdapter.cancelDiscovery();
-    }
-
-    Set<BluetoothDevice> pairedDevices = bluetoothAdapter.getBondedDevices();
-    for (BluetoothDevice device : pairedDevices) {
-      mListener.addBondedDevice(device.getName(), device.getAddress());
-    }
-
-    IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
-    filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
-    mContext.registerReceiver(mReceiver, filter);
-
-    if (!bluetoothAdapter.isEnabled()) {
-      bluetoothAdapter.enable();
-    }
-
-    bluetoothAdapter.startDiscovery();
-  }
-
-  public void cancel() {
-    mContext.unregisterReceiver(mReceiver);
-    mListener.scanDone();
-  }
 }
diff --git a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothFacade.java b/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothFacade.java
index c2c2cfc..e675340 100644
--- a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothFacade.java
+++ b/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothFacade.java
@@ -64,7 +64,8 @@
 
     public BluetoothFacade(FacadeManager manager) {
         super(manager);
-        mBluetoothAdapter = MainThread.run(manager.getService(), new Callable<BluetoothAdapter>() {
+        mBluetoothAdapter = MainThread.run(manager.getService(),
+                new Callable<BluetoothAdapter>() {
             @Override
             public BluetoothAdapter call() throws Exception {
                 return BluetoothAdapter.getDefaultAdapter();
@@ -87,7 +88,8 @@
         public void onReceive(Context context, Intent intent) {
             String action = intent.getAction();
             if (action.equals(BluetoothDevice.ACTION_FOUND)) {
-                BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
+                BluetoothDevice device = intent.getParcelableExtra(
+                        BluetoothDevice.EXTRA_DEVICE);
                 Log.d("Found device " + device.getAliasName());
                 if (!DiscoveredDevices.containsKey(device.getAddress())) {
                     String name = device.getAliasName();
@@ -124,11 +126,15 @@
                 if (state == BluetoothAdapter.STATE_ON) {
                     msg.putString("State", "ON");
                     mEventFacade.postEvent("BluetoothStateChangedOn", msg);
-                    if (!mIsMultiBroadcast) mService.unregisterReceiver(mStateReceiver);
+                    if (!mIsMultiBroadcast) {
+                        mService.unregisterReceiver(mStateReceiver);
+                    }
                 } else if(state == BluetoothAdapter.STATE_OFF) {
                     msg.putString("State", "OFF");
                     mEventFacade.postEvent("BluetoothStateChangedOff", msg);
-                    if (!mIsMultiBroadcast) mService.unregisterReceiver(mStateReceiver);
+                    if (!mIsMultiBroadcast) {
+                        mService.unregisterReceiver(mStateReceiver);
+                    }
                 }
                 msg.clear();
             }
@@ -155,10 +161,18 @@
 
 
     public static boolean deviceMatch(BluetoothDevice device, String deviceID) {
-        return deviceID.equals(device.getAliasName()) || deviceID.equals(device.getAddress());
+        return deviceID.equals(device.getAliasName()) || deviceID.equals(
+                device.getAddress());
     }
 
-    public static <T> BluetoothDevice getDevice(ConcurrentHashMap<String, T> devices, String device)
+    /**
+     * Get Bluetooth device.
+     * @param devices - HashMap of Device Address and Bluetooth device name.
+     * @param device - name of the device.
+     * @return the device name if it exits.
+     */
+    public static <T> BluetoothDevice getDevice(
+            ConcurrentHashMap<String, T> devices, String device)
             throws Exception {
         if (devices.containsKey(device)) {
             return (BluetoothDevice) devices.get(device);
@@ -167,7 +181,14 @@
         }
     }
 
-    public static BluetoothDevice getDevice(Collection<BluetoothDevice> devices, String deviceID)
+    /**
+     * Get Bluetooth device.
+     * @param devices - Collection of device IDs.
+     * @param deviceID - ID of the desired device.
+     * @return the Bluetooth device if the device ID is matched.
+     */
+    public static BluetoothDevice getDevice(
+            Collection<BluetoothDevice> devices, String deviceID)
             throws Exception {
         Log.d("Looking for " + deviceID);
         for (BluetoothDevice bd : devices) {
@@ -180,7 +201,14 @@
         throw new Exception("Can't find device " + deviceID);
     }
 
-    public static boolean deviceExists(Collection<BluetoothDevice> devices, String deviceID) {
+    /**
+     * Verify device existence.
+     * @param devices - Collection of device IDs.
+     * @param deviceID - ID of the desired device.
+     * @return if the device Exists or not.
+     */
+    public static boolean deviceExists(
+            Collection<BluetoothDevice> devices, String deviceID) {
         for (BluetoothDevice bd : devices) {
             if (deviceMatch(bd, deviceID)) {
                 Log.d("Found match " + bd.getAliasName() + " " + bd.getAddress());
@@ -204,8 +232,8 @@
             @RpcDefault("300")
             Integer duration) {
         Log.d("Making discoverable for " + duration + " seconds.\n");
-        mBluetoothAdapter
-                .setScanMode(BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE, duration);
+        mBluetoothAdapter.setScanMode(
+                BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE, duration);
     }
 
     @Rpc(description = "Requests that the device be not discoverable.")
@@ -483,7 +511,8 @@
 
     @Override
     public void shutdown() {
-        for (Map.Entry<String, BluetoothConnection> entry : connections.entrySet()) {
+        for (Map.Entry<String,
+                BluetoothConnection> entry : connections.entrySet()) {
             entry.getValue().stop();
         }
         if (mMultiStateReceiver != null ) bluetoothStopListeningForAdapterStateChange();
diff --git a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothHfpClientFacade.java b/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothHfpClientFacade.java
index 930b229..a1f2328 100644
--- a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothHfpClientFacade.java
+++ b/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothHfpClientFacade.java
@@ -34,146 +34,197 @@
 import java.util.List;
 
 public class BluetoothHfpClientFacade extends RpcReceiver {
-  static final ParcelUuid[] UUIDS = {
-    BluetoothUuid.Handsfree_AG,
-  };
+    static final ParcelUuid[] UUIDS = {
+        BluetoothUuid.Handsfree_AG,
+    };
 
-  private final Service mService;
-  private final BluetoothAdapter mBluetoothAdapter;
+    private final Service mService;
+    private final BluetoothAdapter mBluetoothAdapter;
 
-  private static boolean sIsHfpClientReady = false;
-  private static BluetoothHeadsetClient sHfpClientProfile = null;
+    private static boolean sIsHfpClientReady = false;
+    private static BluetoothHeadsetClient sHfpClientProfile = null;
 
-  public BluetoothHfpClientFacade(FacadeManager manager) {
-    super(manager);
-    mService = manager.getService();
-    mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
-    mBluetoothAdapter.getProfileProxy(mService, new HfpClientServiceListener(),
-        BluetoothProfile.HEADSET_CLIENT);
-  }
-
-  class HfpClientServiceListener implements BluetoothProfile.ServiceListener {
-    @Override
-    public void onServiceConnected(int profile, BluetoothProfile proxy) {
-      sHfpClientProfile = (BluetoothHeadsetClient) proxy;
-      sIsHfpClientReady = true;
+    public BluetoothHfpClientFacade(FacadeManager manager) {
+        super(manager);
+        mService = manager.getService();
+        mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
+        mBluetoothAdapter.getProfileProxy(mService,
+                new HfpClientServiceListener(),
+                BluetoothProfile.HEADSET_CLIENT);
     }
 
-    @Override
-    public void onServiceDisconnected(int profile) {
-      sIsHfpClientReady = false;
+    class HfpClientServiceListener implements BluetoothProfile.ServiceListener {
+        @Override
+        public void onServiceConnected(int profile, BluetoothProfile proxy) {
+            sHfpClientProfile = (BluetoothHeadsetClient) proxy;
+            sIsHfpClientReady = true;
+        }
+
+        @Override
+        public void onServiceDisconnected(int profile) {
+            sIsHfpClientReady = false;
+        }
     }
-  }
 
-  public Boolean hfpClientConnect(BluetoothDevice device) {
-    if (sHfpClientProfile == null) return false;
-    return sHfpClientProfile.connect(device);
-  }
+    /**
+     * Connect to HfpClient.
+     * @param device - the BluetoothDevice object to connect Hfp client.
+     * @return if the connection was successfull or not.
+     */
+    public Boolean hfpClientConnect(BluetoothDevice device) {
+        if (sHfpClientProfile == null) return false;
+        return sHfpClientProfile.connect(device);
+    }
 
-  public Boolean hfpClientDisconnect(BluetoothDevice device) {
-    if (sHfpClientProfile == null) return false;
-    return sHfpClientProfile.disconnect(device);
-  }
+    /**
+     * Disconnect from HfpClient.
+     * @param device - the BluetoothDevice object to disconnect from Hfp client.
+     * @return if the disconnection was successfull or not.
+     */
+    public Boolean hfpClientDisconnect(BluetoothDevice device) {
+        if (sHfpClientProfile == null) return false;
+        return sHfpClientProfile.disconnect(device);
+    }
 
-  @Rpc(description = "Is HfpClient profile ready.")
-  public Boolean bluetoothHfpClientIsReady() {
-    return sIsHfpClientReady;
-  }
+    /**
+     * Is Hfp Client profile ready.
+     * @return Hfp Client profile is ready or not.
+     */
+    @Rpc(description = "Is HfpClient profile ready.")
+    public Boolean bluetoothHfpClientIsReady() {
+        return sIsHfpClientReady;
+    }
 
-  @Rpc(description = "Set priority of the profile")
-  public void bluetoothHfpClientSetPriority(
-      @RpcParameter(name = "device", description = "Mac address of a BT device.")
-      String deviceStr,
-      @RpcParameter(name = "priority", description = "Priority that needs to be set.")
-      Integer priority)
-      throws Exception {
-    if (sHfpClientProfile == null) return;
-    BluetoothDevice device =
-        BluetoothFacade.getDevice(mBluetoothAdapter.getBondedDevices(), deviceStr);
-    Log.d("Changing priority of device " + device.getAliasName() + " p: " + priority);
-    sHfpClientProfile.setPriority(device, priority);
-  }
+    /**
+     * Set priority of the profile.
+     * @param deviceStr - Mac address of a BT device.
+     * @param priority - Priority that needs to be set.
+     */
+    @Rpc(description = "Set priority of the profile")
+    public void bluetoothHfpClientSetPriority(
+            @RpcParameter(name = "device",
+                description = "Mac address of a BT device.") String deviceStr,
+            @RpcParameter(name = "priority",
+                description = "Priority that needs to be set.")
+                    Integer priority) throws Exception {
+        if (sHfpClientProfile == null) return;
+        BluetoothDevice device =
+                BluetoothFacade.getDevice(mBluetoothAdapter.getBondedDevices(),
+                    deviceStr);
+        Log.d("Changing priority of device " + device.getAliasName()
+                + " p: " + priority);
+        sHfpClientProfile.setPriority(device, priority);
+    }
 
-  @Rpc(description = "Get priority of the profile")
-  public Integer bluetoothHfpClientGetPriority(
-      @RpcParameter(name = "device", description = "Mac address of a BT device.")
-      String deviceStr)
-      throws Exception {
-    if (sHfpClientProfile == null) return BluetoothProfile.PRIORITY_UNDEFINED;
-    BluetoothDevice device =
-        BluetoothFacade.getDevice(mBluetoothAdapter.getBondedDevices(), deviceStr);
-    return sHfpClientProfile.getPriority(device);
-  }
+    /**
+     * Get priority of the profile.
+     * @param deviceStr - Mac address of a BT device.
+     * @return Priority of the device.
+     */
+    @Rpc(description = "Get priority of the profile")
+    public Integer bluetoothHfpClientGetPriority(
+            @RpcParameter(name = "device", description =
+                    "Mac address of a BT device.") String deviceStr)
+                    throws Exception {
+        if (sHfpClientProfile == null) return BluetoothProfile.PRIORITY_UNDEFINED;
+        BluetoothDevice device = BluetoothFacade.getDevice(
+                mBluetoothAdapter.getBondedDevices(), deviceStr);
+        return sHfpClientProfile.getPriority(device);
+    }
 
-  @Rpc(description = "Connect to an HFP Client device.")
-  public Boolean bluetoothHfpClientConnect(
-      @RpcParameter(name = "device", description = "Name or MAC address of a bluetooth device.")
-      String deviceStr)
-      throws Exception {
-    if (sHfpClientProfile == null) return false;
-    try {
-      BluetoothDevice device =
-          BluetoothFacade.getDevice(BluetoothFacade.DiscoveredDevices, deviceStr);
-      Log.d("Connecting to device " + device.getAliasName());
-      return hfpClientConnect(device);
-    } catch (Exception e) {
-        Log.e("bluetoothHfpClientConnect failed on getDevice " + deviceStr + " with " + e);
+    /**
+     * Connect to an HFP Client device.
+     * @param deviceStr - Name or MAC address of a bluetooth device.
+     * @return Hfp Client was connected or not.
+     */
+    @Rpc(description = "Connect to an HFP Client device.")
+    public Boolean bluetoothHfpClientConnect(
+            @RpcParameter(name = "device",
+                description = "Name or MAC address of a bluetooth device.")
+                    String deviceStr)
+                        throws Exception {
+        if (sHfpClientProfile == null) return false;
+        try {
+            BluetoothDevice device = BluetoothFacade.getDevice(
+                    BluetoothFacade.DiscoveredDevices, deviceStr);
+            Log.d("Connecting to device " + device.getAliasName());
+            return hfpClientConnect(device);
+        } catch (Exception e) {
+            Log.e("bluetoothHfpClientConnect failed on getDevice "
+                    + deviceStr + " with " + e);
+            return false;
+        }
+    }
+
+    /**
+     * Disconnect an HFP Client device.
+     * @param deviceStr - Name or MAC address of a bluetooth device.
+     * @return Hfp Client was disconnected or not.
+     */
+    @Rpc(description = "Disconnect an HFP Client device.")
+    public Boolean bluetoothHfpClientDisconnect(
+            @RpcParameter(name = "device",
+                description = "Name or MAC address of a device.")
+                    String deviceStr) {
+        if (sHfpClientProfile == null) return false;
+        Log.d("Connected devices: " + sHfpClientProfile.getConnectedDevices());
+        try {
+            BluetoothDevice device = BluetoothFacade.getDevice(
+                    sHfpClientProfile.getConnectedDevices(), deviceStr);
+            return hfpClientDisconnect(device);
+        } catch (Exception e) {
+            // Do nothing since it is disconnect and this
+            // function should force disconnect.
+            Log.e("bluetoothHfpClientConnect getDevice failed " + e);
+        }
         return false;
     }
-  }
 
-  @Rpc(description = "Disconnect an HFP Client device.")
-  public Boolean bluetoothHfpClientDisconnect(
-      @RpcParameter(name = "device", description = "Name or MAC address of a device.")
-      String deviceStr) {
-    if (sHfpClientProfile == null) return false;
-    Log.d("Connected devices: " + sHfpClientProfile.getConnectedDevices());
-    try {
-        BluetoothDevice device =
-            BluetoothFacade.getDevice(sHfpClientProfile.getConnectedDevices(), deviceStr);
-        return hfpClientDisconnect(device);
-    } catch (Exception e) {
-        // Do nothing since it is disconnect and this function should force disconnect.
-        Log.e("bluetoothHfpClientConnect getDevice failed " + e);
+    /**
+     * Get all the devices connected through HFP Client.
+     * @return List of all the devices connected through HFP Client.
+     */
+    @Rpc(description = "Get all the devices connected through HFP Client.")
+    public List<BluetoothDevice> bluetoothHfpClientGetConnectedDevices() {
+        if (sHfpClientProfile == null) return new ArrayList<BluetoothDevice>();
+        return sHfpClientProfile.getConnectedDevices();
     }
-    return false;
-  }
 
-  @Rpc(description = "Get all the devices connected through HFP Client.")
-  public List<BluetoothDevice> bluetoothHfpClientGetConnectedDevices() {
-    if (sHfpClientProfile == null) return new ArrayList<BluetoothDevice>();
-    return sHfpClientProfile.getConnectedDevices();
-  }
-
-  @Rpc(description = "Get the connection status of a device.")
-  public Integer bluetoothHfpClientGetConnectionStatus(
-          @RpcParameter(name = "deviceID",
-                        description = "Name or MAC address of a bluetooth device.")
-          String deviceID) {
-      if (sHfpClientProfile == null) {
-          return BluetoothProfile.STATE_DISCONNECTED;
-      }
-      List<BluetoothDevice> deviceList = sHfpClientProfile.getConnectedDevices();
-      BluetoothDevice device;
-      try {
-          device = BluetoothFacade.getDevice(deviceList, deviceID);
-      } catch (Exception e) {
-          Log.e(e);
-          return BluetoothProfile.STATE_DISCONNECTED;
-      }
-      return sHfpClientProfile.getConnectionState(device);
-  }
+    /**
+     * Get the connection status of a device.
+     * @param deviceID - Name or MAC address of a bluetooth device.
+     * @return connection status of the device.
+     */
+    @Rpc(description = "Get the connection status of a device.")
+    public Integer bluetoothHfpClientGetConnectionStatus(
+            @RpcParameter(name = "deviceID",
+                description = "Name or MAC address of a bluetooth device.")
+                    String deviceID) {
+        if (sHfpClientProfile == null) {
+            return BluetoothProfile.STATE_DISCONNECTED;
+        }
+        List<BluetoothDevice> deviceList =
+                sHfpClientProfile.getConnectedDevices();
+        BluetoothDevice device;
+        try {
+            device = BluetoothFacade.getDevice(deviceList, deviceID);
+        } catch (Exception e) {
+            Log.e(e);
+            return BluetoothProfile.STATE_DISCONNECTED;
+        }
+        return sHfpClientProfile.getConnectionState(device);
+    }
 
     /**
      * Get the audio routing state of specified device.
-     *
      * @param deviceStr the Bluetooth MAC address of remote device
-     * @return Audio State
+     * @return Audio State of the device.
      */
     @Rpc(description = "Get all the devices connected through HFP Client.")
     public Integer bluetoothHfpClientGetAudioState(
-            @RpcParameter(name = "device", description = "MAC address of a bluetooth device.")
-            String deviceStr) {
+            @RpcParameter(name = "device",
+                description = "MAC address of a bluetooth device.")
+                String deviceStr) {
         if (sHfpClientProfile == null) return -1;
         BluetoothDevice device;
         try {
@@ -194,12 +245,14 @@
      */
     @Rpc(description = "Start Remote device Voice Recognition through HFP Client.")
     public boolean bluetoothHfpClientStartVoiceRecognition(
-            @RpcParameter(name = "device", description = "MAC address of a bluetooth device.")
-            String deviceStr) {
+            @RpcParameter(name = "device",
+                description = "MAC address of a bluetooth device.")
+                    String deviceStr) {
         if (sHfpClientProfile == null) return false;
         BluetoothDevice device;
         try {
-            device = BluetoothFacade.getDevice(sHfpClientProfile.getConnectedDevices(), deviceStr);
+            device = BluetoothFacade.getDevice(
+                    sHfpClientProfile.getConnectedDevices(), deviceStr);
         } catch (Exception e) {
             // Do nothing since it is disconnect and this function should force disconnect.
             Log.e("bluetoothHfpClientConnect getDevice failed " + e);
@@ -216,21 +269,24 @@
      */
     @Rpc(description = "Stop Remote device Voice Recognition through HFP Client.")
     public boolean bluetoothHfpClientStopVoiceRecognition(
-            @RpcParameter(name = "device", description = "MAC address of a bluetooth device.")
-            String deviceStr) {
+            @RpcParameter(name = "device",
+                description = "MAC address of a bluetooth device.")
+                    String deviceStr) {
         if (sHfpClientProfile == null) return false;
         BluetoothDevice device;
         try {
-            device = BluetoothFacade.getDevice(sHfpClientProfile.getConnectedDevices(), deviceStr);
+            device = BluetoothFacade.getDevice(
+                    sHfpClientProfile.getConnectedDevices(), deviceStr);
         } catch (Exception e) {
-            // Do nothing since it is disconnect and this function should force disconnect.
+            // Do nothing since it is disconnect
+            // and this function should force disconnect.
             Log.e("bluetoothHfpClientConnect getDevice failed " + e);
             return false;
         }
         return sHfpClientProfile.stopVoiceRecognition(device);
     }
 
-  @Override
-  public void shutdown() {
-  }
+    @Override
+    public void shutdown() {
+    }
 }
diff --git a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothHidFacade.java b/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothHidFacade.java
index 52245ef..140c1de 100644
--- a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothHidFacade.java
+++ b/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothHidFacade.java
@@ -16,19 +16,17 @@
 
 package com.googlecode.android_scripting.facade.bluetooth;
 
-import java.util.List;
-
 import android.app.Service;
-import android.bluetooth.BluetoothHidHost;
 import android.bluetooth.BluetoothAdapter;
 import android.bluetooth.BluetoothDevice;
+import android.bluetooth.BluetoothHidHost;
 import android.bluetooth.BluetoothProfile;
 import android.bluetooth.BluetoothUuid;
-import android.os.ParcelUuid;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.os.ParcelUuid;
 
 import com.googlecode.android_scripting.Log;
 import com.googlecode.android_scripting.facade.EventFacade;
@@ -38,177 +36,228 @@
 import com.googlecode.android_scripting.rpc.RpcDefault;
 import com.googlecode.android_scripting.rpc.RpcParameter;
 
+import java.util.List;
+
+/*
+ * Class Bluetooth HidFacade
+ */
 public class BluetoothHidFacade extends RpcReceiver {
-  public final static ParcelUuid[] UUIDS = { BluetoothUuid.Hid };
+    public static final ParcelUuid[] UUIDS = { BluetoothUuid.Hid };
 
-  private final Service mService;
-  private final BluetoothAdapter mBluetoothAdapter;
+    private final Service mService;
+    private final BluetoothAdapter mBluetoothAdapter;
 
-  private static boolean sIsHidReady = false;
-  private static BluetoothHidHost sHidProfile = null;
+    private static boolean sIsHidReady = false;
+    private static BluetoothHidHost sHidProfile = null;
 
-  private final EventFacade mEventFacade;
+    private final EventFacade mEventFacade;
 
-  public BluetoothHidFacade(FacadeManager manager) {
-    super(manager);
-    mService = manager.getService();
-    mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
-    mBluetoothAdapter.getProfileProxy(mService, new HidServiceListener(),
+    public BluetoothHidFacade(FacadeManager manager) {
+        super(manager);
+        mService = manager.getService();
+        mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
+        mBluetoothAdapter.getProfileProxy(mService, new HidServiceListener(),
         BluetoothProfile.HID_HOST);
-    IntentFilter pkgFilter = new IntentFilter();
-    pkgFilter.addAction(BluetoothHidHost.ACTION_CONNECTION_STATE_CHANGED);
-    pkgFilter.addAction(BluetoothHidHost.ACTION_PROTOCOL_MODE_CHANGED);
-    pkgFilter.addAction(BluetoothHidHost.ACTION_HANDSHAKE);
-    pkgFilter.addAction(BluetoothHidHost.ACTION_REPORT);
-    pkgFilter.addAction(BluetoothHidHost.ACTION_VIRTUAL_UNPLUG_STATUS);
-    pkgFilter.addAction(BluetoothHidHost.ACTION_IDLE_TIME_CHANGED);
-    mService.registerReceiver(mHidServiceBroadcastReceiver, pkgFilter);
-    Log.d(HidServiceBroadcastReceiver.TAG + " registered");
-    mEventFacade = manager.getReceiver(EventFacade.class);
-  }
-
-  class HidServiceListener implements BluetoothProfile.ServiceListener {
-    @Override
-    public void onServiceConnected(int profile, BluetoothProfile proxy) {
-      sHidProfile = (BluetoothHidHost) proxy;
-      sIsHidReady = true;
+        IntentFilter pkgFilter = new IntentFilter();
+        pkgFilter.addAction(BluetoothHidHost.ACTION_CONNECTION_STATE_CHANGED);
+        pkgFilter.addAction(BluetoothHidHost.ACTION_PROTOCOL_MODE_CHANGED);
+        pkgFilter.addAction(BluetoothHidHost.ACTION_HANDSHAKE);
+        pkgFilter.addAction(BluetoothHidHost.ACTION_REPORT);
+        pkgFilter.addAction(BluetoothHidHost.ACTION_VIRTUAL_UNPLUG_STATUS);
+        pkgFilter.addAction(BluetoothHidHost.ACTION_IDLE_TIME_CHANGED);
+        mService.registerReceiver(mHidServiceBroadcastReceiver, pkgFilter);
+        Log.d(HidServiceBroadcastReceiver.TAG + " registered");
+        mEventFacade = manager.getReceiver(EventFacade.class);
     }
 
-    @Override
-    public void onServiceDisconnected(int profile) {
-      sIsHidReady = false;
+    class HidServiceListener implements BluetoothProfile.ServiceListener {
+        @Override
+        public void onServiceConnected(int profile, BluetoothProfile proxy) {
+            sHidProfile = (BluetoothHidHost) proxy;
+            sIsHidReady = true;
+        }
+
+        @Override
+        public void onServiceDisconnected(int profile) {
+            sIsHidReady = false;
+        }
     }
-  }
 
-  class HidServiceBroadcastReceiver extends BroadcastReceiver {
-      private static final String TAG = "HidServiceBroadcastReceiver";
+    class HidServiceBroadcastReceiver extends BroadcastReceiver {
+        private static final String TAG = "HidServiceBroadcastReceiver";
 
-      @Override
-      public void onReceive(Context context, Intent intent) {
-          String action = intent.getAction();
-          Log.d(TAG + " action=" + action);
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            String action = intent.getAction();
+            Log.d(TAG + " action=" + action);
 
-          switch (action) {
-              case BluetoothHidHost.ACTION_CONNECTION_STATE_CHANGED: {
-                  int previousState = intent.getIntExtra(BluetoothProfile.EXTRA_PREVIOUS_STATE, -1);
-                  int state = intent.getIntExtra(BluetoothProfile.EXTRA_STATE, -1);
-                  Log.d("Connection state changed: " + previousState + " -> " + state);
-              }
-              break;
-              case BluetoothHidHost.ACTION_PROTOCOL_MODE_CHANGED: {
-                  int status = intent.getIntExtra(BluetoothHidHost.EXTRA_STATUS, -1);
-                  Log.d("Protocol mode changed: " + status);
-              }
-              break;
-              case BluetoothHidHost.ACTION_HANDSHAKE: {
-                  int status = intent.getIntExtra(BluetoothHidHost.EXTRA_STATUS, -1);
-                  Log.d("Handshake received: " + status);
-              }
-              break;
-              case BluetoothHidHost.ACTION_REPORT: {
-                  char[] report = intent.getCharArrayExtra(BluetoothHidHost.EXTRA_REPORT);
-                  Log.d("Received report: " + String.valueOf(report));
-              }
-              break;
-              case BluetoothHidHost.ACTION_VIRTUAL_UNPLUG_STATUS: {
-                  int status = intent.getIntExtra(
-                          BluetoothHidHost.EXTRA_VIRTUAL_UNPLUG_STATUS, -1);
-                  Log.d("Virtual unplug status: " + status);
-              }
-              break;
-              case BluetoothHidHost.ACTION_IDLE_TIME_CHANGED: {
-                  int idleTime = intent.getIntExtra(BluetoothHidHost.EXTRA_IDLE_TIME, -1);
-                  Log.d("Idle time changed: " + idleTime);
-              }
-              break;
-              default:
-                  break;
-          }
-      }
-  }
+            switch (action) {
+                case BluetoothHidHost.ACTION_CONNECTION_STATE_CHANGED: {
+                    int previousState = intent.getIntExtra(
+                            BluetoothProfile.EXTRA_PREVIOUS_STATE, -1);
+                    int state = intent.getIntExtra(
+                            BluetoothProfile.EXTRA_STATE, -1);
+                    Log.d("Connection state changed: "
+                            + previousState + " -> " + state);
+                }
+                break;
+                case BluetoothHidHost.ACTION_PROTOCOL_MODE_CHANGED: {
+                    int status = intent.getIntExtra(
+                            BluetoothHidHost.EXTRA_STATUS, -1);
+                    Log.d("Protocol mode changed: " + status);
+                }
+                break;
+                case BluetoothHidHost.ACTION_HANDSHAKE: {
+                    int status = intent.getIntExtra(
+                            BluetoothHidHost.EXTRA_STATUS, -1);
+                    Log.d("Handshake received: " + status);
+                }
+                break;
+                case BluetoothHidHost.ACTION_REPORT: {
+                    char[] report = intent.getCharArrayExtra(
+                            BluetoothHidHost.EXTRA_REPORT);
+                    Log.d("Received report: " + String.valueOf(report));
+                }
+                break;
+                case BluetoothHidHost.ACTION_VIRTUAL_UNPLUG_STATUS: {
+                    int status = intent.getIntExtra(
+                            BluetoothHidHost.EXTRA_VIRTUAL_UNPLUG_STATUS, -1);
+                    Log.d("Virtual unplug status: " + status);
+                }
+                break;
+                case BluetoothHidHost.ACTION_IDLE_TIME_CHANGED: {
+                    int idleTime = intent.getIntExtra(
+                            BluetoothHidHost.EXTRA_IDLE_TIME, -1);
+                    Log.d("Idle time changed: " + idleTime);
+                }
+                break;
+                default:
+                    break;
+            }
+        }
+    }
 
-  private final BroadcastReceiver mHidServiceBroadcastReceiver = new HidServiceBroadcastReceiver();
+    private final BroadcastReceiver mHidServiceBroadcastReceiver =
+            new HidServiceBroadcastReceiver();
 
+    /**
+     * Connect to Hid Profile.
+     * @param device - the Bluetooth Device object to connect to.
+     * @return if the connection was successfull or not.
+     */
+    public Boolean hidConnect(BluetoothDevice device) {
+        if (sHidProfile == null) return false;
+        return sHidProfile.connect(device);
+    }
 
-  public Boolean hidConnect(BluetoothDevice device) {
-    if (sHidProfile == null) return false;
-    return sHidProfile.connect(device);
-  }
+    /**
+     * Disconnect to Hid Profile.
+     * @param device - the Bluetooth Device object to disconnect to.
+     * @return if the disconnection was successfull or not.
+     */
+    public Boolean hidDisconnect(BluetoothDevice device) {
+        if (sHidProfile == null) return false;
+        return sHidProfile.disconnect(device);
+    }
 
-  public Boolean hidDisconnect(BluetoothDevice device) {
-    if (sHidProfile == null) return false;
-    return sHidProfile.disconnect(device);
-  }
+    /**
+     * Is Hid profile ready.
+     * @return if Hid profile is ready or not.
+     */
+    @Rpc(description = "Is Hid profile ready.")
+    public Boolean bluetoothHidIsReady() {
+        return sIsHidReady;
+    }
 
-  @Rpc(description = "Is Hid profile ready.")
-  public Boolean bluetoothHidIsReady() {
-    return sIsHidReady;
-  }
+    /**
+     * Connect to an HID device.
+     * @param device - Name or MAC address of a bluetooth device.
+     * @return if the connection was successfull or not.
+     */
+    @Rpc(description = "Connect to an HID device.")
+    public Boolean bluetoothHidConnect(
+            @RpcParameter(name = "device",
+                description = "Name or MAC address of a bluetooth device.")
+                    String device)
+                        throws Exception {
+        if (sHidProfile == null) return false;
+        BluetoothDevice mDevice = BluetoothFacade.getDevice(
+                BluetoothFacade.DiscoveredDevices, device);
+        Log.d("Connecting to device " + mDevice.getAliasName());
+        return hidConnect(mDevice);
+    }
 
-  @Rpc(description = "Connect to an HID device.")
-  public Boolean bluetoothHidConnect(
-      @RpcParameter(name = "device", description = "Name or MAC address of a bluetooth device.")
-      String device)
-      throws Exception {
-    if (sHidProfile == null)
-      return false;
-    BluetoothDevice mDevice = BluetoothFacade.getDevice(BluetoothFacade.DiscoveredDevices, device);
-    Log.d("Connecting to device " + mDevice.getAliasName());
-    return hidConnect(mDevice);
-  }
+    /**
+     * Disconnect an HID device.
+     * @param device - the Bluetooth Device object to disconnect to.
+     * @return if the disconnection was successfull or not.
+     */
+    @Rpc(description = "Disconnect an HID device.")
+    public Boolean bluetoothHidDisconnect(
+            @RpcParameter(name = "device",
+                description = "Name or MAC address of a device.")
+                    String device)
+                        throws Exception {
+        if (sHidProfile == null) return false;
+        Log.d("Connected devices: " + sHidProfile.getConnectedDevices());
+        BluetoothDevice mDevice = BluetoothFacade.getDevice(
+                sHidProfile.getConnectedDevices(), device);
+        return hidDisconnect(mDevice);
+    }
 
-  @Rpc(description = "Disconnect an HID device.")
-  public Boolean bluetoothHidDisconnect(
-      @RpcParameter(name = "device", description = "Name or MAC address of a device.")
-      String device)
-      throws Exception {
-    if (sHidProfile == null)
-      return false;
-    Log.d("Connected devices: " + sHidProfile.getConnectedDevices());
-    BluetoothDevice mDevice = BluetoothFacade.getDevice(sHidProfile.getConnectedDevices(),
-                                                        device);
-    return hidDisconnect(mDevice);
-  }
+    /**
+     * Get all the devices connected through HID.
+     * @return List of all the devices connected through HID.
+     */
+    @Rpc(description = "Get all the devices connected through HID.")
+    public List<BluetoothDevice> bluetoothHidGetConnectedDevices() {
+        if (!sIsHidReady) return null;
+        return sHidProfile.getConnectedDevices();
+    }
 
-  @Rpc(description = "Get all the devices connected through HID.")
-  public List<BluetoothDevice> bluetoothHidGetConnectedDevices() {
-    while (!sIsHidReady);
-    return sHidProfile.getConnectedDevices();
-  }
+    /**
+     * Get the connection status of a device.
+     * @param deviceID - Name or MAC address of a bluetooth device.
+     * @return connection status of a device.
+     */
+    @Rpc(description = "Get the connection status of a device.")
+    public Integer bluetoothHidGetConnectionStatus(
+            @RpcParameter(name = "deviceID",
+                description = "Name or MAC address of a bluetooth device.")
+                    String deviceID) {
+        if (sHidProfile == null) {
+            return BluetoothProfile.STATE_DISCONNECTED;
+        }
+        List<BluetoothDevice> deviceList = sHidProfile.getConnectedDevices();
+        BluetoothDevice device;
+        try {
+            device = BluetoothFacade.getDevice(deviceList, deviceID);
+        } catch (Exception e) {
+            return BluetoothProfile.STATE_DISCONNECTED;
+        }
+        return sHidProfile.getConnectionState(device);
+    }
 
-  @Rpc(description = "Get the connection status of a device.")
-  public Integer bluetoothHidGetConnectionStatus(
-          @RpcParameter(name = "deviceID",
-                        description = "Name or MAC address of a bluetooth device.")
-          String deviceID) {
-      if (sHidProfile == null) {
-          return BluetoothProfile.STATE_DISCONNECTED;
-      }
-      List<BluetoothDevice> deviceList = sHidProfile.getConnectedDevices();
-      BluetoothDevice device;
-      try {
-          device = BluetoothFacade.getDevice(deviceList, deviceID);
-      } catch (Exception e) {
-          return BluetoothProfile.STATE_DISCONNECTED;
-      }
-      return sHidProfile.getConnectionState(device);
-  }
-
-  @Rpc(description = "Send Set_Report command to the connected HID input device.")
-  public Boolean bluetoothHidSetReport(
-          @RpcParameter(name = "deviceID",
-          description = "Name or MAC address of a bluetooth device.")
-          String deviceID,
-          @RpcParameter(name = "type")
-          @RpcDefault(value = "1")
-          Integer type,
-          @RpcParameter(name = "report")
-          String report) throws Exception {
-      BluetoothDevice device = BluetoothFacade.getDevice(sHidProfile.getConnectedDevices(),
-              deviceID);
-      Log.d("type=" + type);
-      return sHidProfile.setReport(device, (byte) (int) type, report);
-  }
+    /**
+     * Send Set_Report command to the connected HID input device.
+     * @param deviceID - Name or MAC address of a bluetooth device.
+     * @return True if successfully sent the command; otherwise false
+     */
+    @Rpc(description =
+            "Send Set_Report command to the connected HID input device.")
+    public Boolean bluetoothHidSetReport(
+            @RpcParameter(name = "deviceID",
+                description = "Name or MAC address of a bluetooth device.")
+                    String deviceID,
+            @RpcParameter(name = "type")
+            @RpcDefault(value = "1") Integer type,
+            @RpcParameter(name = "report")
+                String report) throws Exception {
+        BluetoothDevice device = BluetoothFacade.getDevice(
+                sHidProfile.getConnectedDevices(), deviceID);
+        Log.d("type=" + type);
+        return sHidProfile.setReport(device, (byte) (int) type, report);
+    }
 
     /**
      * Sends the Get_Report command to the given connected HID input device.
@@ -219,173 +268,177 @@
      * @return True if successfully sent the command; otherwise false
      * @throws Exception error from Bluetooth HidService
      */
-  @Rpc(description = "Send Get_Report command to the connected HID input device.")
-  public Boolean bluetoothHidGetReport(
-          @RpcParameter(name = "deviceID",
-          description = "Name or MAC address of a bluetooth device.")
-          String deviceID,
-          @RpcParameter(name = "type")
-          @RpcDefault(value = "1")
-          Integer type,
-          @RpcParameter(name = "reportId")
-          Integer reportId,
-          @RpcParameter(name = "buffSize")
-          Integer buffSize) throws Exception {
-      BluetoothDevice device = BluetoothFacade.getDevice(sHidProfile.getConnectedDevices(),
-              deviceID);
-      Log.d("type=" + type + " reportId=" + reportId);
-      return sHidProfile.getReport(device, (byte) (int) type, (byte) (int) reportId, buffSize);
-  }
-  /**
-   * Sends a data report to the given connected HID input device.
-   * @param deviceID name or MAC address or the HID input device
-   * @param report the report payload
-   * @return True if successfully sent the command; otherwise false
-   * @throws Exception error from Bluetooth HidService
-   */
-  @Rpc(description = "Send data to a connected HID device.")
-  public Boolean bluetoothHidSendData(
-          @RpcParameter(name = "deviceID",
-          description = "Name or MAC address of a bluetooth device.")
-          String deviceID,
-          @RpcParameter(name = "report")
-          String report) throws Exception {
-      BluetoothDevice device = BluetoothFacade.getDevice(sHidProfile.getConnectedDevices(),
-              deviceID);
-      return sHidProfile.sendData(device, report);
-  }
+    @Rpc(description = "Send Get_Report command to the connected HID input device.")
+    public Boolean bluetoothHidGetReport(
+            @RpcParameter(name = "deviceID",
+                description = "Name or MAC address of a bluetooth device.")
+                    String deviceID,
+            @RpcParameter(name = "type")
+            @RpcDefault(value = "1") Integer type,
+            @RpcParameter(name = "reportId")
+            Integer reportId,
+            @RpcParameter(name = "buffSize")
+            Integer buffSize) throws Exception {
+        BluetoothDevice device = BluetoothFacade.getDevice(
+                sHidProfile.getConnectedDevices(), deviceID);
+        Log.d("type=" + type + " reportId=" + reportId);
+        return sHidProfile.getReport(
+                device, (byte) (int) type, (byte) (int) reportId, buffSize);
+    }
+
+    /**
+     * Sends a data report to the given connected HID input device.
+     * @param deviceID name or MAC address or the HID input device
+     * @param report the report payload
+     * @return True if successfully sent the command; otherwise false
+     * @throws Exception error from Bluetooth HidService
+     */
+    @Rpc(description = "Send data to a connected HID device.")
+    public Boolean bluetoothHidSendData(
+            @RpcParameter(name = "deviceID",
+                description = "Name or MAC address of a bluetooth device.")
+                String deviceID,
+            @RpcParameter(name = "report")
+                String report) throws Exception {
+        BluetoothDevice device = BluetoothFacade.getDevice(
+                sHidProfile.getConnectedDevices(), deviceID);
+        return sHidProfile.sendData(device, report);
+    }
 
 
-  /**
-   * Sends the virtual cable unplug command to the given connected HID input device.
-   * @param deviceID name or MAC address or the HID input device
-   * @return True if successfully sent the command; otherwise false
-   * @throws Exception error from Bluetooth HidService
-   */
-  @Rpc(description = "Send virtual unplug to a connected HID device.")
-  public Boolean bluetoothHidVirtualUnplug(
-          @RpcParameter(name = "deviceID",
+    /**
+     * Sends the virtual cable unplug command to the given connected HID input device.
+     * @param deviceID name or MAC address or the HID input device
+     * @return True if successfully sent the command; otherwise false
+     * @throws Exception error from Bluetooth HidService
+     */
+    @Rpc(description = "Send virtual unplug to a connected HID device.")
+        public Boolean bluetoothHidVirtualUnplug(
+                @RpcParameter(name = "deviceID",
           description = "Name or MAC address of a bluetooth device.")
           String deviceID) throws Exception {
-      BluetoothDevice device = BluetoothFacade.getDevice(sHidProfile.getConnectedDevices(),
+        BluetoothDevice device = BluetoothFacade.getDevice(sHidProfile.getConnectedDevices(),
               deviceID);
-      return sHidProfile.virtualUnplug(device);
-  }
+        return sHidProfile.virtualUnplug(device);
+    }
 
-  /**
-   * Sends the Set_Priority command to the given connected HID input device.
-   * @param deviceID name or MAC address or the HID input device
-   * @param priority priority level
-   * @return True if successfully sent the command; otherwise false
-   * @throws Exception error from Bluetooth HidService
-   */
-  @Rpc(description = "Set priority of the profile")
-
-  public Boolean bluetoothHidSetPriority(
+    /**
+     * Sends the Set_Priority command to the given connected HID input device.
+     * @param deviceID name or MAC address or the HID input device
+     * @param priority priority level
+     * @return True if successfully sent the command; otherwise false
+     * @throws Exception error from Bluetooth HidService
+     */
+    @Rpc(description = "Set priority of the profile")
+    public Boolean bluetoothHidSetPriority(
           @RpcParameter(name = "deviceID",
                   description = "Name or MAC address of a bluetooth device.")
                   String deviceID,
           @RpcParameter(name = "priority")
                   Integer priority) throws Exception {
-      BluetoothDevice device = BluetoothFacade.getDevice(sHidProfile.getConnectedDevices(),
+        BluetoothDevice device = BluetoothFacade.getDevice(sHidProfile.getConnectedDevices(),
               deviceID);
-      return sHidProfile.setPriority(device, priority);
-  }
+        return sHidProfile.setPriority(device, priority);
+    }
 
-  /**
-   * Sends the Get_Priority command to the given connected HID input device.
-   * @param deviceID name or MAC address or the HID input device
-   * @return The value of the HID input device priority
-   * @throws Exception error from Bluetooth HidService
-   */
-  @Rpc(description = "Get priority of the profile")
-  public Integer bluetoothHidGetPriority(
+    /**
+     * Sends the Get_Priority command to the given connected HID input device.
+     * @param deviceID name or MAC address or the HID input device
+     * @return The value of the HID input device priority
+     * @throws Exception error from Bluetooth HidService
+     */
+    @Rpc(description = "Get priority of the profile")
+    public Integer bluetoothHidGetPriority(
           @RpcParameter(name = "deviceID",
                   description = "Name or MAC address of a bluetooth device.")
                   String deviceID) throws Exception {
-      BluetoothDevice device = BluetoothFacade.getDevice(sHidProfile.getConnectedDevices(),
+        BluetoothDevice device = BluetoothFacade.getDevice(sHidProfile.getConnectedDevices(),
               deviceID);
-      return sHidProfile.getPriority(device);
-  }
+        return sHidProfile.getPriority(device);
+    }
 
-  /**
-   * Sends the Set_Protocol_Mode command to the given connected HID input device.
-   * @param deviceID name or MAC address or the HID input device
-   * @param protocolMode protocol mode
-   * @return True if successfully sent the command; otherwise false
-   * @throws Exception error from Bluetooth HidService
-   */
-  @Rpc(description = "Send Set_Protocol_Mode command to the connected HID input device.")
-  public Boolean bluetoothHidSetProtocolMode(
+    /**
+     * Sends the Set_Protocol_Mode command to the given connected HID input device.
+     * @param deviceID name or MAC address or the HID input device
+     * @param protocolMode protocol mode
+     * @return True if successfully sent the command; otherwise false
+     * @throws Exception error from Bluetooth HidService
+     */
+    @Rpc(description = "Send Set_Protocol_Mode command to the connected HID input device.")
+    public Boolean bluetoothHidSetProtocolMode(
           @RpcParameter(name = "deviceID",
                   description = "Name or MAC address of a bluetooth device.")
                   String deviceID,
           @RpcParameter(name = "protocolMode")
                   Integer protocolMode) throws Exception {
-      BluetoothDevice device = BluetoothFacade.getDevice(sHidProfile.getConnectedDevices(),
+        BluetoothDevice device = BluetoothFacade.getDevice(sHidProfile.getConnectedDevices(),
               deviceID);
-      return sHidProfile.setProtocolMode(device, protocolMode);
-  }
+        return sHidProfile.setProtocolMode(device, protocolMode);
+    }
 
-  /**
-   * Sends the Get_Protocol_Mode command to the given connected HID input device.
-   * @param deviceID name or MAC address or the HID input device
-   * @return True if successfully sent the command; otherwise false
-   * @throws Exception error from Bluetooth HidService
-   */
-  @Rpc(description = "Send Get_Protocol_Mode command to the connected HID input device.")
-  public Boolean bluetoothHidGetProtocolMode(
+    /**
+     * Sends the Get_Protocol_Mode command to the given connected HID input device.
+     * @param deviceID name or MAC address or the HID input device
+     * @return True if successfully sent the command; otherwise false
+     * @throws Exception error from Bluetooth HidService
+     */
+    @Rpc(description =
+            "Send Get_Protocol_Mode command to the connected HID input device.")
+    public Boolean bluetoothHidGetProtocolMode(
           @RpcParameter(name = "deviceID",
                   description = "Name or MAC address of a bluetooth device.")
                   String deviceID) throws Exception {
-      BluetoothDevice device = BluetoothFacade.getDevice(sHidProfile.getConnectedDevices(),
-              deviceID);
-      return sHidProfile.getProtocolMode(device);
-  }
+        BluetoothDevice device = BluetoothFacade.getDevice(
+                sHidProfile.getConnectedDevices(), deviceID);
+        return sHidProfile.getProtocolMode(device);
+    }
 
-  /**
-   * Sends the Set_Idle_Time command to the given connected HID input device.
-   * @param deviceID name or MAC address or the HID input device
-   * @param idleTime idle time
-   * @return True if successfully sent the command; otherwise false
-   * @throws Exception error from Bluetooth HidService
-   */
-  @Rpc(description = "Send Set_Idle_Time command to the connected HID input device.")
-  public Boolean bluetoothHidSetIdleTime(
-          @RpcParameter(name = "deviceID",
-                  description = "Name or MAC address of a bluetooth device.")
-                  String deviceID,
-          @RpcParameter(name = "idleTime")
-                  Integer idleTime) throws Exception {
-      BluetoothDevice device = BluetoothFacade.getDevice(sHidProfile.getConnectedDevices(),
-              deviceID);
-      return sHidProfile.setIdleTime(device, (byte) (int) idleTime);
-  }
+    /**
+     * Sends the Set_Idle_Time command to the given connected HID input device.
+     * @param deviceID name or MAC address or the HID input device
+     * @param idleTime idle time
+     * @return True if successfully sent the command; otherwise false
+     * @throws Exception error from Bluetooth HidService
+     */
+    @Rpc(description = "Send Set_Idle_Time command to the connected HID input device.")
+    public Boolean bluetoothHidSetIdleTime(
+            @RpcParameter(name = "deviceID",
+                description = "Name or MAC address of a bluetooth device.")
+                    String deviceID,
+            @RpcParameter(name = "idleTime")
+                Integer idleTime) throws Exception {
+        BluetoothDevice device = BluetoothFacade.getDevice(
+                sHidProfile.getConnectedDevices(), deviceID);
+        return sHidProfile.setIdleTime(
+                device, (byte) (int) idleTime);
+    }
 
-  /**
-   * Sends the Get_Idle_Time command to the given connected HID input device.
-   * @param deviceID name or MAC address or the HID input device
-   * @return True if successfully sent the command; otherwise false
-   * @throws Exception error from Bluetooth HidService
-   */
-  @Rpc(description = "Send Get_Idle_Time command to the connected HID input device.")
-  public Boolean bluetoothHidGetIdleTime(
-          @RpcParameter(name = "deviceID",
+    /**
+     * Sends the Get_Idle_Time command to the given connected HID input device.
+     * @param deviceID name or MAC address or the HID input device
+     * @return True if successfully sent the command; otherwise false
+     * @throws Exception error from Bluetooth HidService
+     */
+    @Rpc(description = "Send Get_Idle_Time command to the connected HID input device.")
+    public Boolean bluetoothHidGetIdleTime(
+            @RpcParameter(name = "deviceID",
                   description = "Name or MAC address of a bluetooth device.")
                   String deviceID) throws Exception {
-      BluetoothDevice device = BluetoothFacade.getDevice(sHidProfile.getConnectedDevices(),
-              deviceID);
-      return sHidProfile.getIdleTime(device);
-  }
+        BluetoothDevice device = BluetoothFacade.getDevice(
+                sHidProfile.getConnectedDevices(), deviceID);
+        return sHidProfile.getIdleTime(device);
+    }
 
-  @Rpc(description = "Test byte transfer.")
-  public byte[] testByte() {
-      byte[] bts = {0b01,0b10,0b11,0b100};
-      return bts;
-  }
+    /**
+     * Test byte transfer.
+     */
+    @Rpc(description = "Test byte transfer.")
+    public byte[] testByte() {
+        byte[] bts = {0b01, 0b10, 0b11, 0b100};
+        return bts;
+    }
 
-  @Override
-  public void shutdown() {
-  }
+    @Override
+    public void shutdown() {
+    }
 }
-
diff --git a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothHspFacade.java b/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothHspFacade.java
index 0af2b9c..d8abfae 100644
--- a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothHspFacade.java
+++ b/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothHspFacade.java
@@ -33,218 +33,325 @@
 import java.util.List;
 
 public class BluetoothHspFacade extends RpcReceiver {
-  static final ParcelUuid[] UUIDS = {
-    BluetoothUuid.HSP, BluetoothUuid.Handsfree
-  };
+    static final ParcelUuid[] UUIDS = {
+            BluetoothUuid.HSP, BluetoothUuid.Handsfree
+    };
 
-  private final Service mService;
-  private final BluetoothAdapter mBluetoothAdapter;
+    private final Service mService;
+    private final BluetoothAdapter mBluetoothAdapter;
 
-  private static boolean sIsHspReady = false;
-  private static BluetoothHeadset sHspProfile = null;
+    private static boolean sIsHspReady = false;
+    private static BluetoothHeadset sHspProfile = null;
 
-  public BluetoothHspFacade(FacadeManager manager) {
-    super(manager);
-    mService = manager.getService();
-    mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
-    mBluetoothAdapter.getProfileProxy(mService, new HspServiceListener(),
-        BluetoothProfile.HEADSET);
-  }
+    public BluetoothHspFacade(FacadeManager manager) {
+        super(manager);
+        mService = manager.getService();
+        mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
+        mBluetoothAdapter.getProfileProxy(mService, new HspServiceListener(),
+                BluetoothProfile.HEADSET);
+    }
 
-  class HspServiceListener implements BluetoothProfile.ServiceListener {
-    @Override
-    public void onServiceConnected(int profile, BluetoothProfile proxy) {
-      sHspProfile = (BluetoothHeadset) proxy;
-      sIsHspReady = true;
+    class HspServiceListener implements BluetoothProfile.ServiceListener {
+        @Override
+        public void onServiceConnected(int profile, BluetoothProfile proxy) {
+            sHspProfile = (BluetoothHeadset) proxy;
+            sIsHspReady = true;
+        }
+
+        @Override
+        public void onServiceDisconnected(int profile) {
+            sIsHspReady = false;
+        }
+    }
+
+    /**
+     * Connect to Hsp Profile
+     * @param device - the BluetoothDevice object to connect to.
+     * @return if the connection was successfull or not.
+     */
+    public Boolean hspConnect(BluetoothDevice device) {
+        if (sHspProfile == null) return false;
+        return sHspProfile.connect(device);
+    }
+
+    /**
+     * Disconnect to Hsp Profile.
+     * @param device - the Bluetooth Device object to disconnect from.
+     * @return if the disconnection was successfull or not.
+     */
+    public Boolean hspDisconnect(BluetoothDevice device) {
+        if (sHspProfile == null) return false;
+        return sHspProfile.disconnect(device);
+    }
+
+    /**
+     * Is Hsp profile ready.
+     * @return if Hid profile is ready or not.
+     */
+    @Rpc(description = "Is Hsp profile ready.")
+    public Boolean bluetoothHspIsReady() {
+        return sIsHspReady;
+    }
+
+    /**
+     * Set priority of the profile.
+     * @param deviceStr - name or MAC address of a Bluetooth device.
+     * @param priority - Priority that needs to be set.
+     */
+    @Rpc(description = "Set priority of the profile.")
+    public void bluetoothHspSetPriority(
+            @RpcParameter(name = "device", description = "Mac address of a BT device.")
+                String deviceStr,
+            @RpcParameter(name = "priority", description = "Priority that needs to be set.")
+                Integer priority) throws Exception {
+        if (sHspProfile == null) return;
+        BluetoothDevice device = BluetoothFacade.getDevice(
+                mBluetoothAdapter.getBondedDevices(), deviceStr);
+        Log.d("Changing priority of device " + device.getAliasName() + " p: " + priority);
+        sHspProfile.setPriority(device, priority);
+    }
+
+    /**
+     * Connect to an HSP device.
+     * @param device - Name or MAC address of a bluetooth device.
+     * @return True if the connection was successful; otherwise False.
+     */
+    @Rpc(description = "Connect to an HSP device.")
+    public Boolean bluetoothHspConnect(
+            @RpcParameter(name = "device", description =
+                "Name or MAC address of a bluetooth device.")
+                String device) throws Exception {
+        if (sHspProfile == null) return false;
+        BluetoothDevice mDevice = BluetoothFacade.getDevice(
+                mBluetoothAdapter.getBondedDevices(), device);
+        Log.d("Connecting to device " + mDevice.getAliasName());
+        return hspConnect(mDevice);
+    }
+
+    /**
+     * Disconnect an HSP device.
+     * @param device - Name or MAC address of a bluetooth device.
+     * @return True if the disconnection was successful; otherwise False.
+     */
+    @Rpc(description = "Disconnect an HSP device.")
+    public Boolean bluetoothHspDisconnect(
+            @RpcParameter(name = "device", description = "Name or MAC address of a device.")
+                String device) throws Exception {
+        if (sHspProfile == null) return false;
+        Log.d("Connected devices: " + sHspProfile.getConnectedDevices());
+        BluetoothDevice mDevice = BluetoothFacade.getDevice(
+                sHspProfile.getConnectedDevices(), device);
+        return hspDisconnect(mDevice);
+    }
+
+     /**
+     * Get all the devices connected through HSP.
+     * @return List of all the devices connected through HSP.
+     */
+    @Rpc(description = "Get all the devices connected through HSP.")
+    public List<BluetoothDevice> bluetoothHspGetConnectedDevices() {
+        if (!sIsHspReady) return null;
+        return sHspProfile.getConnectedDevices();
+    }
+
+    /**
+     * Get the connection status of a device.
+     * @param deviceID - Name or MAC address of a bluetooth device.
+     * @return connection status of a device.
+     */
+    @Rpc(description = "Get the connection status of a device.")
+    public Integer bluetoothHspGetConnectionStatus(
+            @RpcParameter(name = "deviceID",
+                description = "Name or MAC address of a bluetooth device.")
+                    String deviceID) {
+        if (sHspProfile == null) {
+            return BluetoothProfile.STATE_DISCONNECTED;
+        }
+        List<BluetoothDevice> deviceList = sHspProfile.getConnectedDevices();
+        BluetoothDevice device;
+        try {
+            device = BluetoothFacade.getDevice(deviceList, deviceID);
+        } catch (Exception e) {
+            return BluetoothProfile.STATE_DISCONNECTED;
+        }
+        return sHspProfile.getConnectionState(device);
+    }
+
+    /**
+     * Force SCO audio on DUT, ignore all other restrictions
+     *
+     * @param force True to force SCO audio, False to resume normal
+     * @return True if the setup is successful
+     */
+    @Rpc(description = "Force SCO audio connection on DUT.")
+    public Boolean bluetoothHspForceScoAudio(
+            @RpcParameter(name = "force", description = "whether to force SCO audio")
+                Boolean force) {
+        if (sHspProfile == null) {
+            return false;
+        }
+        sHspProfile.setForceScoAudio(force);
+        return true;
+    }
+
+    /**
+     * Connect SCO audio to a remote device
+     *
+     * @param deviceAddress the Bluetooth MAC address of remote device
+     * @return True if connection is successful, False otherwise
+     */
+    @Rpc(description = "Connect SCO audio for a remote device.")
+    public Boolean bluetoothHspConnectAudio(
+            @RpcParameter(name = "deviceAddress",
+                description = "MAC address of a bluetooth device.")
+                    String deviceAddress) {
+        if (sHspProfile == null) {
+            return false;
+        }
+        Log.d("Connected devices: " + sHspProfile.getConnectedDevices());
+        BluetoothDevice device = null;
+        if (sHspProfile.getConnectedDevices().size() > 1) {
+            Log.d("More than one device available");
+        }
+        try {
+            device = BluetoothFacade.getDevice(
+                    sHspProfile.getConnectedDevices(), deviceAddress);
+        } catch (Exception e) {
+            Log.d("Cannot find device " + deviceAddress);
+            return false;
+        }
+        return sHspProfile.connectAudio();
+    }
+
+    /**
+     * Disconnect SCO audio for a remote device
+     *
+     * @param deviceAddress the Bluetooth MAC address of remote device
+     * @return True if disconnection is successful, False otherwise
+     */
+    @Rpc(description = "Disconnect SCO audio for a remote device")
+    public Boolean bluetoothHspDisconnectAudio(
+            @RpcParameter(name = "deviceAddress",
+                description = "MAC address of a bluetooth device.")
+                    String deviceAddress) {
+        if (sHspProfile == null) {
+            return false;
+        }
+        Log.d("Connected devices: " + sHspProfile.getConnectedDevices());
+        BluetoothDevice device = null;
+        if (sHspProfile.getConnectedDevices().size() > 1) {
+            Log.d("More than one device available");
+        }
+        try {
+            device = BluetoothFacade.getDevice(
+                    sHspProfile.getConnectedDevices(), deviceAddress);
+        } catch (Exception e) {
+            Log.d("Cannot find device " + deviceAddress);
+            return false;
+        }
+        if (!sHspProfile.isAudioConnected(device)) {
+            Log.d("SCO audio is not connected for device " + deviceAddress);
+            return false;
+        }
+        return sHspProfile.disconnectAudio();
+    }
+
+    /**
+     * Check if SCO audio is connected for a remote device
+     *
+     * @param deviceAddress the Bluetooth MAC address of remote device
+     * @return True if device is connected to us via SCO audio, False otherwise
+     */
+    @Rpc(description = "Check if SCO audio is connected for a remote device")
+    public Boolean bluetoothHspIsAudioConnected(
+            @RpcParameter(name = "deviceAddress",
+                description = "MAC address of a bluetooth device.")
+                    String deviceAddress) {
+        if (sHspProfile == null) {
+            return false;
+        }
+        Log.d("Connected devices: " + sHspProfile.getConnectedDevices());
+        BluetoothDevice device = null;
+        if (sHspProfile.getConnectedDevices().size() > 1) {
+            Log.d("More than one device available");
+        }
+        try {
+            device = BluetoothFacade.getDevice(
+                    sHspProfile.getConnectedDevices(), deviceAddress);
+        } catch (Exception e) {
+            Log.d("Cannot find device " + deviceAddress);
+            return false;
+        }
+        return sHspProfile.isAudioConnected(device);
+    }
+
+    /**
+     * Start voice recognition. Send BVRA command.
+     *
+     * @param deviceAddress the Bluetooth MAC address of remote device
+     * @return True if started successfully, False otherwise.
+     */
+    @Rpc(description = "Start Voice Recognition.")
+    public Boolean bluetoothHspStartVoiceRecognition(
+            @RpcParameter(name = "deviceAddress",
+                    description = "MAC address of a bluetooth device.")
+                        String deviceAddress) throws Exception {
+        BluetoothDevice device = BluetoothFacade.getDevice(
+                sHspProfile.getConnectedDevices(), deviceAddress);
+        return sHspProfile.startVoiceRecognition(device);
+    }
+
+    /**
+     * Stop voice recognition. Send BVRA command.
+     *
+     * @param deviceAddress the Bluetooth MAC address of remote device
+     * @return True if stopped successfully, False otherwise.
+     */
+    @Rpc(description = "Stop Voice Recognition.")
+    public Boolean bluetoothHspStopVoiceRecognition(
+            @RpcParameter(name = "deviceAddress",
+                description = "MAC address of a bluetooth device.")
+                    String deviceAddress) throws Exception {
+        BluetoothDevice device = BluetoothFacade.getDevice(
+                sHspProfile.getConnectedDevices(), deviceAddress);
+        return sHspProfile.stopVoiceRecognition(device);
+    }
+
+    /**
+     * Determine whether in-band ringtone is enabled or not.
+     *
+     * @return True if enabled, False otherwise.
+     */
+    @Rpc(description = "In-band ringtone enabled check.")
+    public Boolean bluetoothHspIsInbandRingingEnabled() {
+        return sHspProfile.isInbandRingingEnabled();
+    }
+
+    /**
+     * Send a CLCC response from Sl4a (experimental).
+     *
+     * @param index the index of the call
+     * @param direction the direction of the call
+     * @param status the status of the call
+     * @param mode the mode
+     * @param mpty the mpty value
+     * @param number the phone number
+     * @param type the type
+     */
+    @Rpc(description = "Send generic clcc response.")
+    public void bluetoothHspClccResponse(
+            @RpcParameter(name = "index", description = "") Integer index,
+            @RpcParameter(name = "direction", description = "") Integer direction,
+            @RpcParameter(name = "status", description = "") Integer status,
+            @RpcParameter(name = "mode", description = "") Integer mode,
+            @RpcParameter(name = "mpty", description = "") Boolean mpty,
+            @RpcParameter(name = "number", description = "") String number,
+            @RpcParameter(name = "type", description = "") Integer type
+                  ) {
+        sHspProfile.clccResponse(index, direction, status, mode, mpty, number, type);
     }
 
     @Override
-    public void onServiceDisconnected(int profile) {
-      sIsHspReady = false;
+    public void shutdown() {
     }
-  }
-
-  public Boolean hspConnect(BluetoothDevice device) {
-    if (sHspProfile == null) return false;
-    return sHspProfile.connect(device);
-  }
-
-  public Boolean hspDisconnect(BluetoothDevice device) {
-    if (sHspProfile == null) return false;
-    return sHspProfile.disconnect(device);
-  }
-
-  @Rpc(description = "Is Hsp profile ready.")
-  public Boolean bluetoothHspIsReady() {
-    return sIsHspReady;
-  }
-
-  @Rpc(description = "Set priority of the profile")
-  public void bluetoothHspSetPriority(
-      @RpcParameter(name = "device", description = "Mac address of a BT device.")
-      String deviceStr,
-      @RpcParameter(name = "priority", description = "Priority that needs to be set.")
-      Integer priority)
-      throws Exception {
-    if (sHspProfile == null) return;
-    BluetoothDevice device =
-        BluetoothFacade.getDevice(mBluetoothAdapter.getBondedDevices(), deviceStr);
-    Log.d("Changing priority of device " + device.getAliasName() + " p: " + priority);
-    sHspProfile.setPriority(device, priority);
-  }
-
-  @Rpc(description = "Connect to an HSP device.")
-  public Boolean bluetoothHspConnect(
-      @RpcParameter(name = "device", description = "Name or MAC address of a bluetooth device.")
-      String device)
-      throws Exception {
-    if (sHspProfile == null)
-      return false;
-    BluetoothDevice mDevice = BluetoothFacade.getDevice(BluetoothFacade.DiscoveredDevices, device);
-    Log.d("Connecting to device " + mDevice.getAliasName());
-    return hspConnect(mDevice);
-  }
-
-  @Rpc(description = "Disconnect an HSP device.")
-  public Boolean bluetoothHspDisconnect(
-      @RpcParameter(name = "device", description = "Name or MAC address of a device.")
-      String device)
-      throws Exception {
-    if (sHspProfile == null)
-      return false;
-    Log.d("Connected devices: " + sHspProfile.getConnectedDevices());
-    BluetoothDevice mDevice = BluetoothFacade.getDevice(sHspProfile.getConnectedDevices(),
-                                                        device);
-    return hspDisconnect(mDevice);
-  }
-
-  @Rpc(description = "Get all the devices connected through HSP.")
-  public List<BluetoothDevice> bluetoothHspGetConnectedDevices() {
-    while (!sIsHspReady);
-    return sHspProfile.getConnectedDevices();
-  }
-
-  @Rpc(description = "Get the connection status of a device.")
-  public Integer bluetoothHspGetConnectionStatus(
-          @RpcParameter(name = "deviceID",
-                        description = "Name or MAC address of a bluetooth device.")
-          String deviceID) {
-      if (sHspProfile == null) {
-          return BluetoothProfile.STATE_DISCONNECTED;
-      }
-      List<BluetoothDevice> deviceList = sHspProfile.getConnectedDevices();
-      BluetoothDevice device;
-      try {
-          device = BluetoothFacade.getDevice(deviceList, deviceID);
-      } catch (Exception e) {
-          return BluetoothProfile.STATE_DISCONNECTED;
-      }
-      return sHspProfile.getConnectionState(device);
-  }
-
-  /**
-   * Force SCO audio on DUT, ignore all other restrictions
-   *
-   * @param force True to force SCO audio, False to resume normal
-   * @return True if the setup is successful
-   */
-  @Rpc(description = "Force SCO audio connection on DUT")
-  public Boolean bluetoothHspForceScoAudio(
-          @RpcParameter(name = "force", description = "whether to force SCO audio")
-                  Boolean force) {
-    if (sHspProfile == null) {
-      return false;
-    }
-    sHspProfile.setForceScoAudio(force);
-    return true;
-  }
-
-  /**
-   * Connect SCO audio to a remote device
-   *
-   * @param deviceAddress the Bluetooth MAC address of remote device
-   * @return True if connection is successful, False otherwise
-   */
-  @Rpc(description = "Connect SCO audio for a remote device")
-  public Boolean bluetoothHspConnectAudio(
-          @RpcParameter(name = "deviceAddress", description = "MAC address of a bluetooth device.")
-                  String deviceAddress) {
-    if (sHspProfile == null) {
-      return false;
-    }
-    Log.d("Connected devices: " + sHspProfile.getConnectedDevices());
-    BluetoothDevice device = null;
-    if (sHspProfile.getConnectedDevices().size() > 1) {
-      Log.d("More than one device available");
-    }
-    try {
-      device = BluetoothFacade.getDevice(sHspProfile.getConnectedDevices(), deviceAddress);
-    } catch (Exception e) {
-      Log.d("Cannot find device " + deviceAddress);
-      return false;
-    }
-    return sHspProfile.connectAudio();
-  }
-
-  /**
-   * Disconnect SCO audio for a remote device
-   *
-   * @param deviceAddress the Bluetooth MAC address of remote device
-   * @return True if disconnection is successful, False otherwise
-   */
-  @Rpc(description = "Disconnect SCO audio for a remote device")
-  public Boolean bluetoothHspDisconnectAudio(
-          @RpcParameter(name = "deviceAddress", description = "MAC address of a bluetooth device.")
-                  String deviceAddress) {
-    if (sHspProfile == null) {
-      return false;
-    }
-    Log.d("Connected devices: " + sHspProfile.getConnectedDevices());
-    BluetoothDevice device = null;
-    if (sHspProfile.getConnectedDevices().size() > 1) {
-      Log.d("More than one device available");
-    }
-    try {
-      device = BluetoothFacade.getDevice(sHspProfile.getConnectedDevices(), deviceAddress);
-    } catch (Exception e) {
-      Log.d("Cannot find device " + deviceAddress);
-      return false;
-    }
-    if (!sHspProfile.isAudioConnected(device)) {
-      Log.d("SCO audio is not connected for device " + deviceAddress);
-      return false;
-    }
-    return sHspProfile.disconnectAudio();
-  }
-
-  /**
-   * Check if SCO audio is connected for a remote device
-   *
-   * @param deviceAddress the Bluetooth MAC address of remote device
-   * @return True if device is connected to us via SCO audio, False otherwise
-   */
-  @Rpc(description = "Check if SCO audio is connected for a remote device")
-  public Boolean bluetoothHspIsAudioConnected(
-          @RpcParameter(name = "deviceAddress", description = "MAC address of a bluetooth device.")
-                  String deviceAddress) {
-    if (sHspProfile == null) {
-      return false;
-    }
-    Log.d("Connected devices: " + sHspProfile.getConnectedDevices());
-    BluetoothDevice device = null;
-    if (sHspProfile.getConnectedDevices().size() > 1) {
-      Log.d("More than one device available");
-    }
-    try {
-      device = BluetoothFacade.getDevice(sHspProfile.getConnectedDevices(), deviceAddress);
-    } catch (Exception e) {
-      Log.d("Cannot find device " + deviceAddress);
-      return false;
-    }
-    return sHspProfile.isAudioConnected(device);
-  }
-
-  @Override
-  public void shutdown() {
-  }
 }
diff --git a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothLeAdvertiseFacade.java b/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothLeAdvertiseFacade.java
index 521c517..d18dc56 100644
--- a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothLeAdvertiseFacade.java
+++ b/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothLeAdvertiseFacade.java
@@ -73,7 +73,8 @@
         mAdvertiseDataList = new HashMap<Integer, AdvertiseData>();
         mAdvertiseSettingsList = new HashMap<Integer, AdvertiseSettings>();
         mAdvertiseDataBuilder = new Builder();
-        mAdvertiseSettingsBuilder = new android.bluetooth.le.AdvertiseSettings.Builder();
+        mAdvertiseSettingsBuilder =
+                new android.bluetooth.le.AdvertiseSettings.Builder();
     }
 
     /**
@@ -96,7 +97,8 @@
      *
      * @return index
      */
-    @Rpc(description = "Constructs a new Builder obj for AdvertiseData and returns its index")
+    @Rpc(description =
+            "Constructs a new Builder obj for AdvertiseData and returns its index")
     public Integer bleBuildAdvertiseData() {
         BleAdvertiseDataCount += 1;
         int index = BleAdvertiseDataCount;
@@ -111,13 +113,15 @@
      *
      * @return index
      */
-    @Rpc(description = "Constructs a new Builder obj for AdvertiseData and returns its index")
+    @Rpc(description =
+            "Constructs a new Builder obj for AdvertiseData and returns its index")
     public Integer bleBuildAdvertiseSettings() {
         BleAdvertiseSettingsCount += 1;
         int index = BleAdvertiseSettingsCount;
         mAdvertiseSettingsList.put(index,
                 mAdvertiseSettingsBuilder.build());
-        mAdvertiseSettingsBuilder = new android.bluetooth.le.AdvertiseSettings.Builder();
+        mAdvertiseSettingsBuilder =
+                new android.bluetooth.le.AdvertiseSettings.Builder();
         return index;
     }
 
@@ -136,7 +140,8 @@
             mAdvertise.stopAdvertising(mAdvertiseCallbackList
                     .get(index));
         } else {
-            throw new Exception("Invalid index input:" + Integer.toString(index));
+            throw new Exception("Invalid index input:"
+                    + Integer.toString(index));
         }
     }
 
@@ -162,25 +167,29 @@
         if (mAdvertiseDataList.get(dataIndex) != null) {
             mData = mAdvertiseDataList.get(dataIndex);
         } else {
-            throw new Exception("Invalid dataIndex input:" + Integer.toString(dataIndex));
+            throw new Exception("Invalid dataIndex input:"
+                    + Integer.toString(dataIndex));
         }
         if (mAdvertiseSettingsList.get(settingsIndex) != null) {
             mSettings = mAdvertiseSettingsList.get(settingsIndex);
         } else {
-            throw new Exception("Invalid settingsIndex input:" + Integer.toString(settingsIndex));
+            throw new Exception("Invalid settingsIndex input:"
+                    + Integer.toString(settingsIndex));
         }
         if (mAdvertiseCallbackList.get(callbackIndex) != null) {
             Log.d("bluetooth_le starting a background advertisement on callback index: "
                     + Integer.toString(callbackIndex));
-            mAdvertise
-                    .startAdvertising(mSettings, mData, mAdvertiseCallbackList.get(callbackIndex));
+            mAdvertise.startAdvertising(
+                    mSettings, mData, mAdvertiseCallbackList.get(callbackIndex));
         } else {
-            throw new Exception("Invalid callbackIndex input" + Integer.toString(callbackIndex));
+            throw new Exception("Invalid callbackIndex input"
+                    + Integer.toString(callbackIndex));
         }
     }
 
     /**
-     * Starts ble advertising with a scanResponse. ScanResponses are created in the same way
+     * Starts ble advertising with a scanResponse. ScanResponses are created in
+     *        the same way
      * AdvertiseData is created since they share the same object type.
      *
      * @param callbackIndex The advertisementCallback index
@@ -207,12 +216,14 @@
         if (mAdvertiseDataList.get(dataIndex) != null) {
             mData = mAdvertiseDataList.get(dataIndex);
         } else {
-            throw new Exception("Invalid dataIndex input:" + Integer.toString(dataIndex));
+            throw new Exception("Invalid dataIndex input:"
+                    + Integer.toString(dataIndex));
         }
         if (mAdvertiseSettingsList.get(settingsIndex) != null) {
             mSettings = mAdvertiseSettingsList.get(settingsIndex);
         } else {
-            throw new Exception("Invalid settingsIndex input:" + Integer.toString(settingsIndex));
+            throw new Exception("Invalid settingsIndex input:"
+                    + Integer.toString(settingsIndex));
         }
         if (mAdvertiseDataList.get(scanResponseIndex) != null) {
             mScanResponse = mAdvertiseDataList.get(scanResponseIndex);
@@ -227,7 +238,8 @@
                     .startAdvertising(mSettings, mData, mScanResponse,
                             mAdvertiseCallbackList.get(callbackIndex));
         } else {
-            throw new Exception("Invalid callbackIndex input" + Integer.toString(callbackIndex));
+            throw new Exception("Invalid callbackIndex input"
+                    + Integer.toString(callbackIndex));
         }
     }
 
@@ -246,7 +258,8 @@
             AdvertiseSettings mSettings = mAdvertiseSettingsList.get(index);
             return mSettings.getMode();
         } else {
-            throw new Exception("Invalid index input:" + Integer.toString(index));
+            throw new Exception("Invalid index input:"
+                    + Integer.toString(index));
         }
     }
 
@@ -304,7 +317,8 @@
             AdvertiseData mData = mAdvertiseDataList.get(index);
             return mData.getIncludeTxPowerLevel();
         } else {
-            throw new Exception("Invalid index input:" + Integer.toString(index));
+            throw new Exception("Invalid index input:"
+                    + Integer.toString(index));
         }
     }
 
@@ -327,10 +341,12 @@
             if (mData.getManufacturerSpecificData() != null) {
                 return mData.getManufacturerSpecificData().get(manufacturerId);
             } else {
-                throw new Exception("Invalid manufacturerId input:" + Integer.toString(manufacturerId));
+                throw new Exception("Invalid manufacturerId input:"
+                        + Integer.toString(manufacturerId));
             }
         } else {
-            throw new Exception("Invalid index input:" + Integer.toString(index));
+            throw new Exception("Invalid index input:"
+                    + Integer.toString(index));
 
         }
     }
@@ -350,7 +366,8 @@
             AdvertiseData mData = mAdvertiseDataList.get(index);
             return mData.getIncludeDeviceName();
         } else {
-            throw new Exception("Invalid index input:" + Integer.toString(index));
+            throw new Exception("Invalid index input:"
+                    + Integer.toString(index));
         }
     }
 
@@ -377,7 +394,8 @@
                 throw new Exception("Invalid serviceUuid input:" + serviceUuid);
             }
         } else {
-            throw new Exception("Invalid index input:" + Integer.toString(index));
+            throw new Exception("Invalid index input:"
+                    + Integer.toString(index));
         }
     }
 
@@ -396,7 +414,8 @@
             AdvertiseData mData = mAdvertiseDataList.get(index);
             return mData.getServiceUuids();
         } else {
-            throw new Exception("Invalid index input:" + Integer.toString(index));
+            throw new Exception("Invalid index input:"
+                    + Integer.toString(index));
         }
     }
 
@@ -498,8 +517,8 @@
     /**
      * Set ble advertisement data include tx power level
      *
-     * @param includeTxPowerLevel boolean whether to include the tx power level or not in the
-     *            advertisement
+     * @param includeTxPowerLevel boolean whether to include the tx
+     *         power level or not in the advertisement
      */
     @Rpc(description = "Set ble advertisement data include tx power level")
     public void bleSetAdvertiseDataIncludeTxPowerLevel(
@@ -525,8 +544,8 @@
     /**
      * Set ble advertisement data include device name
      *
-     * @param includeDeviceName boolean whether to include device name or not in the
-     *            advertisement
+     * @param includeDeviceName boolean whether to include device name or
+     *        not in the advertisement
      */
     @Rpc(description = "Set ble advertisement data include device name")
     public void bleSetAdvertiseDataIncludeDeviceName(
@@ -553,22 +572,28 @@
                     + index);
             mResults.putString("Type", "onSuccess");
             mResults.putParcelable("SettingsInEffect", settingsInEffect);
-            mEventFacade.postEvent(mEventType + index + "onSuccess", mResults.clone());
+            mEventFacade.postEvent(mEventType + index
+                    + "onSuccess", mResults.clone());
             mResults.clear();
         }
 
         @Override
         public void onStartFailure(int errorCode) {
             String errorString = "UNKNOWN_ERROR_CODE";
-            if (errorCode == AdvertiseCallback.ADVERTISE_FAILED_ALREADY_STARTED) {
+            if (errorCode
+                    == AdvertiseCallback.ADVERTISE_FAILED_ALREADY_STARTED) {
                 errorString = "ADVERTISE_FAILED_ALREADY_STARTED";
-            } else if (errorCode == AdvertiseCallback.ADVERTISE_FAILED_DATA_TOO_LARGE) {
+            } else if (errorCode
+                    == AdvertiseCallback.ADVERTISE_FAILED_DATA_TOO_LARGE) {
                 errorString = "ADVERTISE_FAILED_DATA_TOO_LARGE";
-            } else if (errorCode == AdvertiseCallback.ADVERTISE_FAILED_FEATURE_UNSUPPORTED) {
+            } else if (errorCode
+                    == AdvertiseCallback.ADVERTISE_FAILED_FEATURE_UNSUPPORTED) {
                 errorString = "ADVERTISE_FAILED_FEATURE_UNSUPPORTED";
-            } else if (errorCode == AdvertiseCallback.ADVERTISE_FAILED_INTERNAL_ERROR) {
+            } else if (errorCode
+                    == AdvertiseCallback.ADVERTISE_FAILED_INTERNAL_ERROR) {
                 errorString = "ADVERTISE_FAILED_INTERNAL_ERROR";
-            } else if (errorCode == AdvertiseCallback.ADVERTISE_FAILED_TOO_MANY_ADVERTISERS) {
+            } else if (errorCode
+                    == AdvertiseCallback.ADVERTISE_FAILED_TOO_MANY_ADVERTISERS) {
                 errorString = "ADVERTISE_FAILED_TOO_MANY_ADVERTISERS";
             }
             Log.d("bluetooth_le_advertisement onFailure " + mEventType + " "
diff --git a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothLeScanFacade.java b/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothLeScanFacade.java
index ba92ab9..06f2216 100644
--- a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothLeScanFacade.java
+++ b/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothLeScanFacade.java
@@ -226,7 +226,8 @@
                     + Integer.toString(scanSettingsIndex));
         }
         if (mScanCallbackList.get(callbackIndex) != null) {
-            mScanner.startScan(mScanFilters, mScanSettings, mScanCallbackList.get(callbackIndex));
+            mScanner.startScan(mScanFilters, mScanSettings,
+                    mScanCallbackList.get(callbackIndex));
         } else {
             throw new Exception("Invalid filterListIndex input:"
                     + Integer.toString(filterListIndex));
@@ -247,7 +248,8 @@
         Log.d("bluetooth_le_scan starting a background scan");
         boolean result = false;
         if (mLeScanCallbackList.get(leCallbackIndex) != null) {
-            result = mBluetoothAdapter.startLeScan(mLeScanCallbackList.get(leCallbackIndex));
+            result = mBluetoothAdapter.startLeScan(
+                    mLeScanCallbackList.get(leCallbackIndex));
         } else {
             throw new Exception("Invalid leCallbackIndex input:"
                     + Integer.toString(leCallbackIndex));
@@ -452,7 +454,8 @@
             ScanSettings mScanSettings = mScanSettingsList.get(index);
             return mScanSettings.getScanResultType();
         } else {
-            throw new Exception("Invalid index input:" + Integer.toString(index));
+            throw new Exception("Invalid index input:"
+                    +    Integer.toString(index));
         }
     }
 
@@ -475,10 +478,12 @@
                 return mScanFilterList.get(index)
                         .get(filterIndex).getManufacturerId();
             } else {
-                throw new Exception("Invalid filterIndex input:" + Integer.toString(filterIndex));
+                throw new Exception("Invalid filterIndex input:"
+                        + Integer.toString(filterIndex));
             }
         } else {
-            throw new Exception("Invalid index input:" + Integer.toString(index));
+            throw new Exception("Invalid index input:"
+                    + Integer.toString(index));
         }
     }
 
@@ -498,12 +503,15 @@
             throws Exception {
         if (mScanFilterList.get(index) != null) {
             if (mScanFilterList.get(index).get(filterIndex) != null) {
-                return mScanFilterList.get(index).get(filterIndex).getDeviceAddress();
+                return mScanFilterList.get(index).get(
+                        filterIndex).getDeviceAddress();
             } else {
-                throw new Exception("Invalid filterIndex input:" + Integer.toString(filterIndex));
+                throw new Exception("Invalid filterIndex input:"
+                        + Integer.toString(filterIndex));
             }
         } else {
-            throw new Exception("Invalid index input:" + Integer.toString(index));
+            throw new Exception("Invalid index input:"
+                    + Integer.toString(index));
         }
     }
 
@@ -523,12 +531,15 @@
             throws Exception {
         if (mScanFilterList.get(index) != null) {
             if (mScanFilterList.get(index).get(filterIndex) != null) {
-                return mScanFilterList.get(index).get(filterIndex).getDeviceName();
+                return mScanFilterList.get(index).get(
+                        filterIndex).getDeviceName();
             } else {
-                throw new Exception("Invalid filterIndex input:" + Integer.toString(filterIndex));
+                throw new Exception("Invalid filterIndex input:"
+                        + Integer.toString(filterIndex));
             }
         } else {
-            throw new Exception("Invalid index input:" + Integer.toString(index));
+            throw new Exception("Invalid index input:"
+                    + Integer.toString(index));
         }
     }
 
@@ -548,12 +559,15 @@
             throws Exception {
         if (mScanFilterList.get(index) != null) {
             if (mScanFilterList.get(index).get(filterIndex) != null) {
-                return mScanFilterList.get(index).get(filterIndex).getManufacturerData();
+                return mScanFilterList.get(index).get(
+                        filterIndex).getManufacturerData();
             } else {
-                throw new Exception("Invalid filterIndex input:" + Integer.toString(filterIndex));
+                throw new Exception("Invalid filterIndex input:"
+                        + Integer.toString(filterIndex));
             }
         } else {
-            throw new Exception("Invalid index input:" + Integer.toString(index));
+            throw new Exception("Invalid index input:"
+                    + Integer.toString(index));
         }
     }
 
@@ -573,12 +587,15 @@
             throws Exception {
         if (mScanFilterList.get(index) != null) {
             if (mScanFilterList.get(index).get(filterIndex) != null) {
-                return mScanFilterList.get(index).get(filterIndex).getManufacturerDataMask();
+                return mScanFilterList.get(index).get(
+                        filterIndex).getManufacturerDataMask();
             } else {
-                throw new Exception("Invalid filterIndex input:" + Integer.toString(filterIndex));
+                throw new Exception("Invalid filterIndex input:"
+                        + Integer.toString(filterIndex));
             }
         } else {
-            throw new Exception("Invalid index input:" + Integer.toString(index));
+            throw new Exception("Invalid index input:"
+                    + Integer.toString(index));
         }
     }
 
@@ -598,12 +615,15 @@
             throws Exception {
         if (mScanFilterList.get(index) != null) {
             if (mScanFilterList.get(index).get(filterIndex) != null) {
-                return mScanFilterList.get(index).get(filterIndex).getServiceData();
+                return mScanFilterList.get(index).get(
+                        filterIndex).getServiceData();
             } else {
-                throw new Exception("Invalid filterIndex input:" + Integer.toString(filterIndex));
+                throw new Exception("Invalid filterIndex input:"
+                        + Integer.toString(filterIndex));
             }
         } else {
-            throw new Exception("Invalid index input:" + Integer.toString(index));
+            throw new Exception("Invalid index input:"
+                    + Integer.toString(index));
         }
     }
 
@@ -623,12 +643,15 @@
             throws Exception {
         if (mScanFilterList.get(index) != null) {
             if (mScanFilterList.get(index).get(filterIndex) != null) {
-                return mScanFilterList.get(index).get(filterIndex).getServiceDataMask();
+                return mScanFilterList.get(index).get(
+                        filterIndex).getServiceDataMask();
             } else {
-                throw new Exception("Invalid filterIndex input:" + Integer.toString(filterIndex));
+                throw new Exception("Invalid filterIndex input:"
+                        + Integer.toString(filterIndex));
             }
         } else {
-            throw new Exception("Invalid index input:" + Integer.toString(index));
+            throw new Exception("Invalid index input:"
+                    + Integer.toString(index));
         }
     }
 
@@ -648,17 +671,21 @@
             throws Exception {
         if (mScanFilterList.get(index) != null) {
             if (mScanFilterList.get(index).get(filterIndex) != null) {
-                if (mScanFilterList.get(index).get(filterIndex).getServiceUuid() != null) {
-                    return mScanFilterList.get(index).get(filterIndex).getServiceUuid().toString();
+                if (mScanFilterList.get(index).get(
+                        filterIndex).getServiceUuid() != null) {
+                    return mScanFilterList.get(index).get(
+                            filterIndex).getServiceUuid().toString();
                 } else {
                     throw new Exception("No Service Uuid set for filter:"
                             + Integer.toString(filterIndex));
                 }
             } else {
-                throw new Exception("Invalid filterIndex input:" + Integer.toString(filterIndex));
+                throw new Exception("Invalid filterIndex input:"
+                        + Integer.toString(filterIndex));
             }
         } else {
-            throw new Exception("Invalid index input:" + Integer.toString(index));
+            throw new Exception("Invalid index input:"
+                    + Integer.toString(index));
         }
     }
 
@@ -678,18 +705,22 @@
             throws Exception {
         if (mScanFilterList.get(index) != null) {
             if (mScanFilterList.get(index).get(filterIndex) != null) {
-                if (mScanFilterList.get(index).get(filterIndex).getServiceUuidMask() != null) {
-                    return mScanFilterList.get(index).get(filterIndex).getServiceUuidMask()
+                if (mScanFilterList.get(index).get(
+                        filterIndex).getServiceUuidMask() != null) {
+                    return mScanFilterList.get(
+                            index).get(filterIndex).getServiceUuidMask()
                             .toString();
                 } else {
                     throw new Exception("No Service Uuid Mask set for filter:"
                             + Integer.toString(filterIndex));
                 }
             } else {
-                throw new Exception("Invalid filterIndex input:" + Integer.toString(filterIndex));
+                throw new Exception("Invalid filterIndex input:"
+                        + Integer.toString(filterIndex));
             }
         } else {
-            throw new Exception("Invalid index input:" + Integer.toString(index));
+            throw new Exception("Invalid index input:"
+                    + Integer.toString(index));
         }
     }
 
@@ -708,8 +739,8 @@
     }
 
     /**
-     * Add filter "manufacturereDataId and/or manufacturerData" to existing ScanFilter
-     *
+     * Add filter "manufacturereDataId and/or manufacturerData" to existing
+     * ScanFilter
      * @param manufacturerDataId the manufacturer data id to filter against
      * @param manufacturerDataMask the manufacturere data mask to filter against
      * @throws Exception
@@ -742,13 +773,10 @@
      */
     @Rpc(description = "Add filter \"serviceData and serviceDataMask\" to existing ScanFilter ")
     public void bleSetScanFilterServiceData(
-            @RpcParameter(name = "serviceUuid")
-            String serviceUuid,
-            @RpcParameter(name = "serviceData")
-            byte[] serviceData,
+            @RpcParameter(name = "serviceUuid") String serviceUuid,
+            @RpcParameter(name = "serviceData") byte[] serviceData,
             @RpcParameter(name = "serviceDataMask")
-            @RpcOptional
-            byte[] serviceDataMask
+            @RpcOptional byte[] serviceDataMask
             ) {
         if (serviceDataMask != null) {
             mScanFilterBuilder
@@ -841,14 +869,17 @@
             String errorString = "UNKNOWN_ERROR_CODE";
             if (errorCode == ScanCallback.SCAN_FAILED_ALREADY_STARTED) {
                 errorString = "SCAN_FAILED_ALREADY_STARTED";
-            } else if (errorCode == ScanCallback.SCAN_FAILED_APPLICATION_REGISTRATION_FAILED) {
+            } else if (errorCode
+                    == ScanCallback.SCAN_FAILED_APPLICATION_REGISTRATION_FAILED) {
                 errorString = "SCAN_FAILED_APPLICATION_REGISTRATION_FAILED";
-            } else if (errorCode == ScanCallback.SCAN_FAILED_FEATURE_UNSUPPORTED) {
+            } else if (errorCode
+                    == ScanCallback.SCAN_FAILED_FEATURE_UNSUPPORTED) {
                 errorString = "SCAN_FAILED_FEATURE_UNSUPPORTED";
             } else if (errorCode == ScanCallback.SCAN_FAILED_INTERNAL_ERROR) {
                 errorString = "SCAN_FAILED_INTERNAL_ERROR";
             }
-            Log.d("bluetooth_le_scan change onScanFailed " + mEventType + " " + index + " error "
+            Log.d("bluetooth_le_scan change onScanFailed "
+                    + mEventType + " " + index + " error "
                     + errorString);
             mResults.putInt("ID", index);
             mResults.putString("Type", "onScanFailed");
@@ -861,12 +892,14 @@
 
         @Override
         public void onScanResult(int callbackType, ScanResult result) {
-            Log.d("bluetooth_le_scan change onUpdate " + mEventType + " " + index);
+            Log.d("bluetooth_le_scan change onUpdate "
+                    + mEventType + " " + index);
             mResults.putInt("ID", index);
             mResults.putInt("CallbackType", callbackType);
             mResults.putString("Type", "onScanResult");
             mResults.putParcelable("Result", result);
-            mEventFacade.postEvent(mEventType + index + "onScanResults", mResults.clone());
+            mEventFacade.postEvent(
+                    mEventType + index + "onScanResults", mResults.clone());
             mResults.clear();
         }
 
@@ -877,7 +910,8 @@
             mResults.putInt("ID", index);
             mResults.putString("Type", "onBatchScanResults");
             mResults.putParcelableList("Results", results);
-            mEventFacade.postEvent(mEventType + index + "onBatchScanResult", mResults.clone());
+            mEventFacade.postEvent(mEventType
+                    + index + "onBatchScanResult", mResults.clone());
             mResults.clear();
         }
     }
@@ -894,43 +928,45 @@
         }
 
         @Override
-        public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) {
+        public void onLeScan(
+                BluetoothDevice device, int rssi, byte[] scanRecord) {
             Log.d("bluetooth_classic_le_scan " + mEventType + " " + index);
             mResults.putParcelable("Device", device);
             mResults.putInt("Rssi", rssi);
             mResults.putByteArray("ScanRecord", scanRecord);
             mResults.putString("Type", "onLeScan");
-            mEventFacade.postEvent(mEventType + index + "onLeScan", mResults.clone());
+            mEventFacade.postEvent(mEventType
+                    + index + "onLeScan", mResults.clone());
             mResults.clear();
         }
     }
 
     @Override
     public void shutdown() {
-      if (mBluetoothAdapter.getState() == BluetoothAdapter.STATE_ON) {
-          for (myScanCallback mScanCallback : mScanCallbackList.values()) {
-              if (mScanCallback != null) {
-                  try {
-                    mBluetoothAdapter.getBluetoothLeScanner()
-                      .stopScan(mScanCallback);
-                  } catch (NullPointerException e) {
-                    Log.e("Failed to stop ble scan callback.", e);
-                  }
-              }
-          }
-          for (myLeScanCallback mLeScanCallback : mLeScanCallbackList.values()) {
-              if (mLeScanCallback != null) {
-                  try {
-                      mBluetoothAdapter.stopLeScan(mLeScanCallback);
-                  } catch (NullPointerException e) {
-                    Log.e("Failed to stop classic ble scan callback.", e);
-                  }
-              }
-          }
-      }
-      mScanCallbackList.clear();
-      mScanFilterList.clear();
-      mScanSettingsList.clear();
-      mLeScanCallbackList.clear();
+        if (mBluetoothAdapter.getState() == BluetoothAdapter.STATE_ON) {
+            for (myScanCallback mScanCallback : mScanCallbackList.values()) {
+                if (mScanCallback != null) {
+                    try {
+                        mBluetoothAdapter.getBluetoothLeScanner()
+                                .stopScan(mScanCallback);
+                    } catch (NullPointerException e) {
+                        Log.e("Failed to stop ble scan callback.", e);
+                    }
+                }
+            }
+            for (myLeScanCallback mLeScanCallback : mLeScanCallbackList.values()) {
+                if (mLeScanCallback != null) {
+                    try {
+                        mBluetoothAdapter.stopLeScan(mLeScanCallback);
+                    } catch (NullPointerException e) {
+                        Log.e("Failed to stop classic ble scan callback.", e);
+                    }
+                }
+            }
+        }
+        mScanCallbackList.clear();
+        mScanFilterList.clear();
+        mScanSettingsList.clear();
+        mLeScanCallbackList.clear();
     }
 }
diff --git a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothMapClientFacade.java b/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothMapClientFacade.java
index 0de2829..36573d2 100644
--- a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothMapClientFacade.java
+++ b/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothMapClientFacade.java
@@ -72,12 +72,16 @@
         mEventFacade = manager.getReceiver(EventFacade.class);
 
         mNotificationReceiver = new NotificationReceiver();
-        mSendIntent = new Intent(BluetoothMapClient.ACTION_MESSAGE_SENT_SUCCESSFULLY);
-        mDeliveryIntent = new Intent(BluetoothMapClient.ACTION_MESSAGE_DELIVERED_SUCCESSFULLY);
+        mSendIntent = new Intent(
+                BluetoothMapClient.ACTION_MESSAGE_SENT_SUCCESSFULLY);
+        mDeliveryIntent = new Intent(
+                BluetoothMapClient.ACTION_MESSAGE_DELIVERED_SUCCESSFULLY);
         IntentFilter intentFilter = new IntentFilter();
         intentFilter.addAction(BluetoothMapClient.ACTION_MESSAGE_RECEIVED);
-        intentFilter.addAction(BluetoothMapClient.ACTION_MESSAGE_SENT_SUCCESSFULLY);
-        intentFilter.addAction(BluetoothMapClient.ACTION_MESSAGE_DELIVERED_SUCCESSFULLY);
+        intentFilter.addAction(
+                BluetoothMapClient.ACTION_MESSAGE_SENT_SUCCESSFULLY);
+        intentFilter.addAction(
+                BluetoothMapClient.ACTION_MESSAGE_DELIVERED_SUCCESSFULLY);
         mService.registerReceiver(mNotificationReceiver, intentFilter);
         Log.d("notification receiver registered");
     }
@@ -107,34 +111,41 @@
 
     @Rpc(description = "Connect to an MAP MSE device.")
     public Boolean bluetoothMapClientConnect(
-            @RpcParameter(name = "device", description = "Name or MAC address of a bluetooth "
+            @RpcParameter(name = "device",
+                    description = "Name or MAC address of a bluetooth "
                     + "device.")
                     String device)
             throws Exception {
         if (sMapProfile == null) return false;
-        BluetoothDevice mDevice = BluetoothFacade.getDevice(mBluetoothAdapter.getBondedDevices(),
-                device);
+        BluetoothDevice mDevice = BluetoothFacade.getDevice(
+                mBluetoothAdapter.getBondedDevices(), device);
         Log.d("Connecting to device " + mDevice.getAliasName());
         return sMapProfile.connect(mDevice);
     }
 
     @Rpc(description = "Send a (text) message via bluetooth.")
     public Boolean mapSendMessage(
-            @RpcParameter(name = "deviceID", description = "Name or MAC address of a device.")
+            @RpcParameter(name = "deviceID",
+                    description = "Name or MAC address of a device.")
                     String deviceID,
-            @RpcParameter(name = "phoneNumbers", description = "Phone number of contact.")
+            @RpcParameter(name = "phoneNumbers",
+                    description = "Phone number of contact.")
                     String[] phoneNumbers,
-            @RpcParameter(name = "message", description = "Message to send.") String message) {
+            @RpcParameter(name = "message",
+                    description = "Message to send.") String message) {
         try {
             BluetoothDevice device =
-                    BluetoothFacade.getDevice(sMapProfile.getConnectedDevices(), deviceID);
+                    BluetoothFacade.getDevice(
+                            sMapProfile.getConnectedDevices(), deviceID);
             mSentIntent = PendingIntent.getBroadcast(mService, 0, mSendIntent,
                     PendingIntent.FLAG_ONE_SHOT);
-            mDeliveredIntent = PendingIntent.getBroadcast(mService, 0, mDeliveryIntent,
+            mDeliveredIntent = PendingIntent.getBroadcast(
+                    mService, 0, mDeliveryIntent,
                     PendingIntent.FLAG_ONE_SHOT);
             Uri[] contacts = new Uri[phoneNumbers.length];
             for (int i = 0; i < phoneNumbers.length; i++) {
-                Log.d("PhoneNumber count: " + phoneNumbers.length + " = " + phoneNumbers[i]);
+                Log.d("PhoneNumber count: " + phoneNumbers.length + " = "
+                        + phoneNumbers[i]);
                 contacts[i] = Uri.parse(phoneNumbers[i]);
             }
             return sMapProfile.sendMessage(device, contacts, message, mSentIntent,
@@ -159,14 +170,18 @@
 
     @Rpc(description = "Disconnect an MAP device.")
     public Boolean bluetoothMapClientDisconnect(
-            @RpcParameter(name = "deviceID", description = "Name or MAC address of a device.")
+            @RpcParameter(name = "deviceID",
+                    description = "Name or MAC address of a device.")
                     String deviceID)
             throws Exception {
         if (sMapProfile == null) return false;
-        List<BluetoothDevice> connectedMapDevices = sMapProfile.getConnectedDevices();
+        List<BluetoothDevice> connectedMapDevices =
+                sMapProfile.getConnectedDevices();
         Log.d("Connected map devices: " + connectedMapDevices);
-        BluetoothDevice mDevice = BluetoothFacade.getDevice(connectedMapDevices, deviceID);
-        if (!connectedMapDevices.isEmpty() && connectedMapDevices.get(0).equals(mDevice)) {
+        BluetoothDevice mDevice = BluetoothFacade.getDevice(
+                connectedMapDevices, deviceID);
+        if (!connectedMapDevices.isEmpty()
+                && connectedMapDevices.get(0).equals(mDevice)) {
             if (sMapProfile.getPriority(mDevice) > BluetoothProfile.PRIORITY_ON) {
                 sMapProfile.setPriority(mDevice, BluetoothProfile.PRIORITY_ON);
             }
@@ -198,10 +213,13 @@
             if (action.equals(BluetoothMapClient.ACTION_MESSAGE_RECEIVED)) {
                 mEventFacade.postEvent(MAP_EVENT,
                         intent.getStringExtra(android.content.Intent.EXTRA_TEXT));
-            } else if (action.equals(BluetoothMapClient.ACTION_MESSAGE_SENT_SUCCESSFULLY)) {
+            } else if (action.equals(
+                    BluetoothMapClient.ACTION_MESSAGE_SENT_SUCCESSFULLY)) {
                 mEventFacade.postEvent(MAP_SMS_SENT_SUCCESS,
-                        intent.getStringExtra(android.content.Intent.EXTRA_TEXT));
-            } else if (action.equals(BluetoothMapClient.ACTION_MESSAGE_DELIVERED_SUCCESSFULLY)) {
+                        intent.getStringExtra(
+                            android.content.Intent.EXTRA_TEXT));
+            } else if (action.equals(
+                    BluetoothMapClient.ACTION_MESSAGE_DELIVERED_SUCCESSFULLY)) {
                 mEventFacade.postEvent(MAP_SMS_DELIVER_SUCCESS,
                         intent.getStringExtra(android.content.Intent.EXTRA_TEXT));
             }
diff --git a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothMapFacade.java b/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothMapFacade.java
index 01c1bd4..e3fe007 100644
--- a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothMapFacade.java
+++ b/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothMapFacade.java
@@ -16,12 +16,10 @@
 
 package com.googlecode.android_scripting.facade.bluetooth;
 
-import java.util.List;
-
 import android.app.Service;
-import android.bluetooth.BluetoothMap;
 import android.bluetooth.BluetoothAdapter;
 import android.bluetooth.BluetoothDevice;
+import android.bluetooth.BluetoothMap;
 import android.bluetooth.BluetoothProfile;
 import android.bluetooth.BluetoothUuid;
 import android.os.ParcelUuid;
@@ -32,86 +30,114 @@
 import com.googlecode.android_scripting.rpc.Rpc;
 import com.googlecode.android_scripting.rpc.RpcParameter;
 
+import java.util.List;
+
 public class BluetoothMapFacade extends RpcReceiver {
-  static final ParcelUuid[] MAP_UUIDS = {
-      BluetoothUuid.MAP,
-      BluetoothUuid.MNS,
-      BluetoothUuid.MAS,
-  };
-  private final Service mService;
-  private final BluetoothAdapter mBluetoothAdapter;
+    static final ParcelUuid[] MAP_UUIDS = {
+        BluetoothUuid.MAP,
+        BluetoothUuid.MNS,
+        BluetoothUuid.MAS,
+    };
+    private final Service mService;
+    private final BluetoothAdapter mBluetoothAdapter;
 
-  private static boolean sIsMapReady = false;
-  private static BluetoothMap sMapProfile = null;
+    private static boolean sIsMapReady = false;
+    private static BluetoothMap sMapProfile = null;
 
-  public BluetoothMapFacade(FacadeManager manager) {
-    super(manager);
-    mService = manager.getService();
-    mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
-    mBluetoothAdapter.getProfileProxy(mService, new MapServiceListener(),
+    public BluetoothMapFacade(FacadeManager manager) {
+        super(manager);
+        mService = manager.getService();
+        mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
+        mBluetoothAdapter.getProfileProxy(mService, new MapServiceListener(),
         BluetoothProfile.MAP);
-  }
-
-  class MapServiceListener implements BluetoothProfile.ServiceListener {
-    @Override
-    public void onServiceConnected(int profile, BluetoothProfile proxy) {
-      sMapProfile = (BluetoothMap) proxy;
-      sIsMapReady = true;
     }
 
-    @Override
-    public void onServiceDisconnected(int profile) {
-      sIsMapReady = false;
-    }
-  }
-
-  public Boolean mapDisconnect(BluetoothDevice device) {
-    if (sMapProfile.getPriority(device) > BluetoothProfile.PRIORITY_ON) {
-      sMapProfile.setPriority(device, BluetoothProfile.PRIORITY_ON);
-    }
-    return sMapProfile.disconnect(device);
-  }
-
-  @Rpc(description = "Is Map profile ready.")
-  public Boolean bluetoothMapIsReady() {
-    return sIsMapReady;
-  }
-
-  @Rpc(description = "Disconnect an MAP device.")
-  public Boolean bluetoothMapDisconnect(
-      @RpcParameter(name = "deviceID", description = "Name or MAC address of a device.")
-      String deviceID)
-      throws Exception {
-    if (sMapProfile == null) return false;
-    List<BluetoothDevice> connectedMapDevices = sMapProfile.getConnectedDevices();
-    Log.d("Connected map devices: " + connectedMapDevices);
-    BluetoothDevice mDevice = BluetoothFacade.getDevice(connectedMapDevices, deviceID);
-    if (!connectedMapDevices.isEmpty() && connectedMapDevices.get(0).equals(mDevice)) {
-        if (sMapProfile.getPriority(mDevice) > BluetoothProfile.PRIORITY_ON) {
-            sMapProfile.setPriority(mDevice, BluetoothProfile.PRIORITY_ON);
+    class MapServiceListener implements BluetoothProfile.ServiceListener {
+        @Override
+        public void onServiceConnected(int profile, BluetoothProfile proxy) {
+            sMapProfile = (BluetoothMap) proxy;
+            sIsMapReady = true;
         }
-        return sMapProfile.disconnect(mDevice);
-    } else {
-        return false;
+
+        @Override
+        public void onServiceDisconnected(int profile) {
+            sIsMapReady = false;
+        }
     }
-  }
 
-  @Rpc(description = "Get all the devices connected through MAP.")
-  public List<BluetoothDevice> bluetoothMapGetConnectedDevices() {
-    while (!sIsMapReady);
-    return sMapProfile.getDevicesMatchingConnectionStates(
-          new int[] {BluetoothProfile.STATE_CONNECTED,
-                     BluetoothProfile.STATE_CONNECTING,
-                     BluetoothProfile.STATE_DISCONNECTING});
-  }
+    /**
+     * Disconnect Map Profile.
+     * @param device - the BluetoothDevice object to connect to.
+     * @return if the disconnection was successfull or not.
+     */
+    public Boolean mapDisconnect(BluetoothDevice device) {
+        if (sMapProfile.getPriority(device) > BluetoothProfile.PRIORITY_ON) {
+            sMapProfile.setPriority(device, BluetoothProfile.PRIORITY_ON);
+        }
+        return sMapProfile.disconnect(device);
+    }
 
-  @Rpc(description = "Get the currently connected remote Bluetooth device (PCE).")
-  public BluetoothDevice bluetoothMapGetClient() {
-    if (sMapProfile == null) { return null; }
-    return sMapProfile.getClient();
-  }
+    /**
+     * Is Map profile ready.
+     * @return if Map profile is ready or not.
+     */
+    @Rpc(description = "Is Map profile ready.")
+    public Boolean bluetoothMapIsReady() {
+    return sIsMapReady;
+    }
 
-  @Override
-  public void shutdown() {
-  }
+    /**
+     * Disconnect an MAP device.
+     * @param deviceID - Name or MAC address of a bluetooth device.
+     * @return True if the disconnection was successful; otherwise False.
+     */
+    @Rpc(description = "Disconnect an MAP device.")
+    public Boolean bluetoothMapDisconnect(
+            @RpcParameter(name = "deviceID",
+                description = "Name or MAC address of a device.")
+                    String deviceID) throws Exception {
+        if (sMapProfile == null) return false;
+        List<BluetoothDevice> connectedMapDevices =
+                sMapProfile.getConnectedDevices();
+        Log.d("Connected map devices: " + connectedMapDevices);
+        BluetoothDevice mDevice = BluetoothFacade.getDevice(connectedMapDevices, deviceID);
+        if (!connectedMapDevices.isEmpty()
+                && connectedMapDevices.get(0).equals(mDevice)) {
+            if (sMapProfile.getPriority(mDevice)
+                    > BluetoothProfile.PRIORITY_ON) {
+                sMapProfile.setPriority(mDevice, BluetoothProfile.PRIORITY_ON);
+            }
+            return sMapProfile.disconnect(mDevice);
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * Get all the devices connected through MAP.
+     * @return List of all the devices connected through MAP.
+     */
+    @Rpc(description = "Get all the devices connected through MAP.")
+    public List<BluetoothDevice> bluetoothMapGetConnectedDevices() {
+        if (!sIsMapReady) return null;
+        return sMapProfile.getDevicesMatchingConnectionStates(
+                new int[] {BluetoothProfile.STATE_CONNECTED,
+                    BluetoothProfile.STATE_CONNECTING,
+                    BluetoothProfile.STATE_DISCONNECTING});
+    }
+
+    /**
+     * Get the currently connected remote Bluetooth device (PCE).
+     * @return remote Bluetooth device which is currently conencted.
+     */
+    @Rpc(description =
+            "Get the currently connected remote Bluetooth device (PCE).")
+    public BluetoothDevice bluetoothMapGetClient() {
+        if (sMapProfile == null) return null;
+        return sMapProfile.getClient();
+    }
+
+    @Override
+    public void shutdown() {
+    }
 }
diff --git a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothMediaFacade.java b/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothMediaFacade.java
index c179b63..404a791 100644
--- a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothMediaFacade.java
+++ b/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothMediaFacade.java
@@ -17,27 +17,25 @@
 package com.googlecode.android_scripting.facade.bluetooth;
 
 import android.app.Service;
-import android.content.Intent;
 import android.content.ComponentName;
 import android.content.Context;
-
+import android.content.Intent;
 import android.media.MediaMetadata;
-import android.media.session.MediaSessionManager;
-import android.media.session.PlaybackState;
 import android.media.browse.MediaBrowser;
 import android.media.session.MediaController;
-
+import android.media.session.MediaSessionManager;
+import android.media.session.PlaybackState;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Looper;
 
+import com.googlecode.android_scripting.Log;
 import com.googlecode.android_scripting.facade.EventFacade;
 import com.googlecode.android_scripting.facade.FacadeManager;
 import com.googlecode.android_scripting.facade.bluetooth.media.BluetoothSL4AAudioSrcMBS;
 import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
 import com.googlecode.android_scripting.rpc.Rpc;
 import com.googlecode.android_scripting.rpc.RpcParameter;
-import com.googlecode.android_scripting.Log;
 
 import java.util.ArrayList;
 import java.util.HashMap;
diff --git a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothPairingHelper.java b/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothPairingHelper.java
index 18def70..597b17a 100644
--- a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothPairingHelper.java
+++ b/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothPairingHelper.java
@@ -23,106 +23,128 @@
 import android.os.Bundle;
 
 import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.facade.EventFacade;
 import com.googlecode.android_scripting.event.Event;
+import com.googlecode.android_scripting.facade.EventFacade;
 
 public class BluetoothPairingHelper extends BroadcastReceiver {
-  private final EventFacade mEventFacade;
-  private static final int DEFAULT_TIMEOUT_MS = 5000;
-  private boolean mAutoConfirm = true;
+    private final EventFacade mEventFacade;
+    private static final int DEFAULT_TIMEOUT_MS = 5000;
+    private boolean mAutoConfirm = true;
 
-  public BluetoothPairingHelper(EventFacade eventFacade) {
-    super();
-    mEventFacade = eventFacade;
-    Log.d("Pairing helper created.");
-  }
+    public BluetoothPairingHelper(EventFacade eventFacade) {
+        super();
+        mEventFacade = eventFacade;
+        Log.d("Pairing helper created.");
+    }
+
   /**
    *  Confirms bluetooth connection/bonding requests.
    */
-  @Override
-  public void onReceive(Context c, Intent intent) {
-    String action = intent.getAction();
-    Bundle result = new Bundle();
-    Log.d("Bluetooth pairing intent received: " + action);
-    BluetoothDevice mDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
-    if(action.equals(BluetoothDevice.ACTION_PAIRING_REQUEST)) {
-      mDevice.setMessageAccessPermission(BluetoothDevice.ACCESS_ALLOWED);
-      mDevice.setPhonebookAccessPermission(BluetoothDevice.ACCESS_ALLOWED);
-      int type = intent.getIntExtra(BluetoothDevice.EXTRA_PAIRING_VARIANT, BluetoothDevice.ERROR);
-      Log.d("Processing Action Paring Request with type " + type);
-      int pin = intent.getIntExtra(BluetoothDevice.EXTRA_PAIRING_KEY,0);
-      String deviceAddress = mDevice.getAddress();
-      result.putInt("Pin", pin);
-      result.putInt("PairingVariant", type);
-      result.putString("DeviceAddress", deviceAddress);
-      mEventFacade.postEvent("BluetoothActionPairingRequest", result.clone());
-      result.clear();
-      if(type == BluetoothDevice.PAIRING_VARIANT_CONSENT) {
-        mDevice.setPairingConfirmation(true);
-        Log.d("Connection auto-confirmed by consent");
-        abortBroadcast(); // Abort the broadcast so Settings app doesn't get it.
-      } else if (type == BluetoothDevice.PAIRING_VARIANT_PASSKEY_CONFIRMATION) {
-        if (mAutoConfirm) {
-           mDevice.setPairingConfirmation(true);
-          Log.d("Connection auto-confirmed");
-        } else {
-          // Wait for confirmation
-          Event userConfirmEvent = null;
-          try {
-            userConfirmEvent = mEventFacade.eventWaitFor(
-              "BluetoothActionPairingRequestUserConfirm",
-              true, DEFAULT_TIMEOUT_MS);
-          } catch (InterruptedException e) {
-            Log.d("Connection interrupted");
-            userConfirmEvent = null;
-          }
-          if (userConfirmEvent == null) {
-            Log.d("Null response received from test server or timeout");
-            mDevice.setPairingConfirmation(false);
-          } else {
-            String userConfirmEventData = (String) userConfirmEvent.getData();
-            if (userConfirmEventData.equalsIgnoreCase("True")) {
-              mDevice.setPairingConfirmation(true);
-              Log.d("Connection confirmed");
-            } else {
-              mDevice.setPairingConfirmation(false);
-              Log.d("Connection rejected");
+    @Override
+    public void onReceive(Context c, Intent intent) {
+        String action = intent.getAction();
+        Bundle result = new Bundle();
+        Log.d("Bluetooth pairing intent received: " + action);
+        BluetoothDevice mDevice = intent.getParcelableExtra(
+                BluetoothDevice.EXTRA_DEVICE);
+        if (action.equals(BluetoothDevice.ACTION_PAIRING_REQUEST)) {
+            mDevice.setMessageAccessPermission(BluetoothDevice.ACCESS_ALLOWED);
+            mDevice.setPhonebookAccessPermission(
+                    BluetoothDevice.ACCESS_ALLOWED);
+            int type = intent.getIntExtra(
+                    BluetoothDevice.EXTRA_PAIRING_VARIANT,
+                        BluetoothDevice.ERROR);
+            Log.d("Processing Action Paring Request with type " + type);
+            int pin = intent.getIntExtra(BluetoothDevice.EXTRA_PAIRING_KEY, 0);
+            String deviceAddress = mDevice.getAddress();
+            result.putInt("Pin", pin);
+            result.putInt("PairingVariant", type);
+            result.putString("DeviceAddress", deviceAddress);
+            mEventFacade.postEvent("BluetoothActionPairingRequest",
+                    result.clone());
+            result.clear();
+            if (type == BluetoothDevice.PAIRING_VARIANT_CONSENT) {
+                mDevice.setPairingConfirmation(true);
+                Log.d("Connection auto-confirmed by consent");
+                // Abort the broadcast so Settings app doesn't get it.
+                abortBroadcast();
+            } else if (type
+                    == BluetoothDevice.PAIRING_VARIANT_PASSKEY_CONFIRMATION) {
+                if (mAutoConfirm) {
+                    mDevice.setPairingConfirmation(true);
+                    Log.d("Connection auto-confirmed");
+                } else {
+                    // Wait for confirmation
+                    Event userConfirmEvent = null;
+                    try {
+                        userConfirmEvent = mEventFacade.eventWaitFor(
+                                "BluetoothActionPairingRequestUserConfirm",
+                                     true, DEFAULT_TIMEOUT_MS);
+                    } catch (InterruptedException e) {
+                        Log.d("Connection interrupted");
+                        userConfirmEvent = null;
+                    }
+                    if (userConfirmEvent == null) {
+                        Log.d("Null response received from test server or timeout");
+                        mDevice.setPairingConfirmation(false);
+                    } else {
+                        String userConfirmEventData =
+                                (String) userConfirmEvent.getData();
+                        if (userConfirmEventData.equalsIgnoreCase("True")) {
+                            mDevice.setPairingConfirmation(true);
+                            Log.d("Connection confirmed");
+                        } else {
+                            mDevice.setPairingConfirmation(false);
+                            Log.d("Connection rejected");
+                        }
+                    }
+                }
+                // Abort the broadcast so Settings app doesn't get it.
+                abortBroadcast();
             }
-          }
+        } else if (action.equals(
+                BluetoothDevice.ACTION_CONNECTION_ACCESS_REQUEST)) {
+            int type = intent.getIntExtra(
+                    BluetoothDevice.EXTRA_ACCESS_REQUEST_TYPE,
+                        BluetoothDevice.ERROR);
+            Log.d("Processing Action Connection Access Request type " + type);
+            if (type == BluetoothDevice.REQUEST_TYPE_MESSAGE_ACCESS
+                    || type == BluetoothDevice.REQUEST_TYPE_PHONEBOOK_ACCESS
+                        || type
+                            == BluetoothDevice.REQUEST_TYPE_PROFILE_CONNECTION) {
+                Intent newIntent =
+                        new Intent(
+                            BluetoothDevice.ACTION_CONNECTION_ACCESS_REPLY);
+                String mReturnPackage =
+                        intent.getStringExtra(
+                        BluetoothDevice.EXTRA_PACKAGE_NAME);
+                String mReturnClass =
+                        intent.getStringExtra(BluetoothDevice.EXTRA_CLASS_NAME);
+                int mRequestType =
+                        intent.getIntExtra(
+                            BluetoothDevice.EXTRA_ACCESS_REQUEST_TYPE,
+                                BluetoothDevice.REQUEST_TYPE_MESSAGE_ACCESS);
+                if (mReturnPackage != null && mReturnClass != null) {
+                    newIntent.setClassName(mReturnPackage, mReturnClass);
+                }
+                newIntent.putExtra(BluetoothDevice.EXTRA_CONNECTION_ACCESS_RESULT,
+                        BluetoothDevice.CONNECTION_ACCESS_YES);
+                newIntent.putExtra(BluetoothDevice.EXTRA_ALWAYS_ALLOWED, true);
+                newIntent.putExtra(BluetoothDevice.EXTRA_DEVICE, mDevice);
+                newIntent.putExtra(BluetoothDevice.EXTRA_ACCESS_REQUEST_TYPE,
+                        mRequestType);
+                Log.d("Sending connection access acceptance intent.");
+                abortBroadcast();
+                c.sendBroadcast(newIntent,
+                        android.Manifest.permission.BLUETOOTH_ADMIN);
+            }
         }
-        abortBroadcast(); // Abort the broadcast so Settings app doesn't get it.
-      }
     }
-    else if(action.equals(BluetoothDevice.ACTION_CONNECTION_ACCESS_REQUEST)) {
-      int type = intent.getIntExtra(BluetoothDevice.EXTRA_ACCESS_REQUEST_TYPE, BluetoothDevice.ERROR);
-      Log.d("Processing Action Connection Access Request type " + type);
-      if(type == BluetoothDevice.REQUEST_TYPE_MESSAGE_ACCESS ||
-         type == BluetoothDevice.REQUEST_TYPE_PHONEBOOK_ACCESS ||
-         type == BluetoothDevice.REQUEST_TYPE_PROFILE_CONNECTION) {
-    	  Intent newIntent = new Intent(BluetoothDevice.ACTION_CONNECTION_ACCESS_REPLY);
-    	  String mReturnPackage = intent.getStringExtra(BluetoothDevice.EXTRA_PACKAGE_NAME);
-          String mReturnClass = intent.getStringExtra(BluetoothDevice.EXTRA_CLASS_NAME);
-          int mRequestType = intent.getIntExtra(BluetoothDevice.EXTRA_ACCESS_REQUEST_TYPE,
-                  BluetoothDevice.REQUEST_TYPE_MESSAGE_ACCESS);
-          if (mReturnPackage != null && mReturnClass != null) {
-              newIntent.setClassName(mReturnPackage, mReturnClass);
-          }
-    	  newIntent.putExtra(BluetoothDevice.EXTRA_CONNECTION_ACCESS_RESULT,
-    			             BluetoothDevice.CONNECTION_ACCESS_YES);
-          newIntent.putExtra(BluetoothDevice.EXTRA_ALWAYS_ALLOWED, true);
-    	  newIntent.putExtra(BluetoothDevice.EXTRA_DEVICE, mDevice);
-    	  newIntent.putExtra(BluetoothDevice.EXTRA_ACCESS_REQUEST_TYPE, mRequestType);
-          Log.d("Sending connection access acceptance intent.");
-          abortBroadcast();
-          c.sendBroadcast(newIntent, android.Manifest.permission.BLUETOOTH_ADMIN);
-      }
-    }
-  }
 
-  /**
-   * Set autoConfirm flag to Value
-   */
-  public synchronized void setAutoConfirm(boolean value) {
-    mAutoConfirm = value;
-  }
+    /**
+     * Set autoConfirm flag to Value.
+     */
+    public synchronized void setAutoConfirm(boolean value) {
+        mAutoConfirm = value;
+    }
 }
diff --git a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothPanFacade.java b/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothPanFacade.java
index 0a1235a..14357ed 100644
--- a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothPanFacade.java
+++ b/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothPanFacade.java
@@ -16,8 +16,6 @@
 
 package com.googlecode.android_scripting.facade.bluetooth;
 
-import java.util.List;
-
 import android.app.Service;
 import android.bluetooth.BluetoothAdapter;
 import android.bluetooth.BluetoothDevice;
@@ -31,6 +29,8 @@
 import com.googlecode.android_scripting.rpc.Rpc;
 import com.googlecode.android_scripting.rpc.RpcParameter;
 
+import java.util.List;
+
 public class BluetoothPanFacade extends RpcReceiver {
 
     static final ParcelUuid[] UUIDS = {
@@ -49,7 +49,7 @@
         mService = manager.getService();
         mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
         mBluetoothAdapter.getProfileProxy(mService, new PanServiceListener(),
-            BluetoothProfile.PAN);
+                BluetoothProfile.PAN);
     }
 
     class PanServiceListener implements BluetoothProfile.ServiceListener {
diff --git a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothPbapClientFacade.java b/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothPbapClientFacade.java
index 7a0a769..e1c20cd 100644
--- a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothPbapClientFacade.java
+++ b/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothPbapClientFacade.java
@@ -16,13 +16,10 @@
 
 package com.googlecode.android_scripting.facade.bluetooth;
 
-import java.util.List;
-import java.util.ArrayList;
-
 import android.app.Service;
-import android.bluetooth.BluetoothPbapClient;
 import android.bluetooth.BluetoothAdapter;
 import android.bluetooth.BluetoothDevice;
+import android.bluetooth.BluetoothPbapClient;
 import android.bluetooth.BluetoothProfile;
 import android.bluetooth.BluetoothUuid;
 import android.os.ParcelUuid;
@@ -33,138 +30,196 @@
 import com.googlecode.android_scripting.rpc.Rpc;
 import com.googlecode.android_scripting.rpc.RpcParameter;
 
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * BluetoothPbapClientFacade
+ */
 public class BluetoothPbapClientFacade extends RpcReceiver {
-  static final ParcelUuid[] UUIDS = {
-    BluetoothUuid.PBAP_PSE,
-  };
+    static final ParcelUuid[] UUIDS = {
+        BluetoothUuid.PBAP_PSE,
+    };
 
-  private final Service mService;
-  private final BluetoothAdapter mBluetoothAdapter;
+    private final Service mService;
+    private final BluetoothAdapter mBluetoothAdapter;
 
-  private static boolean sIsPbapClientReady = false;
-  private static BluetoothPbapClient sPbapClientProfile = null;
+    private static boolean sIsPbapClientReady = false;
+    private static BluetoothPbapClient sPbapClientProfile = null;
 
-  public BluetoothPbapClientFacade(FacadeManager manager) {
-    super(manager);
-    mService = manager.getService();
-    mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
-    mBluetoothAdapter.getProfileProxy(mService, new PbapClientServiceListener(),
-        BluetoothProfile.PBAP_CLIENT);
-  }
-
-  class PbapClientServiceListener implements BluetoothProfile.ServiceListener {
-    @Override
-    public void onServiceConnected(int profile, BluetoothProfile proxy) {
-      sPbapClientProfile = (BluetoothPbapClient) proxy;
-      sIsPbapClientReady = true;
+    public BluetoothPbapClientFacade(FacadeManager manager) {
+        super(manager);
+        mService = manager.getService();
+        mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
+        mBluetoothAdapter.getProfileProxy(mService,
+                new PbapClientServiceListener(), BluetoothProfile.PBAP_CLIENT);
     }
 
-    @Override
-    public void onServiceDisconnected(int profile) {
-      sIsPbapClientReady = false;
+    class PbapClientServiceListener implements
+            BluetoothProfile.ServiceListener {
+        @Override
+        public void onServiceConnected(int profile, BluetoothProfile proxy) {
+            sPbapClientProfile = (BluetoothPbapClient) proxy;
+            sIsPbapClientReady = true;
+        }
+
+        @Override
+        public void onServiceDisconnected(int profile) {
+            sIsPbapClientReady = false;
+        }
     }
-  }
 
-  public Boolean pbapClientConnect(BluetoothDevice device) {
-    if (sPbapClientProfile == null) return false;
-    return sPbapClientProfile.connect(device);
-  }
+    /**
+     * Connect PbapClient profile.
+     * @param device - the BluetoothDevice object to connect to.
+     * @return if the connection was successfull or not.
+     */
+    public Boolean pbapClientConnect(BluetoothDevice device) {
+        if (sPbapClientProfile == null) return false;
+        return sPbapClientProfile.connect(device);
+    }
 
-  public Boolean pbapClientDisconnect(BluetoothDevice device) {
-    if (sPbapClientProfile == null) return false;
-    return sPbapClientProfile.disconnect(device);
-  }
+    /**
+     * Disconnect PbapClient profile.
+     * @param device - the Bluetooth Device object to disconnect from.
+     * @return if the disconnection was successfull or not.
+     */
+    public Boolean pbapClientDisconnect(BluetoothDevice device) {
+        if (sPbapClientProfile == null) return false;
+        return sPbapClientProfile.disconnect(device);
+    }
 
-  @Rpc(description = "Is PbapClient profile ready.")
-  public Boolean bluetoothPbapClientIsReady() {
-    return sIsPbapClientReady;
-  }
+    /**
+     * Is PbapClient profile ready.
+     * @return if PbapClient profile is ready or not.
+     */
+    @Rpc(description = "Is PbapClient profile ready.")
+    public Boolean bluetoothPbapClientIsReady() {
+        return sIsPbapClientReady;
+    }
 
-  @Rpc(description = "Set priority of the profile")
-  public void bluetoothPbapClientSetPriority(
-      @RpcParameter(name = "device", description = "Mac address of a BT device.")
-      String deviceStr,
-      @RpcParameter(name = "priority", description = "Priority that needs to be set.")
-      Integer priority)
-      throws Exception {
-    if (sPbapClientProfile == null) return;
-    BluetoothDevice device =
-        BluetoothFacade.getDevice(mBluetoothAdapter.getBondedDevices(), deviceStr);
-    Log.d("Changing priority of device " + device.getAliasName() + " p: " + priority);
-    sPbapClientProfile.setPriority(device, priority);
-  }
+    /**
+     * Set priority of the profile.
+     * @param deviceStr - name or MAC address of a Bluetooth device.
+     * @param priority - Priority that needs to be set.
+     */
+    @Rpc(description = "Set priority of the profile")
+    public void bluetoothPbapClientSetPriority(@RpcParameter(name = "device",
+                description = "Mac address of a BT device.") String deviceStr,
+            @RpcParameter(name = "priority",
+                description = "Priority that needs to be set.")
+                Integer priority) throws Exception {
+        if (sPbapClientProfile == null) return;
+        BluetoothDevice device =
+                BluetoothFacade.getDevice(mBluetoothAdapter.getBondedDevices(),
+                deviceStr);
+        Log.d("Changing priority of device " + device.getAliasName()
+                + " p: " + priority);
+        sPbapClientProfile.setPriority(device, priority);
+    }
 
-  @Rpc(description = "Get priority of the profile")
-  public Integer bluetoothPbapClientGetPriority(
-      @RpcParameter(name = "device", description = "Mac address of a BT device.")
-      String deviceStr)
-      throws Exception {
-    if (sPbapClientProfile == null) return BluetoothProfile.PRIORITY_UNDEFINED;
-    BluetoothDevice device =
-        BluetoothFacade.getDevice(mBluetoothAdapter.getBondedDevices(), deviceStr);
-    return sPbapClientProfile.getPriority(device);
-  }
+    /**
+     * Get priority of the profile.
+     * @return Priority of the device.
+     */
+    @Rpc(description = "Get priority of the profile")
+    public Integer bluetoothPbapClientGetPriority(
+            @RpcParameter(name = "device",
+                description = "Mac address of a BT device.") String deviceStr)
+                throws Exception {
+        if (sPbapClientProfile == null) {
+            return BluetoothProfile.PRIORITY_UNDEFINED;
+        }
+        BluetoothDevice device =
+                BluetoothFacade.getDevice(mBluetoothAdapter.getBondedDevices(),
+                    deviceStr);
+        return sPbapClientProfile.getPriority(device);
+    }
 
-  @Rpc(description = "Connect to an PBAP Client device.")
-  public Boolean bluetoothPbapClientConnect(
-      @RpcParameter(name = "device", description = "Name or MAC address of a bluetooth device.")
-      String deviceStr)
-      throws Exception {
-    if (sPbapClientProfile == null) return false;
-    try {
-      BluetoothDevice device =
-          BluetoothFacade.getDevice(mBluetoothAdapter.getBondedDevices(), deviceStr);
-      Log.d("Connecting to device " + device.getAliasName());
-      return pbapClientConnect(device);
-    } catch (Exception e) {
-        Log.e("bluetoothPbapClientConnect failed on getDevice " + deviceStr + " with " + e);
+    /**
+     * Connect to an PBAP Client device.
+     * @param deviceStr - Name or MAC address of a bluetooth device.
+     * @return True if the connection was successful; otherwise False.
+     */
+    @Rpc(description = "Connect to an PBAP Client device.")
+    public Boolean bluetoothPbapClientConnect(
+                @RpcParameter(name = "device",
+                    description = "Name or MAC address of a bluetooth device.")
+                    String deviceStr) throws Exception {
+        if (sPbapClientProfile == null) return false;
+        try {
+            BluetoothDevice device =
+                    BluetoothFacade.getDevice(
+                            mBluetoothAdapter.getBondedDevices(), deviceStr);
+            Log.d("Connecting to device " + device.getAliasName());
+            return pbapClientConnect(device);
+        } catch (Exception e) {
+            Log.e("bluetoothPbapClientConnect failed on getDevice "
+                    + deviceStr + " with " + e);
+            return false;
+        }
+    }
+
+    /**
+     * Disconnect an PBAP Client device.
+     * @param deviceStr - Name or MAC address of a bluetooth device.
+     * @return True if the disconnection was successful; otherwise False.
+     */
+    @Rpc(description = "Disconnect an PBAP Client device.")
+    public Boolean bluetoothPbapClientDisconnect(
+            @RpcParameter(name = "device",
+                description = "Name or MAC address of a device.")
+                String deviceStr) {
+        if (sPbapClientProfile == null) return false;
+        Log.d("Connected devices: " + sPbapClientProfile.getConnectedDevices());
+        try {
+            BluetoothDevice device =
+                    BluetoothFacade.getDevice(
+                        sPbapClientProfile.getConnectedDevices(), deviceStr);
+            return pbapClientDisconnect(device);
+        } catch (Exception e) {
+            // Do nothing since it is disconnect and the above call
+            // should force disconnect.
+            Log.e("bluetoothPbapClientConnect getDevice failed " + e);
+        }
         return false;
     }
-  }
 
-  @Rpc(description = "Disconnect an PBAP Client device.")
-  public Boolean bluetoothPbapClientDisconnect(
-      @RpcParameter(name = "device", description = "Name or MAC address of a device.")
-      String deviceStr) {
-    if (sPbapClientProfile == null) return false;
-    Log.d("Connected devices: " + sPbapClientProfile.getConnectedDevices());
-    try {
-        BluetoothDevice device =
-            BluetoothFacade.getDevice(sPbapClientProfile.getConnectedDevices(), deviceStr);
-        return pbapClientDisconnect(device);
-    } catch (Exception e) {
-        // Do nothing since it is disconnect and the above call should force disconnect.
-        Log.e("bluetoothPbapClientConnect getDevice failed " + e);
+    /**
+     * Get all the devices connected through PBAP Client.
+     * @return List of all the devices connected through PBAP client.
+     */
+    @Rpc(description = "Get all the devices connected through PBAP Client.")
+    public List<BluetoothDevice> bluetoothPbapClientGetConnectedDevices() {
+        if (sPbapClientProfile == null) return new ArrayList<BluetoothDevice>();
+        return sPbapClientProfile.getConnectedDevices();
     }
-    return false;
-  }
 
-  @Rpc(description = "Get all the devices connected through PBAP Client.")
-  public List<BluetoothDevice> bluetoothPbapClientGetConnectedDevices() {
-    if (sPbapClientProfile == null) return new ArrayList<BluetoothDevice>();
-    return sPbapClientProfile.getConnectedDevices();
-  }
+     /**
+     * Get the connection status of a device.
+     * @return connection status of the device.
+     */
+    @Rpc(description = "Get the connection status of a device.")
+    public Integer bluetoothPbapClientGetConnectionStatus(
+            @RpcParameter(name = "deviceID",
+            description = "Name or MAC address of a bluetooth device.")
+            String deviceID) {
+        if (sPbapClientProfile == null) {
+            return BluetoothProfile.STATE_DISCONNECTED;
+        }
+        List<BluetoothDevice> deviceList =
+                sPbapClientProfile.getConnectedDevices();
+        BluetoothDevice device;
+        try {
+            device = BluetoothFacade.getDevice(deviceList, deviceID);
+        } catch (Exception e) {
+            Log.e(e);
+            return BluetoothProfile.STATE_DISCONNECTED;
+        }
+        return sPbapClientProfile.getConnectionState(device);
+    }
 
-  @Rpc(description = "Get the connection status of a device.")
-  public Integer bluetoothPbapClientGetConnectionStatus(
-          @RpcParameter(name = "deviceID",
-                        description = "Name or MAC address of a bluetooth device.")
-          String deviceID) {
-      if (sPbapClientProfile == null) {
-          return BluetoothProfile.STATE_DISCONNECTED;
-      }
-      List<BluetoothDevice> deviceList = sPbapClientProfile.getConnectedDevices();
-      BluetoothDevice device;
-      try {
-          device = BluetoothFacade.getDevice(deviceList, deviceID);
-      } catch (Exception e) {
-          Log.e(e);
-          return BluetoothProfile.STATE_DISCONNECTED;
-      }
-      return sPbapClientProfile.getConnectionState(device);
-  }
-
-  @Override
-  public void shutdown() {
-  }
+    @Override
+    public void shutdown() {
+    }
 }
