diff --git a/Common/src/com/googlecode/android_scripting/facade/bluetooth/GattClientFacade.java b/Common/src/com/googlecode/android_scripting/facade/bluetooth/GattClientFacade.java
index 3a1c907..41c672a 100644
--- a/Common/src/com/googlecode/android_scripting/facade/bluetooth/GattClientFacade.java
+++ b/Common/src/com/googlecode/android_scripting/facade/bluetooth/GattClientFacade.java
@@ -495,7 +495,7 @@
         @RpcParameter(name = "serviceIndex") Integer serviceIndex,
         @RpcParameter(name = "characteristicUuid") String characteristicUuid,
         @RpcParameter(name = "descriptorUuid") String descriptorUuid,
-        @RpcParameter(name = "value") String value) throws Exception {
+        @RpcParameter(name = "value") byte[] value) throws Exception {
       if (mBluetoothGattList.get(gattIndex) == null) {
         throw new Exception("Invalid gattIndex " + gattIndex);
       }
@@ -518,8 +518,7 @@
       if (gattDescriptor == null) {
         throw new Exception("Invalid descriptor uuid: " + descriptorUuid);
       }
-        byte[] byteArray = ConvertUtils.convertStringToByteArray(value);
-        return gattDescriptor.setValue(byteArray);
+      return gattDescriptor.setValue(value);
     }
 
     /**
@@ -572,7 +571,7 @@
         @RpcParameter(name = "discoveredServiceListIndex") Integer discoveredServiceListIndex,
         @RpcParameter(name = "serviceIndex") Integer serviceIndex,
         @RpcParameter(name = "characteristicUuid") String characteristicUuid,
-        @RpcParameter(name = "value") String value) throws Exception {
+        @RpcParameter(name = "value") byte[] value) throws Exception {
       if (mBluetoothGattList.get(gattIndex) == null) {
         throw new Exception("Invalid gattIndex " + gattIndex);
       }
@@ -590,9 +589,47 @@
       if (gattCharacteristic == null) {
         throw new Exception("Invalid characteristic uuid: " + characteristicUuid);
       }
-      byte[] byteArray = ConvertUtils.convertStringToByteArray(value);
-      return gattCharacteristic.setValue(byteArray);
+      return gattCharacteristic.setValue(value);
     }
+
+    /**
+     * Set write type to a discovered characteristic.
+     * @param gattIndex - the gatt index to use
+     * @param discoveredServiceListIndex - the discovered service list index
+     * @param serviceIndex - the service index of the discoveredServiceListIndex
+     * @param characteristicUuid - the characteristic uuid in which the descriptor is
+     * @param writeType - the write type for characteristic
+     * @return true, if the value was set to the characteristic
+     * @throws Exception
+     */
+    @Rpc(description = "Set write type of a given characteristic to the associated remote device")
+    public boolean gattClientCharacteristicSetWriteType(
+        @RpcParameter(name = "gattIndex") Integer gattIndex,
+        @RpcParameter(name = "discoveredServiceListIndex") Integer discoveredServiceListIndex,
+        @RpcParameter(name = "serviceIndex") Integer serviceIndex,
+        @RpcParameter(name = "characteristicUuid") String characteristicUuid,
+        @RpcParameter(name = "writeType") Integer writeType) throws Exception {
+      if (mBluetoothGattList.get(gattIndex) == null) {
+        throw new Exception("Invalid gattIndex " + gattIndex);
+      }
+      List<BluetoothGattService> discoveredServiceList =
+          mBluetoothGattDiscoveredServicesList.get(discoveredServiceListIndex);
+      if (discoveredServiceList == null) {
+        throw new Exception("Invalid discoveredServiceListIndex " + discoveredServiceListIndex);
+      }
+      BluetoothGattService gattService = discoveredServiceList.get(serviceIndex);
+      if (gattService == null) {
+        throw new Exception("Invalid serviceIndex " + serviceIndex);
+      }
+      UUID cUuid = UUID.fromString(characteristicUuid);
+      BluetoothGattCharacteristic gattCharacteristic = gattService.getCharacteristic(cUuid);
+      if (gattCharacteristic == null) {
+        throw new Exception("Invalid characteristic uuid: " + characteristicUuid);
+      }
+      gattCharacteristic.setWriteType(writeType);
+      return true;
+    }
+
     /**
      * Read the RSSI for a connected remote device
      *
@@ -879,6 +916,7 @@
             Log.d("gatt_connect change onCharacteristicRead " + mEventType + " " + index);
             mResults.putInt("Status", status);
             mResults.putString("CharacteristicUuid", characteristic.getUuid().toString());
+            mResults.putByteArray("CharacteristicValue", characteristic.getValue());
             mEventFacade
                     .postEvent(mEventType + index + "onCharacteristicRead", mResults.clone());
             mResults.clear();
@@ -890,6 +928,7 @@
             Log.d("gatt_connect change onCharacteristicWrite " + mEventType + " " + index);
             mResults.putInt("Status", status);
             mResults.putString("CharacteristicUuid", characteristic.getUuid().toString());
+            mResults.putByteArray("CharacteristicValue", characteristic.getValue());
             mEventFacade
                     .postEvent(mEventType + index + "onCharacteristicWrite", mResults.clone());
             mResults.clear();
@@ -901,6 +940,7 @@
             Log.d("gatt_connect change onCharacteristicChanged " + mEventType + " " + index);
             mResults.putInt("ID", index);
             mResults.putString("CharacteristicUuid", characteristic.getUuid().toString());
+            mResults.putByteArray("CharacteristicValue", characteristic.getValue());
             mEventFacade
                     .postEvent(mEventType + index + "onCharacteristicChanged", mResults.clone());
             mResults.clear();
diff --git a/Common/src/com/googlecode/android_scripting/facade/bluetooth/GattServerFacade.java b/Common/src/com/googlecode/android_scripting/facade/bluetooth/GattServerFacade.java
index df03fe2..66f8b7c 100644
--- a/Common/src/com/googlecode/android_scripting/facade/bluetooth/GattServerFacade.java
+++ b/Common/src/com/googlecode/android_scripting/facade/bluetooth/GattServerFacade.java
@@ -129,6 +129,22 @@
   }
 
   /**
+   * Add a service to a bluetooth gatt server
+   *
+   * @param index the bluetooth gatt server to add a service to
+   * @param serviceIndex the service to add to the bluetooth gatt server
+   * @throws Exception
+   */
+  @Rpc(description = "Clear services from bluetooth gatt server")
+  public void gattServerClearServices(@RpcParameter(name = "index") Integer index) throws Exception {
+    if (mBluetoothGattServerList.get(index) != null) {
+        mBluetoothGattServerList.get(index).clearServices();
+    } else {
+      throw new Exception("Invalid index input:" + Integer.toString(index));
+    }
+  }
+
+  /**
    * Get connected devices of the gatt server
    *
    * @param gattServerIndex the gatt server index
@@ -163,7 +179,7 @@
       @RpcParameter(name = "bluetoothDeviceIndex") Integer bluetoothDeviceIndex,
       @RpcParameter(name = "requestId") Integer requestId,
       @RpcParameter(name = "status") Integer status, @RpcParameter(name = "offset") Integer offset,
-      @RpcParameter(name = "value") String value) throws Exception {
+      @RpcParameter(name = "value") byte[] value) throws Exception {
 
     BluetoothGattServer gattServer = mBluetoothGattServerList.get(gattServerIndex);
     if (gattServer == null)
@@ -176,8 +192,43 @@
     if (bluetoothDevice == null)
       throw new Exception(
           "Invalid bluetoothDeviceIndex: " + Integer.toString(bluetoothDeviceIndex));
-    gattServer.sendResponse(bluetoothDevice, requestId, status, offset,
-        ConvertUtils.convertStringToByteArray(value));
+    gattServer.sendResponse(bluetoothDevice, requestId, status, offset, value);
+  }
+
+  /**
+   * Notify that characteristic was changed
+   *
+   * @param gattServerIndex the gatt server index
+   * @param bluetoothDeviceIndex the remotely connected bluetooth device
+   * @param characteristicIndex characteristic index
+   * @param confirm shall we expect confirmation
+   * @throws Exception
+   */
+  @Rpc(description = "Notify that characteristic was changed.")
+  public void gattServerNotifyCharacteristicChanged(
+      @RpcParameter(name = "gattServerIndex") Integer gattServerIndex,
+      @RpcParameter(name = "bluetoothDeviceIndex") Integer bluetoothDeviceIndex,
+      @RpcParameter(name = "characteristicIndex") Integer characteristicIndex,
+      @RpcParameter(name = "confirm") Boolean confirm) throws Exception {
+
+    BluetoothGattServer gattServer = mBluetoothGattServerList.get(gattServerIndex);
+    if (gattServer == null)
+      throw new Exception("Invalid gattServerIndex: " + Integer.toString(gattServerIndex));
+    List<BluetoothDevice> connectedDevices = mGattServerDiscoveredDevicesList.get(gattServerIndex);
+    if (connectedDevices == null)
+      throw new Exception(
+          "Connected device list empty for gattServerIndex:" + Integer.toString(gattServerIndex));
+    BluetoothDevice bluetoothDevice = connectedDevices.get(bluetoothDeviceIndex);
+    if (bluetoothDevice == null)
+      throw new Exception(
+          "Invalid bluetoothDeviceIndex: " + Integer.toString(bluetoothDeviceIndex));
+
+    BluetoothGattCharacteristic bluetoothCharacteristic = mCharacteristicList.get(characteristicIndex);
+    if (bluetoothCharacteristic == null)
+      throw new Exception(
+          "Invalid characteristicIndex: " + Integer.toString(characteristicIndex));
+
+    gattServer.notifyCharacteristicChanged(bluetoothDevice, bluetoothCharacteristic, confirm);
   }
 
   /**
@@ -361,6 +412,23 @@
   }
 
   /**
+   * Set value to a bluetooth gatt characteristic
+   *
+   * @param index the bluetooth gatt characteristic
+   * @param value value
+   * @throws Exception
+   */
+  @Rpc(description = "add descriptor to blutooth gatt characteristic")
+  public void gattServerCharacteristicSetValue(@RpcParameter(name = "index") Integer index,
+      @RpcParameter(name = "value") byte[] value) throws Exception {
+    if (mCharacteristicList.get(index) != null) {
+      mCharacteristicList.get(index).setValue(value);
+    } else {
+      throw new Exception("Invalid index input:" + index);
+    }
+  }
+
+  /**
    * Create a new GattCallback object
    *
    * @return the index of the callback object
@@ -436,7 +504,7 @@
       mResults.putParcelable("BluetoothDevice", device);
       mResults.putBoolean("preparedWrite", preparedWrite);
       mResults.putBoolean("responseNeeded", responseNeeded);
-      mResults.putString("value", ConvertUtils.convertByteArrayToString(value));
+      mResults.putByteArray("value", value);
       mResults.putInt("instanceId", characteristic.getInstanceId());
       mResults.putInt("properties", characteristic.getProperties());
       mResults.putString("uuid", characteristic.getUuid().toString());
@@ -470,7 +538,7 @@
       mResults.putParcelable("BluetoothDevice", device);
       mResults.putBoolean("preparedWrite", preparedWrite);
       mResults.putBoolean("responseNeeded", responseNeeded);
-      mResults.putString("value", ConvertUtils.convertByteArrayToString(value));
+      mResults.putByteArray("value", value);
       mResults.putInt("instanceId", descriptor.getInstanceId());
       mResults.putInt("permissions", descriptor.getPermissions());
       mResults.putString("uuid", descriptor.getUuid().toString());
diff --git a/Common/src/com/googlecode/android_scripting/jsonrpc/JsonBuilder.java b/Common/src/com/googlecode/android_scripting/jsonrpc/JsonBuilder.java
index 929fd96..1cc7760 100644
--- a/Common/src/com/googlecode/android_scripting/jsonrpc/JsonBuilder.java
+++ b/Common/src/com/googlecode/android_scripting/jsonrpc/JsonBuilder.java
@@ -266,7 +266,11 @@
             return buildWifiP2pGroup((WifiP2pGroup) data);
         }
         if (data instanceof byte[]) {
-            return Base64Codec.encodeBase64((byte[]) data);
+            JSONArray result = new JSONArray();
+            for (byte b : (byte[]) data) {
+                result.put(b&0xFF);
+            }
+            return result;
         }
         if (data instanceof Object[]) {
             return buildJSONArray((Object[]) data);
diff --git a/Common/src/com/googlecode/android_scripting/rpc/MethodDescriptor.java b/Common/src/com/googlecode/android_scripting/rpc/MethodDescriptor.java
index 5c31c34..285e98b 100644
--- a/Common/src/com/googlecode/android_scripting/rpc/MethodDescriptor.java
+++ b/Common/src/com/googlecode/android_scripting/rpc/MethodDescriptor.java
@@ -182,6 +182,13 @@
           result[i] = list.getInt(i);
         }
         return result;
+      } else if (type == byte[].class) {
+        JSONArray list = parameters.getJSONArray(index);
+        byte[] result = new byte[list.length()];
+        for (int i = 0; i < list.length(); i++) {
+          result[i] = (byte)list.getInt(i);
+        }
+        return result;
       } else if (type == String[].class) {
         JSONArray list = parameters.getJSONArray(index);
         String[] result = new String[list.length()];
diff --git a/Utils/src/com/googlecode/android_scripting/ConvertUtils.java b/Utils/src/com/googlecode/android_scripting/ConvertUtils.java
index 3e6956d..c7df6e0 100644
--- a/Utils/src/com/googlecode/android_scripting/ConvertUtils.java
+++ b/Utils/src/com/googlecode/android_scripting/ConvertUtils.java
@@ -31,8 +31,10 @@
         byte[] byteArray = new byte[parseString.length];
         if (byteArray.length > 0) {
             for (int i = 0; i < parseString.length; i++) {
-                byte byteValue = Byte.valueOf(parseString[i].trim());
-                byteArray[i] = byteValue;
+                int val = Integer.valueOf(parseString[i].trim());
+                if (val < 0 || val > 255)
+                    throw new java.lang.NumberFormatException("Val must be between 0 and 255");
+                byteArray[i] = (byte)val;
             }
         }
         return byteArray;
@@ -49,10 +51,10 @@
         if (byteArray != null) {
             for (int i = 0; i < byteArray.length; i++) {
                 if ((i + 1) != byteArray.length) {
-                    ret = ret + Byte.valueOf(byteArray[i]) + ",";
+                    ret = ret + Integer.valueOf((byteArray[i]&0xFF)) + ",";
                 }
                 else {
-                    ret = ret + Byte.valueOf(byteArray[i]);
+                    ret = ret + Integer.valueOf((byteArray[i]&0xFF));
                 }
             }
         }
