         self.properties = properties
         return self
     }
+    
+    /**
+     Executes the synchronous process on the main thread.
+     - Parameter nodes: An Array of Elements.
+     - Parameter completion: An optional completion block.
+     - Returns: An Array of Elements.
+     */
+    @discardableResult
+    internal func executeSynchronousRequest(nodes: [T], completion: (([T]) -> Void)? = nil) -> [T] {
+        guard let c = completion else {
+            return nodes
+        }
+
+        if Thread.isMainThread {
+            c(nodes)
+        } else {
+            DispatchQueue.main.async { [n = nodes, c = c] in
+                c(n)
+            }
+        }
+
+        return nodes
+    }
 }
 
 extension Search where T: Entity  {

     */
    @discardableResult
    public func sync(completion: (([T]) -> Void)? = nil) -> [T] {
        let n = graph.searchForAction(types: types, tags: tags, groups: groups, properties: properties) as! [T]
        
        guard let c = completion else {
            return n
        }
        
        if Thread.isMainThread {
            c(n)
        } else {
            DispatchQueue.main.async { [n = n, c = c] in
                c(n)
            }
        }
        
        return n
    }
    
    /**

     */
    @discardableResult
    public func sync(completion: (([T]) -> Void)? = nil) -> [T] {
        return executeSynchronousRequest(nodes: graph.searchForEntity(types: types, tags: tags, groups: groups, properties: properties) as! [T], completion: completion)
    }
    
    /**
