             }
         }
         
+        for operation in internalQueue.operations {
+            guard operation !== finishingOperation && operation !== startingOperation else { continue }
+            
+            completeOperation.addDependency(operation)
+        }
+        
+        completeOperations.append(completeOperation)
         finishingOperation.addDependency(completeOperation)
         internalQueue.addOperation(completeOperation)
+        return self
     }
     
     /// resume all the operations in the queue
-    public final func resume() {
+    @discardableResult
+    public final func resume() -> TaskOperation {
         assert(state == .suspended)
         
         state = .running
         internalQueue.isSuspended = false
-        
-        guard canResume else {
-            cancel()
-            return
-        }
-        
         for observer in taskObservers {
             observer.taskOperationDidResume(self)
         }
         
-        guard internalQueue.operations.contains(finishingOperation) == false else { return }
-        
-        internalQueue.addOperation(finishingOperation)
+        return self
     }
     
     /// suspends all the operations in the current queue
-    public final func suspend() {
+    @discardableResult
+    public final func suspend() -> TaskOperation {
         assert(state == .running)
         
         state = .suspended

    }
    
    /// adds a new operation to be executed when the operation finish
    public final func complete(_ completionHandler: @escaping ([Error]?) -> Void) {
        let completeOperation = BlockOperation { [weak self] in
            guard let strongSelf = self else { return }
            

    
    /// Adds the operation to the internal queue
    open func addOperation(_ operation: Foundation.Operation) {
        for completeOperation in completeOperations {
            completeOperation.addDependency(operation)
        }
        
        internalQueue.addOperation(operation)
    }
    
    /// Adds multiple operations to the queue
    open func addOperations(_ operations: [Foundation.Operation]) {
        for operation in operations {
            addOperation(operation)
        }
    }
    
    /// Adds the new error to the internal errors array
