      
      */
     private func finishAndMerge(callerNode:FMNode, sessionUUID:String) -> Bool {
+        // TODO : make sure the merge is not called from the UI thread
+        
         var status:Bool = false
         // did we get all the results, yet?
         if(nodeToWork[sessionUUID]!.count == nodeToResult[sessionUUID]!.count) {

        dispatch_sync(self.lock) {
            self.nodeToRoundTripTimer[sessionUUID]![self.getSelfNode()]?.start()
        }
        let selfResult:FMResult = self.fmTool.processWork(getSelfNode(), fromNode: getSelfNode(), work: selfWork!)
        
        // store the result and merge results if needed

     Set up future reprocessing stuff for nodes that might fail
     
     */
    @objc private func scheduleReprocessWork(timer: NSTimer) {
        dispatch_sync(self.lock) {
            let dataReceived:[String:NSObject] = timer.userInfo as! [String:NSObject]
            let sessionUUID:String = dataReceived["SessionID"] as! String
