             callback?(newState)
         }
 
-        recordAction(action.toAction())
-        loadedActions.append(action.toAction())
+        if let standardAction = convertActionToStandardAction(action) {
+            recordAction(standardAction)
+            loadedActions.append(standardAction)
+        }
+
+        return action
     }
 
     func recordAction(action: Action) {
-        let recordedAction: [String : AnyObject] = [
-            "timestamp": NSDate.timeIntervalSinceReferenceDate(),
-            "action": action.dictionaryRepresentation()
-        ]
-
-        recordedActions.append(recordedAction)
-        storeActions(recordedActions)
+        let standardAction = convertActionToStandardAction(action)
+
+        if let standardAction = standardAction {
+            let recordedAction: [String : AnyObject] = [
+                "timestamp": NSDate.timeIntervalSinceReferenceDate(),
+                "action": standardAction.dictionaryRepresentation()
+            ]
+
+            recordedActions.append(recordedAction)
+            storeActions(recordedActions)
+        } else {
+            print("SwiftFlowRecorder Warning: Could not log following action because it does not " +
+                    "conform to StandardActionConvertible: \(action)")
+        }
+    }
+
+    private func convertActionToStandardAction(action: Action) -> StandardAction? {
+
+        if let standardAction = action as? StandardAction {
+            return standardAction
+        } else if let standardActionConvertible = action as? StandardActionConvertible {
+            return standardActionConvertible.toStandardAction()
+        }
+
+        return nil
+    }
+
+    private func decodeAction(jsonDictionary: [String : AnyObject]) -> Action {
+        let standardAction = StandardAction(dictionary: jsonDictionary)
+
+        if !standardAction.isTypedAction {
+            return standardAction
+        } else {
+            let typedActionType = self.typeMap[standardAction.type]!
+            return typedActionType.init(standardAction)
+        }
     }
 
     lazy var recordingDirectory: NSURL? = {

    var computedStates: [StateType] = []
    var actionsToReplay: Int?
    let recordingPath: String?

    /// Position of the rewind/replay control from the bottom of the screen
    /// defaults to 100

import Foundation
import SwiftFlow

public typealias TypeMap = [String: StandardActionConvertible.Type]

public class RecordingMainStore: MainStore {

    typealias RecordedActions = [[String : AnyObject]]
