         
         // reset count on 1st route
         let firstRoute = chain.routes.first!
-        var handlerID = self.addHandler(firstRoute.transition) { context in
-            if self._canPassCondition(firstRoute.condition, transition: context.transition) {
+        var handlerID = self.addHandler(firstRoute.transition) { [weak self] context in
+            if self == nil { return }
+            let self_ = self!
+            
+            if self_._canPassCondition(firstRoute.condition, transition: context.transition) {
                 if shouldStop {
                     shouldStop = false
                     chainingCount = 0

        
        // increment chainingCount on every route
        for route in chain.routes {
            handlerID = self.addHandler(route.transition) { context in
                
                // skip duplicated transition handlers e.g. chain = 0 => 1 => 0 => 1 & transiting 0 => 1
                if !shouldIncrementChainingCount { return }
                
                if self._canPassCondition(route.condition, transition: context.transition) {
                    if !shouldStop {
                        chainingCount++
//                        println("[RouteChain] chainingCount++ =\(chainingCount), transition=\(route.transition)")

        
        // invoke chainHandler on last route
        let lastRoute = chain.routes.last!
        handlerID = self.addHandler(lastRoute.transition, order: 200) { [weak self] context in
//            println("[RouteChain] finish? \(chainingCount) \(allCount) \(chain.routes.count)")
            if self == nil { return }
            let self_ = self!
            
            if self_._canPassCondition(lastRoute.condition, transition: context.transition) {
                if chainingCount == allCount && chainingCount == chain.routes.count && chainingCount == chain.routes.count {
                    shouldStop = true
                    
