 				return;
 			}
 			
-			executeRequest();
+			executeRequest( requested );
 			
 		}
 		
-		private function executeRequest():void {
+		private function executeRequest( requested:NavigationState ):void {
 			
+			var exitMapping : StateMapping = new StateMapping();
+			var enterMapping : StateMapping = new StateMapping();			
+			var res : Boolean = true;
+			
+			_exitMapper.getMatchingStateMapping( _currentState.segments, exitMapping );
+			
+			res = testRedirect(exitMapping);
+			if(res) return;
+			
+			_enterMapper.getMatchingStateMapping( requested.segments, enterMapping );
+			
+			res = testRedirect(enterMapping);
+			if(res) return;
+			
+			// Execute exit guards
+			//res = executeGuards(exitMapping);
+			//if(!res) return;
+			
+			// Execute enter guards
+			//res = executeGuards(enterMapping);
+			//if(!res) return;
+			
+			// Execute exit hooks
+			
+			// Switch state
+			
+			// Execute enter hooks
 			
 			
 		}
 		
-		/*private function findMatchingStates( searchState:NavigationState, statesList:Dictionary ):Array {
-			var matches : Array = new Array;
-			var ns: NavigationState = NavigationStatePool.getNavigationState();
-			for ( var state:String in statesList ) {
-				ns.path = state;
-				if( searchState.equals( ns ){
-					
+		private function testRedirect( mapping:StateMapping ):Boolean {
+			// search for redirects
+			if( mapping.redirectTo != null ){
+				redirect( mapping.redirectTo );
+				return true;
+			}		
+			return false;
+		}
+		
+		private function redirect( destination:NavigationState ):void {
+			var redEvent : NavigatorStateEvent = new NavigatorStateEvent( NavigatorStateEvent.STATE_REDIRECTING, _currentState, destination );
+			dispatchEvent(redEvent);
+			request( destination );
+		}
+		
+		private function executeGuardsAsync( ):Boolean {
+			return false;
+		}
+		
+		private function executeGuardsSync( mapping:StateMapping ):Boolean {
+			
+			for( var guard:Object in mapping.guards ){					
+				if (guard is Function)
+				{
+					if ((guard as Function)())
+						continue;
+					return false;
 				}
-			}
-		}*/
+				if (guard is Class)
+				{
+					guard = new (guard as Class);
+				}
+				if (guard.approve() == false)
+					return false;
+			}				
+
+			return true;
+		}
+		
+		private function executeHooksAsync():void{
+			
+		}
+		
+		private function executeHooksSync():void {
+			
+		}
+		
+		private function switchState():void {
+			
+		}
+			
 		
 	}
 }
	{	
		internal static var _logger:ILogger;
		
		private var _enterMapping:SegmentMapper = new SegmentMapper( "" );
		private var _exitMapping:SegmentMapper = new SegmentMapper( "" );
		
		private var _requestedState:NavigationState;
		

		 * @return the mapping object so that you can continue the mapping.
		 */
		public function onExitFrom( stateOrPath:* ):IExitSegmentMapper {
			return _exitMapper.getSegmentMapperFor( NavigationState.make(stateOrPath, false).segments );
		}
		
		
