diff --git a/bin/route.swc b/bin/route.swc
new file mode 100644
index 0000000..904648d
Binary files /dev/null and b/bin/route.swc differ
diff --git a/src/eu/kiichigo/route/kore/Action.as b/src/eu/kiichigo/route/kore/Action.as
new file mode 100644
index 0000000..72adba5
--- /dev/null
+++ b/src/eu/kiichigo/route/kore/Action.as
@@ -0,0 +1,77 @@
+package eu.kiichigo.route.kore
+{
+ import spark.skins.spark.mediaClasses.fullScreen.FullScreenButtonSkin;
+
+ public class Action implements IAction, IGuard
+ {
+ /**
+ * @private
+ */
+ protected var _route:IRoute;
+ /**
+ * @copy eu.kiichigo.route.kore.IAction#route
+ */
+ public function get route():IRoute
+ {
+ return null;
+ }
+ /**
+ * @private
+ */
+ public function set route(value:IRoute):void
+ {
+ _route = value;
+ }
+
+
+ /**
+ * @private
+ */
+ protected var _predicate:Object;
+ /**
+ * @copy eu.kiichigo.route.kore.IGuard#predicate
+ */
+ public function get predicate():Object
+ {
+ return _predicate;
+ }
+ /**
+ *
+ */
+ public function set predicate(value:Object):void
+ {
+ _predicate = value;
+ }
+
+ /**
+ * eu.kiichigo.route.kore.IAction#run
+ */
+ public function run( percept:Object ):IAction
+ {
+ if( evaluate() )
+ exec( percept );
+
+ return this;
+ }
+
+ protected function evaluate():Boolean
+ {
+ if( _predicate === null )
+ return true;
+ else if( _predicate is Function )
+ return _predicate.call() as Boolean;
+ else if( _predicate is Boolean )
+ return _predicate;
+
+ return true;
+ }
+
+ /**
+ * Override this method in subclassed, in order to implement functionality of a Action
+ */
+ protected function exec( percept:Object ):void
+ {
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/eu/kiichigo/route/kore/IAction.as b/src/eu/kiichigo/route/kore/IAction.as
new file mode 100644
index 0000000..787500b
--- /dev/null
+++ b/src/eu/kiichigo/route/kore/IAction.as
@@ -0,0 +1,21 @@
+package eu.kiichigo.route.kore
+{
+ public interface IAction
+ {
+ /**
+ * Reference to the IRoute instance that's a parent to current IAction.
+ */
+ function get route():IRoute;
+ /**
+ * @private
+ */
+ function set route( value:IRoute ):void;
+
+ /**
+ * Executes current IAction instance with percept received from the IRoute
+ * @param percept Object passed by IRoute.
+ * @return An instance of current IAction.
+ */
+ function run( percept:Object ):IAction;
+ }
+}
\ No newline at end of file
diff --git a/src/eu/kiichigo/route/kore/IActions.as b/src/eu/kiichigo/route/kore/IActions.as
new file mode 100644
index 0000000..3f23f0b
--- /dev/null
+++ b/src/eu/kiichigo/route/kore/IActions.as
@@ -0,0 +1,14 @@
+package eu.kiichigo.route.kore
+{
+ public interface IActions extends IAction
+ {
+ /**
+ * Collection (vector) of IAction instances that will be run once this IActions instance is executed.
+ */
+ function get actions():Vector.;
+ /**
+ *
+ */
+ function set actions( value:Vector. ):void;
+ }
+}
\ No newline at end of file
diff --git a/src/eu/kiichigo/route/kore/IAgent.as b/src/eu/kiichigo/route/kore/IAgent.as
new file mode 100644
index 0000000..e6bac47
--- /dev/null
+++ b/src/eu/kiichigo/route/kore/IAgent.as
@@ -0,0 +1,7 @@
+package eu.kiichigo.route.kore
+{
+ public interface IAgent
+ {
+
+ }
+}
\ No newline at end of file
diff --git a/src/eu/kiichigo/route/kore/IAsyncAciton.as b/src/eu/kiichigo/route/kore/IAsyncAciton.as
new file mode 100644
index 0000000..a03d636
--- /dev/null
+++ b/src/eu/kiichigo/route/kore/IAsyncAciton.as
@@ -0,0 +1,7 @@
+package eu.kiichigo.route.kore
+{
+ public interface IAsyncAciton
+ {
+
+ }
+}
\ No newline at end of file
diff --git a/src/eu/kiichigo/route/kore/IGuard.as b/src/eu/kiichigo/route/kore/IGuard.as
new file mode 100644
index 0000000..f7b38d8
--- /dev/null
+++ b/src/eu/kiichigo/route/kore/IGuard.as
@@ -0,0 +1,17 @@
+package eu.kiichigo.route.kore
+{
+ public interface IGuard
+ {
+ /**
+ * Allowed types are: Boolean or Function closure that returns a Boolean.
+ * Indicates whether an IGuard instance will be executed or not.
+ *
+ * Default value is true
+ */
+ function get predicate():Object;
+ /**
+ * @private
+ */
+ function set predicate( value:Object ):void;
+ }
+}
\ No newline at end of file
diff --git a/src/eu/kiichigo/route/kore/IPattern.as b/src/eu/kiichigo/route/kore/IPattern.as
new file mode 100644
index 0000000..4fd376c
--- /dev/null
+++ b/src/eu/kiichigo/route/kore/IPattern.as
@@ -0,0 +1,25 @@
+package eu.kiichigo.route.kore
+{
+ public interface IPattern
+ {
+ /**
+ * A closure that will match percept received by IRoute against current IPattern.
+ * Allowed signatures are:
+ *
+ *
function myMatcher( pattern:IPattern, percept:Object ):Boolean
+ *
function myMatcher( percept:Object ):Boolean
+ *
+ */
+ function get matcher():Function;
+ /**
+ * @private
+ */
+ function set matcher( value:Function ):void;
+
+ /**
+ * Evaluates percept received by IRoute and returns Boolean.
+ * If trueIRoute will execute IAction instances and closures.
+ */
+ function match( percept:Object ):Boolean;
+ }
+}
\ No newline at end of file
diff --git a/src/eu/kiichigo/route/kore/IPerceiver.as b/src/eu/kiichigo/route/kore/IPerceiver.as
new file mode 100644
index 0000000..6cf9d28
--- /dev/null
+++ b/src/eu/kiichigo/route/kore/IPerceiver.as
@@ -0,0 +1,9 @@
+package eu.kiichigo.route.kore
+{
+ public interface IPerceiver
+ {
+ function get route():IRoute;
+
+ function set route( value:IRoute ):void;
+ }
+}
\ No newline at end of file
diff --git a/src/eu/kiichigo/route/kore/IRPCAction.as b/src/eu/kiichigo/route/kore/IRPCAction.as
new file mode 100644
index 0000000..4fd15ca
--- /dev/null
+++ b/src/eu/kiichigo/route/kore/IRPCAction.as
@@ -0,0 +1,7 @@
+package eu.kiichigo.route.kore
+{
+ public interface IRPCAction
+ {
+
+ }
+}
\ No newline at end of file
diff --git a/src/eu/kiichigo/route/kore/IRoute.as b/src/eu/kiichigo/route/kore/IRoute.as
new file mode 100644
index 0000000..dcdf72f
--- /dev/null
+++ b/src/eu/kiichigo/route/kore/IRoute.as
@@ -0,0 +1,55 @@
+package eu.kiichigo.route.kore
+{
+ public interface IRoute
+ {
+ /**
+ *
+ */
+ function get percept():Object;
+
+ /**
+ * A reference to the IRouter instance that's a parent for current IRoute.
+ */
+ function get router():IRouter;
+ /**
+ * @private
+ */
+ function set router( value:IRouter ):void;
+
+ /**
+ * Allowed types are:
+ *
+ *
An instance of IAction or IActions.
+ *
Function closure: A function closure with a signature:
+ * <function ():void or function ( percept:Object ):void.
+ *
Array or Vector: of Function closures, or mixed type.
+ *
+ */
+ function get actions():Object;
+ /**
+ * @private
+ */
+ function set actions( value:Object ):void;
+
+ /**
+ *
+ */
+ function get perceiver():Object;
+ /**
+ * @private
+ */
+ function set perceiver( value:Object ):void;
+
+ /**
+ * IPattern instance or closure that will evaluate incoming percept and "decide" whether current IRoute instance will accept it or not.
+ * In case of closure - allowed signatures are:
+ * function ( percept:Object ):Boolean
+ * function ( pattern:Object, percept:Object ):Boolean.
+ */
+ function get pattern():Object;
+ /**
+ * @private
+ */
+ function set pattern( value:Object ):void;
+ }
+}
\ No newline at end of file
diff --git a/src/eu/kiichigo/route/kore/IRouter.as b/src/eu/kiichigo/route/kore/IRouter.as
new file mode 100644
index 0000000..1b6240a
--- /dev/null
+++ b/src/eu/kiichigo/route/kore/IRouter.as
@@ -0,0 +1,45 @@
+package eu.kiichigo.route.kore
+{
+ import eu.kiichigo.route.utils.ICache;
+
+ public interface IRouter
+ {
+ /**
+ * An instance of ICache that handles creation and caching of Models, Views and various Utility classes.
+ * ICache can be shared by multiple IRouter by changing IRouter.group value.
+ */
+ function get cache():ICache;
+
+ /**
+ * Indicates a group to wich current IRouter belongs. Default value is null which means that no group is created.
+ */
+ function get group():Object;
+ /**
+ * @private
+ */
+ function set group( value:Object ):void;
+
+ /**
+ *
+ */
+ function get routes():Vector.;
+ /**
+ * @private
+ */
+ function set routes( value:Vector. ):void;
+
+
+ /**
+ * Adds IRoute to a list of IRouter.routes and returns newly added IRoute.
+ *
+ * @param route IRoute instance to be added.
+ * @return Added IRoute instance.
+ */
+ function add( route:IRoute ):IRoute;
+
+ /**
+ * Clears and removes all IRoute instances, reseting current IRouter.
+ */
+ function clear():void;
+ }
+}
\ No newline at end of file
diff --git a/src/eu/kiichigo/route/kore/Router.as b/src/eu/kiichigo/route/kore/Router.as
new file mode 100644
index 0000000..d610063
--- /dev/null
+++ b/src/eu/kiichigo/route/kore/Router.as
@@ -0,0 +1,110 @@
+package eu.kiichigo.route.kore
+{
+ import eu.kiichigo.route.utils.Cache;
+ import eu.kiichigo.route.utils.ICache;
+ import eu.kiichigo.route.utils.add;
+ import eu.kiichigo.route.utils.invalidate;
+ import eu.kiichigo.route.utils.log;
+
+ import flash.events.EventDispatcher;
+ import flash.events.IEventDispatcher;
+
+ import mx.utils.UIDUtil;
+
+ public class Router extends EventDispatcher implements IRouter
+ {
+ /**
+ * @private
+ * Logging
+ */
+ protected static const log:Function = eu.kiichigo.route.utils.log( Router );
+
+ /**
+ * @copy eu.kiichigo.route.kore.IRouter#cache
+ */
+ public function get cache():ICache
+ {
+ // If Router.group will do more than a cache control - move this logic to state evaluation.
+ return Cache.get( _group );
+ }
+
+
+ /**
+ * @private
+ */
+ protected var _group:Object = "global";
+
+ /**
+ * @copy eu.kiichigo.route.kore.IRouter#group
+ */
+ public function get group():Object
+ {
+ return _group;
+ }
+ /**
+ * @private
+ */
+ public function set group(value:Object):void
+ {
+ _group = value;
+ }
+
+
+ /**
+ * @private
+ */
+ protected const _routes:Vector. = new Vector.;
+
+ /**
+ * @copy eu.kiichigo.route.kore.IRouter#routes
+ */
+ public function get routes():Vector.
+ {
+ return _routes;
+ }
+ /**
+ * @private
+ */
+ public function set routes( value:Vector. ):void
+ {
+ clear();
+ eu.kiichigo.route.utils.add( _routes, initialize )( value );
+ }
+
+
+ /**
+ * @copy eu.kiichigo.route.kore.IRouter#add
+ */
+ public function add( route:IRoute ):IRoute
+ {
+ _routes.push( initialize( route ) );
+ return route;
+ }
+
+
+ /**
+ * @copy eu.kiichigo.route.kore.IRouter#clear
+ */
+ public function clear():void
+ {
+ if( _routes.fixed )
+ _routes.fixed = false;
+
+ for( var i:uint = 0; i < _routes.length; i ++ )
+ _routes.shift();
+
+ _routes.fixed = true;
+ }
+
+ /**
+ * @private
+ * Initializes IRoute as a part of IRouter.
+ */
+ protected function initialize( route:IRoute ):IRoute
+ {
+ route.router = this;
+
+ return route;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/eu/kiichigo/route/utils/Cache.as b/src/eu/kiichigo/route/utils/Cache.as
new file mode 100644
index 0000000..1337af9
--- /dev/null
+++ b/src/eu/kiichigo/route/utils/Cache.as
@@ -0,0 +1,65 @@
+/*
+The MIT License
+
+Copyright (c) 2009-2011
+David "Nirth" Sergey ( nirth@kiichigo.eu, nirth.furzahad@gmail.com )
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+*/
+package eu.kiichigo.route.utils
+{
+ import flash.utils.Dictionary;
+
+ public class Cache extends Hash
+ implements ICache
+ {
+ /**
+ * @private
+ * Logging
+ */
+ //
+ /**
+ * @private
+ * A collection of instances of ICache.
+ */
+ protected static const instances:Dictionary = new Dictionary;
+
+ /**
+ * A Multiton Pattern creation method.
+ */
+ public static function get( id:Object = "default" ):ICache
+ {
+ if( instances[id] === null )
+ instances[id] = new Cache;
+
+ return instances[id];
+ }
+
+ /**
+ * @copy eu.kiichigo.route.utils.ICache#instance
+ */
+ public function instance( generator:Class ):*
+ {
+ if( has( generator ) )
+ return retreive( generator );
+ return store( generator, new generator );
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/src/eu/kiichigo/route/utils/Hash.as b/src/eu/kiichigo/route/utils/Hash.as
new file mode 100644
index 0000000..822237d
--- /dev/null
+++ b/src/eu/kiichigo/route/utils/Hash.as
@@ -0,0 +1,117 @@
+/*
+The MIT License
+
+Copyright (c) 2009-2011
+David "Nirth" Sergey ( nirth@kiichigo.eu, nirth.furzahad@gmail.com )
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+*/
+package eu.kiichigo.route.utils
+{
+ import flash.utils.Dictionary;
+ import flash.utils.getQualifiedClassName;
+
+ public class Hash implements IHash
+ {
+ /**
+ * @private
+ * Logging
+ */
+ protected static const log:Function = eu.kiichigo.route.utils.log( Hash );
+
+ /**
+ * An instance of a Dictionary, that stores data.
+ */
+ protected const data:Dictionary = new Dictionary;
+
+
+ /**
+ * Constructor
+ */
+ public function Hash()
+ {
+ super();
+ }
+
+
+ /**
+ *
+ */
+ protected const _keys:Vector.