     
 #endif
 
-public
-struct TransitionFrom<S: FeatureState>
-{
-    public
-    let oldState: S
-}
-
-public
-struct TransitionInto<S: FeatureState>
-{
-    public
-    let newState: S
+//===
+
+public
+extension TransitionOf.Into
+{
+    static
+    func via(
+        scope: String = #file,
+        context: String = #function,
+        // globalModel, become, submit
+        body: @escaping (GlobalModel, Wrapped<StateGetter<S>>, @escaping Wrapped<ActionGetter>) throws -> Void
+        ) -> Action
+    {
+        return Action(scope, context, self) { model, submit in
+            
+            let oldState =
+                
+            try REQ.value("\(F.name) is presented") {
+                
+                model >> F.self
+            }
+            
+            //===
+            
+            var newState: S!
+            
+            //===
+            
+            try body(model, { newState = $0() }, submit)
+            
+            //===
+            
+            try REQ.isNotNil("New state for \(F.name) is set") {
+                
+                newState
+            }
+            
+            //===
+            
+            return (
+                { $0 << newState },
+                TransitionOf<F>(oldState: oldState, newState: newState)
+            )
+        }
+    }
 }
 
 //===

    let newState: Any
}

#if swift(>=3.2)
    
public

struct TransitionOf<F: Feature>
{
    public
    struct Into<S: FeatureState> where S.ParentFeature == F
    {
        public
        let newState: S
    }
    
    public
    struct From<S: FeatureState> where S.ParentFeature == F
    {
        public
        let oldState: S
    }
    
    public
    struct Between<From: FeatureState, Into: FeatureState> where
