             curl_slist_free_all(curlHeaders!)
             
             // todo: Better unknown error handling?
-            return Result.error(apnsId: message.messageId, error: APNSError.unknownError(error: errorString))
-            
+            return Result.networkError(error: SimpleError.string(message: errorString))
+            
+        }
+    }
+    
+    open func send(_ message: ApplePushMessage, to deviceTokens: [String], perDeviceResultHandler: ((_ result: Result) -> Void)) {
+        for deviceToken in deviceTokens {
+            let result = self.send(message, to: deviceToken)
+            perDeviceResultHandler(result)
         }
     }
     

        curlHelperSetOptInt(curlHandle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0)
    }
    
    open func send(applePushMessage message: ApplePushMessage) -> Result {
        // Set URL
        let url = ("\(self.hostURL(message.sandbox))/3/device/\(message.deviceToken)")
        curlHelperSetOptString(curlHandle, CURLOPT_URL, url)
        
        // force set port to 443

                let json = try! Jay.init(formatting: .minified).jsonFromData(try! responseData.makeBytes())
                
                if (json.dictionary?.keys.contains("reason"))! {
                    result = Result.error(apnsId: message.messageId, deviceToken: deviceToken, error: APNSError.init(errorReason: json.dictionary!["reason"]!.string!))
                }else {
                    result = Result.success(apnsId: message.messageId, deviceToken: deviceToken, serviceStatus: .success)
                }
                
            }else {
                result = Result.success(apnsId: message.messageId, deviceToken: deviceToken, serviceStatus: .success)
            }
            
            // Do some cleanup
