             options: NSJSONReadingOptions(rawValue: 0)) as! Array<AnyObject>
 
         let actionsArray: [Action] = jsonArray.map {
-            return Action(dictionary: $0["action"] as! [String : AnyObject])
+            return decodeAction($0["action"] as! [String : AnyObject])
         }
 
         return actionsArray

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

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

            callback?(newState)
        }

        if let standardAction = convertActionToStandardAction(action) {
            recordAction(standardAction)
            loadedActions.append(standardAction)
        }

        return action
    }

    func recordAction(action: Action) {
        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? = {
