     }
 }
 
-public extension PushModalCoordinator where ViewController: Coordinated {
+public extension PushModalCoordinator {
     // By default, to distinguish between modal and push a presence of destinationNavigationController is checked
     // as this is a good heuristics (it's usually not desired to push another navigation controller). This behaviour
     // can be redefined by redeclaring this property on any concrete PushModalCoordinator.

    func willStop(in coordinator: Coordinator)
    func didStop(in coordinator: Coordinator)
}

/// Used typically on view controllers to refer to it's coordinator
public protocol Coordinated: class {
    associatedtype C: Coordinator
    var coordinator: C! { get set }
    func getCoordinator() -> Coordinator?
    func setCoordinator(_ coordinator: Coordinator)
}

public extension Coordinated {
    func getCoordinator() -> Coordinator? {
        return coordinator
    }

    func setCoordinator(_ coordinator: Coordinator) {
        self.coordinator = coordinator as! C
    }
}

    }
}

public extension PushCoordinator {
    func start() {
        guard let viewController = viewController else {
            return
