         protected var _currentState:IState;
         protected var _inEventLoop:Boolean;
         protected var _destroyed:Boolean;
-        protected var _that:IFsm;
-
-        /**
-         * An optional IFsm to use instead of this.
-         */
-        public function set that(value:IFsm):void
-        {
-            _that = value;
+        protected var _actionFsm:IFsm;
+        protected var _guardFsm:IFsm;
+
+        /**
+         * An optional root IFsm to use for IGuard#evaluate and IAction#execute
+         */
+        public function set rootFsm(value:IFsm):void
+        {
+            actionFsm = value;
+            guardFsm = value;
+        }
+
+        /**
+         * An optional IFsm to use for IAction#execute
+         */
+        public function set actionFsm(value:IFsm):void
+        {
+            _actionFsm = value;
+        }
+
+        /**
+         * An optional IFsm to use for IGuard#evaluate
+         */
+        public function set guardFsm(value:IFsm):void
+        {
+            _guardFsm = value;
         }
 
         public function init(value:IState):void

                    {
                        for each (guard in transition.guards)
                        {
                            if (guard.evaluate(_that || this, event))
                            {
                                if (trueGuard)
                                {

        {
            if (action)
            {
                action.execute(_actionFsm || this, event);
            }
        }

