anchor.diff:  
     /**
      * Returns the whole url corresponding to the given [routeName] and
  -   * [parameters]. Accepts [Map] and [Data] as [parameters]. 
  +   * [parameters]. Accepts [Map] and [Data] as [parameters].
      */
     String routeUrl(String routeName, dynamic parameters) {
       return this.host + this.routePath(routeName, parameters);
  
positive.code: 
    /**
     * Returns path part of the url corresponding to the given [routeName] and
     * [parameters]. Accepts [Map] and [Data] as [parameters]. 
     */
    String routePath(String routeName, dynamic parameters) {
      var route = this.routes[routeName];
  
negative.code:   }
  }
  
  /**
   * [PageNavigator] wires together [History] management, [Route] matching and
   * [View] rendering.
   *
   */
  class PageNavigator {
    Router _router;
    dynamic _history;
    String _activeRouteName;
    Data _activeParameters;
    Map _views;
  
    String get activePath => this._router.routePath(this._activeRouteName, this._activeParameters);
  
  /**
   * Create a new [PageNavigator] for client to allow him navigate through the site.
   * Responsibility: Manage url addresses and bind them to views. It updates url (replaceState, pushState) if the url params are changed in the view.
   * Parameter [_router] for matching route names to routes and parameters.
   * Parameter [_history] should have pushState and replaceState with semantics as dart.dom.history. See [HashHistory] for more.
   * Parameter [_views] is map of ROUTE_NAME : View to render.
   * Throws [ArgumentError] when at least one of the arguments is null.
   */
    PageNavigator(this._router, this._history){
      if(this._router == null){
        throw new ArgumentError("Cannot construct PageNavigator as router is null.");
      }
      if(this._history == null){
        throw new ArgumentError("Cannot construct PageNavigator as history is null.");
      }
    }
  
  /**
   * Registeres a [View] for a particular [Route].
   * Throws [ArgumentError] if trying to overwrite an already registered [route_name].
   */
    void registerView(String route_name, View view){
      //TODO consider only warning
      if(this._views.containsKey(route_name)){
        throw new ArgumentError("Route name '$route_name' already in use in PageNavigator.");
      }
      this._views[route_name] = view;
    }
  
  /**
   * Navigates the browser to the selected route with given [data]. A [View] is selected and [Data] passed.
   * When [View] changes [Data] then [PageNavigator] calls history.replaceState with a new url.
   * From the other side when [PageNavigator.navigate] is called to an actual [View]
   *   the [Data] is updated and therefore [Vew] sould listen to [Data] changes.
   * Parameter [name] of the route to be navigated to.
   * Parameter [data] route parameter values.
   * Flag [pushState] if the new url (state) should be pushed to browser history.
   * Throws [StateError] when trying to navigate to a null [View].
   * Throws [ArgumentError] when no such route exists.
   */
    void navigate(String name, Map data, {bool pushState}){
      if(this._views[name] == null){
        throw new StateError("View not found for '$name'");
      }
      /* TODO
      *        //include discussion, that data holder should listen to changes
      *        if same name no load and unload
      *        data.clear
        *        data.addAll
          *      pushState -> pushes actual state, don't block anything so on notify callback the replaceState will be called
          */
    }
  
  /**
   * Pushes the current state.
   * Should be called from [View] when [View] considers it necessary after block of [Data] changes.
   * Note that [Data].onChange callback is called in PageNavigator
   *   it will only call [_history.replaceState] which will do no harm.
   */
    void pushState(){
      this._history.pushState(new Object(), "", this.activePath);
    }
  }
  
  /**
   * Should have the closest approximation of [dart.dom.history] as possible for browsers not supporting [HTML5].
   * This is implemented via tokens after hashes in url which are allowed to change by browsers.
   *
   * See http://api.dartlang.org/docs/releases/latest/dart_html/History.html#pushState .
   */
  class HashHistory {
    /**
     * Navigates to url.
     */
    void pushState(Object data, String title, [String url]){
      window.location.hash = '#' + url;
    }
  
    /**
     * Navigates to url.
     */
    void replaceState(Object data, String title, [String url]){
      window.location.hash = '#' + url;
  