function Env(N, options) {
  // Private, for helpers
  this.__N = N;

  this.params   = options.params || {};
  this.method   = null;

  // Contains server chain response on success
  this.data     = {};

  // internal, to pass error from server chain to responders
  this.err      = null;
  // internal, rendered data
  this.body     = null;
  // internal, http status code (set in responders)
  this.status   = N.io.OK;

  this.headers  = {};


  this.runtime  = {
    assets_hash: N.assets_hash,
    page_data:   {}
  };

  let puncher = new Puncher();
  puncher.start('Total');

  this.extras   = { puncher };

  this.origin   = {
    req: options.req,
    res: options.res
  };

  this.session  = options.session || null;

  this.req      = {
    type:        options.type,
    isEncrypted: options.isEncrypted,
    ip:          options.remoteAddress,
    matched:     options.matched || null,
    tzOffset:    new Date().getTimezoneOffset(), // use server tz by default
    files:       {}, // uploaded files, fieldName => [ { name, size, path, ... } ]
    fields:      {}  // form fields if sent via HTTP POST
  };

  this.res      = {
    head: {
      title: null, // should be filled with default value

      // List of assets for loader,
      // Each element is an object with properties:
      //
      //    type:   css|js
      //    link:   asset_url
      //
      // example: assets.push({type: 'js', link: '//example.com/foo.js'});
      assets: []
    },
    menus: {}
  };

  // Pin helpers (those are shared with server methods and renderer)
  //
  this.helpers  = {};

  Object.keys(DEFAULT_HELPERS).forEach(h => {
    this.helpers[h] = DEFAULT_HELPERS[h].bind(this);
  });

  // TODO: remove this alias
  this.helpers.t.exists = phrase => this.helpers.t_exists(phrase);

  // Server-only helper closures.
  //
  this.t = (phrase, params) => this.helpers.t(resolveI18nPath(phrase, this), params);

  this.t.exists = phrase => this.helpers.t_exists(resolveI18nPath(phrase, this));

  // Run initializers for complex things (nested properties).
  // For example - settings, cookies
  //
  DEFAULT_INIT_HANDLERS.forEach(handler => handler(this));
}
lib.env(options) -> Object
 - options (Object): Environment options.

 Create new request environment object.


 ##### Options

 - **type**: Request type
 - **isEncrypted**: Is https (Boolean)
 - **params**: Request params
 - **session**: Session object
 - **matched**: Router metadata
 - **remoteAddress**: original IP (in direct & forwarded mode)