docs: function(callback) {
  
          var config                  = new Config()
              , conf                  = config.getInstance(self.appName)
              , serverCoreConf        = self.conf.core
              , routing               = {}
              , reverseRouting        = {}
              , cacheless             = config.isCacheless()
              , env                   = self.env
              , apps                  = conf.allBundles//conf.bundles
              , filename              = ''
              , appName               = ''
              , tmp                   = {}
              , standaloneTmp         = {}
              , main                  = ''
              , tmpContent            = ''
              , i                     = 0
              , file                  = null // template file
              , wroot                 = null
              , hasWebRoot            = false
              , webrootAutoredirect   = null
              , localWroot            = null
              , originalRules         = []
              , oRuleCount            = 0;
  
          //Standalone or shared instance mode. It doesn't matter.
          for (; i<apps.length; ++i) {
              config.setServerCoreConf(apps[i], self.env, serverCoreConf);
  
              var appPath = _(conf.envConf[apps[i]][self.env].bundlesPath+ '/' + apps[i]);
              appName     =  apps[i];
  
              //Specific case.
              if (!self.isStandalone && i == 0) appName = apps[i];
  
              try {
                  main        = _(appPath + '/config/' + conf.envConf[apps[i]][self.env].files.routing);
                  filename    = main;//by default
                  filename    = conf.envConf[apps[i]][self.env].files.routing.replace(/.json/, '.' +env + '.json');
                  filename    = _(appPath + '/config/' + filename);
                  //Can't do a thing without.
                  if ( !fs.existsSync(filename) ) {
                      filename = main
                  }
  
                  if (cacheless) {
                      delete require.cache[_(filename, true)]
                  }
  
                  if (filename != main) {
                      routing = tmpContent = merge(require(main), require(filename), true);
  
                  } else {
                      try {
                          tmpContent = require(filename);
                      } catch (err) {
                          // do not block here because the bundle is not build for the same env
                          console.warn(err.stack);
                          continue
                      }
                  }
  
                  try {
  
                      wroot               = conf.envConf[apps[i]][self.env].server.webroot;
                      webrootAutoredirect = conf.envConf[apps[i]][self.env].server.webrootAutoredirect;
                      // renaming rule for standalone setup
                      if ( self.isStandalone && apps[i] != self.appName && wroot == '/') {
                          wroot = '/'+ apps[i];
                          conf.envConf[apps[i]][self.env].server.webroot = wroot
                      }
  
                      if (wroot.length >1) {
                          hasWebRoot = true
                      } else {
                          hasWebRoot = false
                      }
  
                      tmp = tmpContent;
                      //Adding important properties; also done in core/config.
                      for (var rule in tmp){
                          tmp[rule +'@'+ appName] = tmp[rule];
                          delete tmp[rule];
                          file = rule;
                          rule = rule +'@'+ appName;
  
  
                          tmp[rule].bundle        = (tmp[rule].bundle) ? tmp[rule].bundle : apps[i]; // for reverse search
                          tmp[rule].param.file    = ( typeof(tmp) != 'string' && typeof(tmp[rule].param.file) != 'undefined' ) ? tmp[rule].param.file : file; // get template file
                          // by default, method is inherited from the request
                          if (
                              hasWebRoot && typeof(tmp[rule].param.path) != 'undefined' && typeof(tmp[rule].param.ignoreWebRoot) == 'undefined'
                              || hasWebRoot && typeof(tmp[rule].param.path) != 'undefined' && !tmp[rule].param.ignoreWebRoot
                          ) {
                              tmp[rule].param.path = wroot + tmp[rule].param.path
                          }
  
                          if (typeof(tmp[rule].url) != 'object') {
                              if (tmp[rule].url.length > 1 && tmp[rule].url.substr(0,1) != '/') {
                                  tmp[rule].url = '/'+tmp[rule].url
                              } else if (tmp[rule].url.length > 1 && conf.envConf[apps[i]][self.env].server.webroot.substr(conf.envConf[apps[i]][self.env].server.webroot.length-1,1) == '/') {
                                  tmp[rule].url = tmp[rule].url.substr(1)
                              } else {
                                  if (wroot.substr(wroot.length-1,1) == '/') {
                                      wroot = wroot.substr(wroot.length-1,1).replace('/', '')
                                  }
                              }
  
  
                              if (tmp[rule].bundle != apps[i]) { // allowing to override bundle name in routing.json
                                  // originalRule is used to facilitate cross bundles (hypertext)linking
                                  originalRules[oRuleCount] = ( self.isStandalone && tmp[rule] && apps[i] != self.appName) ? apps[i] + '-' + rule : rule;
                                  ++oRuleCount;
  
                                  localWroot = conf.envConf[tmp[rule].bundle][self.env].server.webroot;
                                  // standalone setup
                                  if ( self.isStandalone && tmp[rule].bundle != self.appName && localWroot == '/') {
                                      localWroot = '/'+ routing[rule].bundle;
                                      conf.envConf[tmp[rule].bundle][self.env].server.webroot = localWroot
                                  }
                                  if (localWroot.substr(localWroot.length-1,1) == '/') {
                                      localWroot = localWroot.substr(localWroot.length-1,1).replace('/', '')
                                  }
                                  if ( typeof(tmp[rule].param.ignoreWebRoot) == 'undefined' || !tmp[rule].param.ignoreWebRoot )
                                      tmp[rule].url = localWroot + tmp[rule].url
                              } else {
                                  if ( typeof(tmp[rule].param.ignoreWebRoot) == 'undefined' || !tmp[rule].param.ignoreWebRoot )
                                      tmp[rule].url = wroot + tmp[rule].url
                                  else if (!tmp[rule].url.length)
                                      tmp[rule].url += '/'
                              }
  
                          } else {
  
                              for (var u=0; u<tmp[rule].url.length; ++u) {
                                  if (tmp[rule].url[u].length > 1 && tmp[rule].url[u].substr(0,1) != '/') {
                                      tmp[rule].url[u] = '/'+tmp[rule].url[u]
                                  } else {
                                      if (wroot.substr(wroot.length-1,1) == '/') {
                                          wroot = wroot.substr(wroot.length-1,1).replace('/', '')
                                      }
                                  }
                                  if ( typeof(tmp[rule].param.ignoreWebRoot) == 'undefined' || !tmp[rule].param.ignoreWebRoot )
                                      tmp[rule].url[u] = wroot + tmp[rule].url[u]
                                  else if (!tmp[rule].url.length)
                                      tmp[rule].url += '/'
                              }
                          }
  
                          if( hasViews(apps[i]) ) {
                              // This is only an issue when it comes to the frontend dev
                              // views.useRouteNameAsFilename is set to true by default
                              // IF [ false ] the action is used as filename
                              if ( !conf.envConf[apps[i]][self.env].content['views']['default'].useRouteNameAsFilename && tmp[rule].param.bundle != 'framework') {
                                  var tmpRouting = [];
                                  for (var r = 0, len = tmp[rule].param.file.length; r < len; ++r) {
                                      if (/[A-Z]/.test(tmp[rule].param.file.charAt(r))) {
                                          tmpRouting[0] = tmp[rule].param.file.substring(0, r);
                                          tmpRouting[1] = '-' + (tmp[rule].param.file.charAt(r)).toLocaleLowerCase();
                                          tmpRouting[2] = tmp[rule].param.file.substring(r + 1);
                                          tmp[rule].param.file = tmpRouting[0] + tmpRouting[1] + tmpRouting[2];
                                          ++r
                                      }
                                  }
                              }
                          }
  
                          if ( self.isStandalone && tmp[rule]) {
                              // deprecated: rules are now unique per bundle : rule@bundle
                              //if (apps[i] != self.appName) {
                              //    standaloneTmp[apps[i] + '-' + rule] = JSON.parse(JSON.stringify(tmp[rule]))
                              //} else {
                                  standaloneTmp[rule] = JSON.parse(JSON.stringify(tmp[rule]))
                              //}
                          }
                      }// EO for
  
  
                  } catch (err) {
                      self.routing = routing = null;
                      console.error(err.stack||err.message);
                      callback(err)
                  }
  
              } catch (err) {
                  console.warn(err, err.stack||err.message);
                  callback(err)
              }
  
  
              routing = merge(routing, ((self.isStandalone && apps[i] != self.appName ) ? standaloneTmp : tmp), true);
              // originalRule is used to facilitate cross bundles (hypertext)linking
              for (var r = 0, len = originalRules.length; r < len; r++) { // for each rule ( originalRules[r] )
                  routing[originalRules[r]].originalRule = (routing[originalRules[r]].bundle === self.appName ) ?  config.getOriginalRule(originalRules[r], routing) : config.getOriginalRule(routing[originalRules[r]].bundle +'-'+ originalRules[r], routing)
              }
  
              // reverse routing
              for (var rule in routing) {
                  if ( typeof(routing[rule].url) != 'object' ) {
                      reverseRouting[routing[rule].url] = rule
                  } else {
                      for (var u = 0, len = routing[rule].url.length; u < len; ++u) {
                          reverseRouting[routing[rule].url[u]] = rule
                      }
                  }
              }
  
              config.setRouting(apps[i], self.env, routing);
              config.setReverseRouting(apps[i], self.env, reverseRouting);
  
              if (apps[i] == self.appName) {
                  self.routing        = routing;
                  self.reverseRouting = reverseRouting
              }
  
          }//EO for.
          
  
          callback(false)
      }