 +            isPreparedWrite,
 +            '<Buffer ' + data.length + '>');
 +
++  const callback = function(result) {
++    log.debug('_onWriteAttribute.callback', result, address);
++    if (needResponse) {
++      this._bledroid.command('attributeResponse ' +
++                             connectionId + ' ' +
++                             transactionId + ' ' +
++                             handle + ' ' +
++                             result);
++    }
++  }.bind(this);
++
 +  if (this._centralMap.has(address)) {
 +    assert.strictEqual(this._centralMap.get(address),
 +                       this._centralMap.get(connectionId));

+include $(BUILD_NODE_MODULE)
diff --git a/lib/android/bindings.js b/lib/android/bindings.js
new file mode 100644
index 0000000..a11f782
--- /dev/null
+++ b/lib/android/bindings.js
@@ -0,0 +1,859 @@
+'use strict';
+
+const assert = require('assert');

+
+const makeBledroidConnection = require('silk-bledroid');
+
+const Characteristic = require('../characteristic');
+const CCCDescriptor = require('./ccc-descriptor');
+const DescriptorEventEmitter = require('./descriptor-event-emitter');
+
+const RESULT_SUCCESS = Characteristic.RESULT_SUCCESS;
+const RESULT_UNLIKELY_ERROR = Characteristic.RESULT_UNLIKELY_ERROR;
+
+const log = (function() {
+  const debug = require('debug');
