             return
         }
         
-        writeHandler = complete
-        var writeType = CBCharacteristicWriteType.withResponse
-        if complete == nil {
-            writeType = .withoutResponse
-        }
-        peripheral.writeValue(data, for: targetCharacteristic, type: writeType)
+        let item = QueueItem<Void>(
+            name: targetCharacteristic.compositeId,
+            execution: {
+                // TODO: Add connection check, and error out otherwise
+                self.peripheral.writeValue(data, for: targetCharacteristic, type: type)
+        }, callback: { (result) in
+            complete?(result)
+        })
+        queue.pushBack(item)
     }
     
     // TODO: Adding some pre-conditions libraries/toolkits could streamline the initial clutter

        if let e = error {
            result = .failure(e)
        }
    
        writeHandler?(result)
        writeHandler = nil
    }
    
    // This is equivalent to a direct READ from the characteristic

        }
        
        // TODO: Can using just the characteristic UUID cause a conflict if there is an identical characteristic in another service? Can't recall if legal
        // TODO: Maybe use new compositeId? Merges service and characteristic IDs
        notificationHandler[targetCharacteristic] = complete
        peripheral.setNotifyValue(true, for: targetCharacteristic)
    }
