diff --git a/web/package.json b/web/package.json
index f50f3b42..72b9fb6e 100644
--- a/web/package.json
+++ b/web/package.json
@@ -4,12 +4,14 @@
     "babel-loader": "~6.4.1",
     "babel-preset-es2015": "~6.24.0",
     "babel-preset-react": "~6.23.0",
-    "css-loader": "^0.28.4",
+    "cross-env": "^5.0.1",
     "enzyme": "~2.8.2",
     "enzyme-matchers": "^3.1.0",
-    "eslint": "^3.19.0",
+    "eslint": "3.19.0",
     "eslint-plugin-react": "^6.10.3",
     "extract-text-webpack-plugin": "^2.1.2",
+    "file-loader": "^0.11.2",
+    "image-webpack-loader": "^3.3.1",
     "jasmine-core": "~2.5.2",
     "jasmine-enzyme": "^3.1.0",
     "karma": "~1.5.0",
@@ -22,38 +24,72 @@
     "karma-sourcemap-loader": "~0.3.7",
     "karma-webpack": "~2.0.3",
     "node-sass": "^4.5.3",
+    "optimize-css-assets-webpack-plugin": "^2.0.0",
     "raw-loader": "^0.5.1",
     "react-addons-test-utils": "~15.4.2",
     "sass-loader": "^6.0.6",
     "style-loader": "^0.18.2",
-    "webpack": "~2.3.1"
+    "uglifyjs-webpack-plugin": "^0.4.6",
+    "url-loader": "^0.5.9",
+    "webpack": "^3.0.0"
   },
   "dependencies": {
+    "acitree": "git+https://github.com/imsurinder90/jquery-aciTree.git#rc.7",
+    "alertifyjs": "^1.10.0",
     "axios": "^0.16.1",
     "babel-plugin-transform-es2015-modules-amd": "^6.24.1",
     "babel-polyfill": "^6.23.0",
     "babel-preset-es2015-without-strict": "~0.0.4",
     "babelify": "~7.3.0",
+    "backbone": "1.1.2",
+    "backform": "^0.2.0",
+    "backgrid": "^0.3.8",
+    "backgrid-filter": "^0.3.7",
+    "backgrid-select-all": "^0.3.5",
+    "backgrid-sizeable-columns": "^0.1.1",
+    "bignumber.js": "^4.0.2",
+    "bootstrap": "^3.3.7",
+    "bootstrap-datepicker": "^1.7.0",
+    "bootstrap-datetime-picker": "^2.4.4",
+    "bootstrap-switch": "3.3.2",
     "bowser": "1.6.1",
     "browserify": "~14.1.0",
+    "codemirror": "^5.27.2",
+    "css-loader": "0.14.0",
+    "cssnano": "^3.10.0",
+    "dropzone": "^5.1.1",
     "exports-loader": "~0.6.4",
+    "flotr2": "^0.1.0",
+    "font-awesome": "^4.7.0",
+    "font-mfizz": "^1.2.2",
+    "hard-source-webpack-plugin": "^0.4.9",
     "immutability-helper": "^2.2.0",
-    "imports-loader": "git+https://github.com/webpack-contrib/imports-loader.git#44d6f48463b256a17c1ba6fd9b5cc1449b4e379d",
+    "imports-loader": "^0.7.1",
+    "jquery": "1.11.2",
+    "jquery-contextmenu": "^2.5.0",
+    "jquery-ui": "^1.12.1",
     "moment": "^2.18.1",
     "react": "file:../web/pgadmin/static/vendor/react",
     "react-dom": "file:../web/pgadmin/static/vendor/react-dom",
     "react-split-pane": "^0.1.63",
     "requirejs": "~2.3.3",
+    "select2": "^4.0.3",
+    "shim-loader": "^1.0.1",
     "slickgrid": "git+https://github.com/6pac/SlickGrid.git#2.3.7",
-    "underscore": "~1.8.3",
-    "watchify": "~3.9.0"
+    "snapsvg": "^0.5.1",
+    "underscore": "^1.8.3",
+    "underscore.string": "^3.3.4",
+    "watchify": "~3.9.0",
+    "webcabin-docker": "^2.2.2"
   },
   "scripts": {
     "linter": "yarn run eslint pgadmin/static/jsx/**/*.jsx pgadmin/static/js/selection/*.js regression/javascript/**/*.jsx regression/javascript/**/*.js *.js",
     "webpacker": "yarn run webpack -- --config webpack.config.js",
     "webpacker:dev": "yarn run webpack -- --config webpack.config.js",
+    "webpacker:prod": "yarn run linter && yarn run webpack -- --config webpack.config.js",
     "bundle": "yarn run linter && yarn run webpacker",
     "bundle:dev": "yarn run linter && yarn run webpacker:dev",
+    "bundle:prod": "cross-env NODE_ENV=production yarn run webpacker:prod",
     "test:karma-once": "yarn run linter && yarn run karma start -- --single-run",
     "test:karma": "yarn run linter && yarn run karma start",
     "test:feature": "yarn run bundle && python regression/runtests.py --pkg feature_tests",
diff --git a/web/pgadmin/about/__init__.py b/web/pgadmin/about/__init__.py
index 4d4006ab..f54418dd 100644
--- a/web/pgadmin/about/__init__.py
+++ b/web/pgadmin/about/__init__.py
@@ -47,6 +47,8 @@ class AboutModule(PgAdminModule):
             'when': None
         }]
 
+    def get_exposed_url_endpoints(self):
+        return ['about.index']
 
 blueprint = AboutModule(MODULE_NAME, __name__,
                         static_url_path='')
@@ -55,7 +57,7 @@ blueprint = AboutModule(MODULE_NAME, __name__,
 ##########################################################################
 # A test page
 ##########################################################################
-@blueprint.route("/")
+@blueprint.route("/", endpoint='index')
 @login_required
 def index():
     """Render the about box."""
diff --git a/web/pgadmin/about/templates/about/about.js b/web/pgadmin/about/templates/about/about.js
index 662469a1..a746d0f5 100644
--- a/web/pgadmin/about/templates/about/about.js
+++ b/web/pgadmin/about/templates/about/about.js
@@ -1,6 +1,8 @@
 define(
-  ['jquery', 'alertify', 'pgadmin', 'sources/gettext'],
-  function($, alertify, pgAdmin, gettext) {
+  ['jquery', 'alertify', 'pgadmin', 'underscore.string', 'sources/gettext',
+   'sources/url_for'
+  ],
+  function($, alertify, pgAdmin, S, gettext, url_for) {
     pgAdmin = pgAdmin || window.pgAdmin || {};
 
     /* Return back, this has been called more than once */
@@ -39,9 +41,11 @@ define(
         }
 
         var content = '';
-        $.get("{{ url_for('about.index') }}",
+        $.get(url_for('about.index'),
             function(data) {
-              alertify.aboutDialog(gettext("About %(appname)s", {appname: "{{ config.APP_NAME }}"}), data).resizeTo(800, 450);
+              alertify.aboutDialog(
+                  S(gettext("About %s")).sprintf(pgAdmin.Browser.utils.app_name).value(), data
+              ).resizeTo(800, 450);
             });
       }
     };
diff --git a/web/pgadmin/browser/__init__.py b/web/pgadmin/browser/__init__.py
index 77e052f0..6ae14b44 100644
--- a/web/pgadmin/browser/__init__.py
+++ b/web/pgadmin/browser/__init__.py
@@ -523,9 +523,9 @@ def index():
 
     return response
 
-@blueprint.route("/js/browser.js")
+@blueprint.route("/js/utils.js")
 @login_required
-def browser_js():
+def utils():
     layout = get_setting('Browser/Layout', default='')
     snippets = []
 
@@ -559,7 +559,7 @@ def browser_js():
         snippets.extend(submodule.jssnippets)
     return make_response(
         render_template(
-            'browser/js/browser.js',
+            'browser/js/utils.js',
             layout=layout,
             jssnippets=snippets,
             pg_help_path=pg_help_path,
@@ -569,7 +569,7 @@ def browser_js():
             editor_wrap_code=editor_wrap_code,
             editor_brace_matching=brace_matching,
             editor_insert_pair_brackets=insert_pair_brackets,
-            _=gettext
+            app_name=config.APP_NAME
         ),
         200, {'Content-Type': 'application/x-javascript'})
 
diff --git a/web/pgadmin/browser/server_groups/servers/databases/languages/static/js/language.js b/web/pgadmin/browser/server_groups/servers/databases/languages/static/js/language.js
index 9b8aad36..835d7498 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/languages/static/js/language.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/languages/static/js/language.js
@@ -217,7 +217,7 @@ define('pgadmin.node.language', [
             }
             return true;
           }
-        }, pgBrowser.SecurityGroupUnderSchema, {
+        }, {
           id: 'lanacl', label: gettext('Privileges'), type: 'collection',
           group: 'security', control: 'unique-col-collection', mode: ['edit', 'create'],
           model: pgBrowser.Node.PrivilegeRoleModel.extend({
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/static/js/collation.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/static/js/collation.js
index ad85caa4..d0784ba7 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/static/js/collation.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/static/js/collation.js
@@ -237,8 +237,8 @@ define('pgadmin.node.collation', [
 
             if ('coll-collation' == d._type) {
               //Check if we are not child of catalog
-              prev_i = t.hasParent(i) ? t.parent(i) : null;
-              prev_d = prev_i ? t.itemData(prev_i) : null;
+              var prev_i = t.hasParent(i) ? t.parent(i) : null,
+                prev_d = prev_i ? t.itemData(prev_i) : null;
               if( prev_d._type == 'catalog') {
                 return false;
               } else {
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/static/js/domain.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/static/js/domain.js
index 03fcb5dd..af249006 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/static/js/domain.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/static/js/domain.js
@@ -306,8 +306,8 @@ define('pgadmin.node.domain', [
 
           if ('coll-domain' == d._type) {
             //Check if we are not child of catalog
-            prev_i = t.hasParent(i) ? t.parent(i) : null;
-            prev_d = prev_i ? t.itemData(prev_i) : null;
+            var prev_i = t.hasParent(i) ? t.parent(i) : null,
+              prev_d = prev_i ? t.itemData(prev_i) : null;
             if( prev_d._type == 'catalog') {
               return false;
             } else {
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/static/js/foreign-table.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/static/js/foreign-table.js
index b95bce21..8796c781 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/static/js/foreign-table.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/static/js/foreign-table.js
@@ -25,9 +25,9 @@ define('pgadmin.node.foreign-table', [
         this.$el.empty();
         var model = this.model;
         var column = this.column;
-        editable = this.column.get("editable");
+        var editable = this.column.get("editable");
+        var is_editable = _.isFunction(editable) ? !!editable.apply(column, [model]) : !!editable;
 
-        is_editable = _.isFunction(editable) ? !!editable.apply(column, [model]) : !!editable;
         if (is_editable){ this.$el.addClass("editable"); }
         else { this.$el.removeClass("editable"); }
 
@@ -364,7 +364,7 @@ define('pgadmin.node.foreign-table', [
         cache_node = (cache_node && pgBrowser.Nodes['cache_node']) || node;
 
         m.trigger('pgadmin:view:fetching', m, self.field);
-        data = {attrelid: table_id}
+        var data = {attrelid: table_id}
 
         // Fetching Columns data for the selected table.
         $.ajax({
@@ -591,8 +591,8 @@ define('pgadmin.node.foreign-table', [
           'cache_level': 'database',
           transform: function(d, self){
             if (this.field.get('mode') == 'edit') {
-              oid = this.model.get('oid');
-              s = _.findWhere(d, {'id': oid});
+              var oid = this.model.get('oid');
+              var s = _.findWhere(d, {'id': oid});
               if (s) {
                 d = _.reject(d, s);
               }
@@ -697,8 +697,8 @@ define('pgadmin.node.foreign-table', [
 
           if ('coll-foreign-table' == d._type) {
             //Check if we are not child of catalog
-            prev_i = t.hasParent(i) ? t.parent(i) : null;
-            prev_d = prev_i ? t.itemData(prev_i) : null;
+            var prev_i = t.hasParent(i) ? t.parent(i) : null,
+              prev_d = prev_i ? t.itemData(prev_i) : null;
             if( prev_d._type == 'catalog') {
               return false;
             } else {
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/static/js/fts_configuration.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/static/js/fts_configuration.js
index 996d1f38..a7d36f42 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/static/js/fts_configuration.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/static/js/fts_configuration.js
@@ -14,7 +14,7 @@ define('pgadmin.node.fts_configuration', [
         // Define the schema for the token/dictionary list
         schema: [{
           id: 'token', label:'Token', type:'text', group: null,
-          cellHeaderClasses:'width_percent_50', editable: true,
+          cellHeaderClasses:'width_percent_50',
           editable: false, cell: 'string', url: 'tokens'
         },{
           id: 'dictname', label: 'Dictionaries', type: 'text', group:null,
@@ -57,6 +57,7 @@ define('pgadmin.node.fts_configuration', [
         this, arguments
       );
 
+      var that;
       var self = that = this,
           node = 'fts_configuration',
           headerSchema = [{
@@ -134,7 +135,7 @@ define('pgadmin.node.fts_configuration', [
                   /*
                    * Transform the data
                    */
-                  transform = (this.field.get('transform')
+                  var transform = (this.field.get('transform')
                                 || self.defaults.transform);
                   if (transform && _.isFunction(transform)) {
                     self.field.set('options', transform.bind(self, data));
@@ -338,7 +339,7 @@ define('pgadmin.node.fts_configuration', [
       // Find if token exists in grid
       self.collection.each(function(m) {
         _.each(checkVars, function(v) {
-          val = m.get(v);
+          var val = m.get(v);
           if(val == token) {
             idx = coll.indexOf(m);
           }
@@ -592,8 +593,8 @@ define('pgadmin.node.fts_configuration', [
 
           if ('coll-fts_configuration' == d._type) {
             //Check if we are not child of catalog
-            prev_i = t.hasParent(i) ? t.parent(i) : null;
-            prev_d = prev_i ? t.itemData(prev_i) : null;
+            var prev_i = t.hasParent(i) ? t.parent(i) : null,
+              prev_d = prev_i ? t.itemData(prev_i) : null;
             if( prev_d._type == 'catalog') {
               return false;
             } else {
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/static/js/fts_dictionary.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/static/js/fts_dictionary.js
index bdfddbd4..9f799dd4 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/static/js/fts_dictionary.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/static/js/fts_dictionary.js
@@ -197,8 +197,8 @@ define('pgadmin.node.fts_dictionary', [
 
           if ('coll-fts_dictionary' == d._type) {
             //Check if we are not child of catalog
-            prev_i = t.hasParent(i) ? t.parent(i) : null;
-            prev_d = prev_i ? t.itemData(prev_i) : null;
+            var prev_i = t.hasParent(i) ? t.parent(i) : null,
+              prev_d = prev_i ? t.itemData(prev_i) : null;
             if( prev_d._type == 'catalog') {
               return false;
             } else {
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parser/static/js/fts_parser.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parser/static/js/fts_parser.js
index 289f8af1..d1614027 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parser/static/js/fts_parser.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parser/static/js/fts_parser.js
@@ -112,7 +112,6 @@ define('pgadmin.node.fts_parser', [
           type: 'text', disabled: function(m) { return !m.isNew(); },
           control: 'node-ajax-options', url: 'end_functions',
           group: gettext('Definition'), cache_level: 'database',
-          cache_node: 'schema',
           cache_node: 'schema'
         },{
           id: 'prslextype', label: gettext('Lextypes function'),
@@ -214,8 +213,8 @@ define('pgadmin.node.fts_parser', [
 
           if ('coll-fts_parser' == d._type) {
             //Check if we are not child of catalog
-            prev_i = t.hasParent(i) ? t.parent(i) : null;
-            prev_d = prev_i ? t.itemData(prev_i) : null;
+            var prev_i = t.hasParent(i) ? t.parent(i) : null,
+              prev_d = prev_i ? t.itemData(prev_i) : null;
             if( prev_d._type == 'catalog') {
               return false;
             } else {
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/static/js/fts_template.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/static/js/fts_template.js
index d6acd1c0..b97a4db2 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/static/js/fts_template.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/static/js/fts_template.js
@@ -153,8 +153,8 @@ define('pgadmin.node.fts_template', [
 
           if ('coll-fts_template' == d._type) {
             //Check if we are not child of catalog
-            prev_i = t.hasParent(i) ? t.parent(i) : null;
-            prev_d = prev_i ? t.itemData(prev_i) : null;
+            var prev_i = t.hasParent(i) ? t.parent(i) : null,
+              prev_d = prev_i ? t.itemData(prev_i) : null;
             if( prev_d._type == 'catalog') {
               return false;
             } else {
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/function.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/function.js
index 8e102cc0..416504ae 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/function.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/function.js
@@ -34,7 +34,7 @@ define('pgadmin.node.function', [
         'node-ajax-options', cellHeaderClasses: 'width_percent_30',
         control: 'node-ajax-options', type: 'text', url: 'get_types',
         editable: function(m) {
-          node_info = this.get('node_info');
+          var node_info = this.get('node_info');
           if(node_info && 'catalog' in node_info) {
             return false;
           }
@@ -49,7 +49,7 @@ define('pgadmin.node.function', [
           {'label': 'INOUT', 'value': 'INOUT'},
           {'label': 'VARIADIC', 'value': 'VARIADIC'}
         ], editable: function(m) {
-             node_info = this.get('node_info');
+             var node_info = this.get('node_info');
              if(node_info && 'catalog' in node_info) {
                return false;
              }
@@ -65,7 +65,7 @@ define('pgadmin.node.function', [
     ],
     toJSON: Backbone.Model.prototype.toJSON,
     isInCatalog: function(m){
-      node_info = this.get('node_info');
+      var node_info = this.get('node_info');
       if(node_info && 'catalog' in node_info) {
         return false;
       }
@@ -131,7 +131,7 @@ define('pgadmin.node.function', [
           var isNew = (_.size(attrs) === 0);
           if (isNew) {
             // Set Selected Schema
-            schema_id = args.node_info.schema._id
+            var schema_id = args.node_info.schema._id;
             this.set({'pronamespace': schema_id}, {silent: true});
 
             // Set Current User
@@ -217,7 +217,7 @@ define('pgadmin.node.function', [
           mode: ['create'], visible: 'isVisible'
         },{
           id: 'prorettypename', label: gettext('Return type'), cell: 'string',
-          type: 'text', group: gettext('Definition'), disabled: true,
+          type: 'text', group: gettext('Definition'),
           mode: ['properties', 'edit'], disabled: 'isDisabled', visible: 'isVisible'
         },  {
           id: 'lanname', label: gettext('Language'), cell: 'string',
@@ -457,8 +457,8 @@ define('pgadmin.node.function', [
 
           if ('coll-function' == d._type) {
             //Check if we are not child of catalog
-            prev_i = t.hasParent(i) ? t.parent(i) : null;
-            prev_d = prev_i ? t.itemData(prev_i) : null;
+            var prev_i = t.hasParent(i) ? t.parent(i) : null,
+              prev_d = prev_i ? t.itemData(prev_i) : null;
             if( prev_d._type == 'catalog') {
               return false;
             } else {
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/procedure.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/procedure.js
index 904adc49..89a1fe31 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/procedure.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/procedure.js
@@ -17,7 +17,7 @@ define('pgadmin.node.procedure', [
       });
   };
 
-  pgSchemaNode = pgBrowser.Nodes['schema'];
+  var pgSchemaNode = pgBrowser.Nodes['schema'];
 
   // Inherit Functions Node
   if (!pgBrowser.Nodes['procedure']) {
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/trigger_function.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/trigger_function.js
index 069a2675..c6c9d2f9 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/trigger_function.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/trigger_function.js
@@ -64,7 +64,7 @@ define('pgadmin.node.trigger_function', [
           var isNew = (_.size(attrs) === 0);
           if (isNew) {
             // Set Selected Schema
-            schema_id = args.node_info.schema._id
+            var schema_id = args.node_info.schema._id
             this.set({'pronamespace': schema_id}, {silent: true});
 
             // Set Current User
@@ -153,7 +153,7 @@ define('pgadmin.node.trigger_function', [
           ]
         },{
           id: 'prorettypename', label: gettext('Return type'), cell: 'string',
-          type: 'text', group: gettext('Definition'), disabled: true,
+          type: 'text', group: gettext('Definition'),
           mode: ['properties', 'edit'], disabled: 'isDisabled', visible: 'isVisible'
         },  {
           id: 'lanname', label: gettext('Language'), cell: 'string',
@@ -378,8 +378,8 @@ define('pgadmin.node.trigger_function', [
 
           if ('coll-trigger_function' == d._type) {
             //Check if we are not child of catalog
-            prev_i = t.hasParent(i) ? t.parent(i) : null;
-            prev_d = prev_i ? t.itemData(prev_i) : null;
+            var prev_i = t.hasParent(i) ? t.parent(i) : null,
+              prev_d = prev_i ? t.itemData(prev_i) : null;
             if( prev_d._type == 'catalog') {
               return false;
             } else {
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/static/js/sequence.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/static/js/sequence.js
index a84fb88e..36111610 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/static/js/sequence.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/static/js/sequence.js
@@ -74,8 +74,8 @@ define('pgadmin.node.sequence', [
 
             if ('coll-sequence' == d._type) {
               //Check if we are not child of catalog
-              prev_i = t.hasParent(i) ? t.parent(i) : null;
-              prev_d = prev_i ? t.itemData(prev_i) : null;
+              var prev_i = t.hasParent(i) ? t.parent(i) : null,
+                prev_d = prev_i ? t.itemData(prev_i) : null;
               if( prev_d._type == 'catalog') {
                 return false;
               } else {
@@ -202,7 +202,7 @@ define('pgadmin.node.sequence', [
         validate: function() {
           var msg = undefined,
               minimum = this.get('minimum'),
-              maximum = this.get('maximum');
+              maximum = this.get('maximum'),
               start = this.get('start');
 
           if (_.isUndefined(this.get('name'))
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js
index ef496e73..07d97a22 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js
@@ -13,7 +13,7 @@ define('pgadmin.node.schema', [
     initialize: function() {
       Backform.Control.prototype.initialize.apply(this, arguments);
       var self = this,
-          m = this.model;
+          m = this.model,
           url = self.field.get('url');
 
       if (url && m.isNew()) {
@@ -457,9 +457,9 @@ define('pgadmin.node.schema', [
             return true;
 
             //Check if we are not child of catalog
-            prev_i = t.hasParent(i) ? t.parent(i) : null;
+          var prev_i = t.hasParent(i) ? t.parent(i) : null,
             prev_d = prev_i ? t.itemData(prev_i) : null;
-            if( prev_d && prev_d._type == 'catalog') {
+            if(prev_d && prev_d._type == 'catalog') {
               return false;
             }
           i = t.hasParent(i) ? t.parent(i) : null;
@@ -476,7 +476,7 @@ define('pgadmin.node.schema', [
           t = pgBrowser.tree;
 
       do {
-        d = t.itemData(i);
+        var d = t.itemData(i);
         if (
           d._type in pgBrowser.Nodes && pgBrowser.Nodes[d._type].hasId
         ) {
@@ -509,7 +509,8 @@ define('pgadmin.node.schema', [
           column = this.column,
           editable = this.column.get("editable"),
           input = this.$el.find('input[type=checkbox]').first(),
-          self_name = column.get('name');
+          self_name = column.get('name'),
+          is_editable;
 
         is_editable = _.isFunction(editable) ? !!editable.apply(column, [model]) : !!editable;
         if (is_editable) {
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/templates/check_constraint/js/check_constraint.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/templates/check_constraint/js/check_constraint.js
index 85f62f71..bd31d141 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/templates/check_constraint/js/check_constraint.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/templates/check_constraint/js/check_constraint.js
@@ -51,7 +51,7 @@ define('pgadmin.node.check_constraints', [
       },
       callbacks: {
         validate_check_constraint: function(args) {
-          var input = args || {};
+          var input = args || {},
           obj = this,
           t = pgBrowser.tree,
           i = input.item || t.selected(),
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/templates/exclusion_constraint/js/exclusion_constraint.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/templates/exclusion_constraint/js/exclusion_constraint.js
index 605495d7..065b6096 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/templates/exclusion_constraint/js/exclusion_constraint.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/templates/exclusion_constraint/js/exclusion_constraint.js
@@ -286,7 +286,7 @@ define('pgadmin.node.exclusion_constraint', [
             },
             remove: function () {
               if(self.model.handler) {
-                  tableCols = self.model.top.get('columns');
+                  var tableCols = self.model.top.get('columns');
                   this.stopListening(tableCols, 'remove' , this.removeColumn);
                   this.stopListening(tableCols, 'change:name' , this.resetColOptions);
                   this.stopListening(tableCols, 'change:cltype' , this.resetColOptions);
@@ -561,7 +561,7 @@ define('pgadmin.node.exclusion_constraint', [
         newRow.addClass("new");
         $(newRow).pgMakeVisible('backform-tab');
       } else {
-        delete m;
+        //delete m;
       }
 
       return false;
@@ -770,7 +770,7 @@ define('pgadmin.node.exclusion_constraint', [
           }
         },{
           id: 'columns', label: gettext('Columns'),
-          type: 'collection', group: gettext('Columns'), disabled: false,
+          type: 'collection', group: gettext('Columns'),
           deps:['amname'], canDelete: true, editable: false,
           canAdd: function(m) {
             // We can't update columns of existing exclusion constraint.
@@ -815,7 +815,7 @@ define('pgadmin.node.exclusion_constraint', [
               }, 10);
 
               setTimeout(function () {
-                constraints = self.model.top.get("exclude_constraint");
+                var constraints = self.model.top.get("exclude_constraint");
                 var removed = [];
                 constraints.each(function(constraint) {
                   if (constraint.get("columns").length == 0) {
@@ -837,7 +837,7 @@ define('pgadmin.node.exclusion_constraint', [
               }, 10);
 
               setTimeout(function () {
-                constraints = self.model.top.get("exclude_constraint");
+                var constraints = self.model.top.get("exclude_constraint");
                 var removed = [];
                 constraints.each(function(constraint) {
                   if (constraint.get("columns").length == 0) {
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/templates/foreign_key/js/foreign_key.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/templates/foreign_key/js/foreign_key.js
index a4bec09d..7d742632 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/templates/foreign_key/js/foreign_key.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/templates/foreign_key/js/foreign_key.js
@@ -225,7 +225,7 @@ define('pgadmin.node.foreign_key', [
                 /*
                  * Transform the data
                  */
-                transform = this.field.get('transform') || self.defaults.transform;
+                var transform = this.field.get('transform') || self.defaults.transform;
                 if (transform && _.isFunction(transform)) {
                   // We will transform the data later, when rendering.
                   // It will allow us to generate different data based on the
@@ -494,7 +494,7 @@ define('pgadmin.node.foreign_key', [
         newRow.addClass("new");
         $(newRow).pgMakeVisible('backform-tab');
       } else {
-        delete m;
+        //delete m;
       }
 
       return false;
@@ -534,7 +534,7 @@ define('pgadmin.node.foreign_key', [
 
       var self = this,
           url = 'get_coveringindex',
-          m = self.model
+          m = self.model,
           cols = [],
           coveringindex = null;
 
@@ -610,7 +610,6 @@ define('pgadmin.node.foreign_key', [
       sqlCreateHelp: 'ddl-constraints.html',
       dialogHelp: url_for('help.static', {'filename': 'foreign_key_dialog.html'}),
       hasSQL: true,
-      hasDepends: false,
       parent_type: ['table','partition'],
       canDrop: true,
       canDropCascade: true,
@@ -641,7 +640,7 @@ define('pgadmin.node.foreign_key', [
       },
       callbacks: {
         validate_foreign_key: function(args) {
-          var input = args || {};
+          var input = args || {},
           obj = this,
           t = pgBrowser.tree,
           i = input.item || t.selected(),
@@ -926,7 +925,7 @@ define('pgadmin.node.foreign_key', [
               }, 10);
 
               setTimeout(function () {
-                constraints = self.model.top.get("foreign_key");
+                var constraints = self.model.top.get("foreign_key");
                 var removed = [];
                 constraints.each(function(constraint) {
                   if (constraint.get("columns").length == 0) {
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js
new file mode 100644
index 00000000..f588b8f4
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js
@@ -0,0 +1,539 @@
+define('pgadmin.node.primary_key', [
+  'sources/gettext', 'sources/url_for', 'jquery', 'underscore', 'underscore.string', 'pgadmin',
+  'pgadmin.browser', 'alertify', 'pgadmin.browser.collection'
+], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify) {
+
+  // Extend the browser's node class for index constraint node
+  if (!pgBrowser.Nodes['primary_key']) {
+    pgAdmin.Browser.Nodes['primary_key'] = pgBrowser.Node.extend({
+      type: 'primary_key',
+      label: gettext('Primary key'),
+      collection_type: 'coll-constraints',
+      sqlAlterHelp: 'ddl-alter.html',
+      sqlCreateHelp: 'ddl-constraints.html',
+      dialogHelp: url_for('help.static', {filename: 'primary_key_dialog.html'}),
+      hasSQL: true,
+      hasDepends: true,
+      hasStatistics: true,
+      statsPrettifyFields: ['Index size'],
+      parent_type: 'table',
+      canDrop: true,
+      canDropCascade: true,
+      Init: function() {
+        /* Avoid multiple registration of menus */
+        if (this.initialized)
+            return;
+
+        this.initialized = true;
+
+        pgBrowser.add_menus([{
+          name: 'create_primary_key_on_coll', node: 'coll-constraints', module: this,
+          applies: ['object', 'context'], callback: 'show_obj_properties',
+          category: 'create', priority: 4, label: gettext('Primary key'),
+          icon: 'wcTabIcon icon-primary_key', data: {action: 'create', check: true},
+          enable: 'canCreate'
+
+        }
+        ]);
+      },
+      canCreate: function(itemData, item, data) {
+        // If check is false then , we will allow create menu
+        if (data && data.check == false)
+          return true;
+
+        var t = pgBrowser.tree, i = item, d = itemData, parents = [];
+        // To iterate over tree to check parent node
+        while (i) {
+          // If it is schema then allow user to c reate table
+          if (_.indexOf(['schema'], d._type) > -1) {
+            // There should be only one primary key per table.
+            var children = t.children(arguments[1], false),
+              primary_key_found = false;
+
+            _.each(children, function(child){
+              data = pgBrowser.tree.itemData($(child));
+              if (!primary_key_found && data._type == "primary_key") {
+                primary_key_found = true;
+              }
+            });
+            return !primary_key_found;
+          }
+          parents.push(d._type);
+          i = t.hasParent(i) ? t.parent(i) : null;
+          d = i ? t.itemData(i) : null;
+        }
+        // If node is under catalog then do not allow 'create' menu
+        if (_.indexOf(parents, 'catalog') > -1) {
+          return false;
+        } else {
+            return true;
+        }
+      },
+
+      // Define the model for index constraint node
+      model: pgAdmin.Browser.Node.Model.extend({
+        idAttribute: 'oid',
+
+        defaults: {
+          name: undefined,
+          oid: undefined,
+          comment: undefined,
+          spcname: undefined,
+          index: undefined,
+          fillfactor: undefined,
+          condeferrable: undefined,
+          condeferred: undefined,
+          columns: []
+        },
+
+        // Define the schema for the index constraint node
+        schema: [{
+          id: 'name', label: gettext('Name'), type: 'text',
+          mode: ['properties', 'create', 'edit'], editable:true,
+          cellHeaderClasses:'width_percent_40',
+        },{
+          id: 'oid', label: gettext('OID'), cell: 'string',
+          type: 'text' , mode: ['properties'], editable: false,
+          cellHeaderClasses:'width_percent_20',
+        },{
+          id: 'comment', label: gettext('Comment'), cell: 'string',
+          type: 'multiline', mode: ['properties', 'create', 'edit'],
+          deps:['name'], disabled:function(m) {
+            var name = m.get('name');
+            if (!(name && name != '')) {
+              setTimeout(function(){
+               if(m.get('comment') && m.get('comment') !== '') {
+                 m.set('comment', null);
+               }
+              },10);
+              return true;
+            } else {
+              return false;
+            }
+          }
+        },{
+          id: 'columns', label: gettext('Columns'),
+          type: 'collection', group: gettext('Definition'),
+          editable: false,
+          cell: Backgrid.StringCell.extend({
+            initialize: function() {
+              Backgrid.StringCell.prototype.initialize.apply(this, arguments);
+
+              var self = this,
+                collection = this.model.get('columns');
+
+               // Do not listen for any event(s) for existing constraint.
+              if (_.isUndefined(self.model.get('oid'))) {
+                var tableCols = self.model.top.get('columns');
+                  self.listenTo(tableCols, 'remove' , self.removeColumn);
+                  self.listenTo(tableCols, 'change:name', self.resetColOptions);
+              }
+
+              collection.on('pgadmin:multicolumn:updated', function() {
+                self.render.apply(self);
+              });
+              self.listenTo(collection, "add", self.render);
+              self.listenTo(collection, "remove", self.render);
+            },
+            removeColumn: function(m) {
+              var self = this,
+                  removedCols = self.model.get('columns').where(
+                    {column: m.get('name')}
+                    );
+
+              self.model.get('columns').remove(removedCols);
+              setTimeout(function () {
+                self.render();
+              }, 10);
+
+              var key = 'primary_key'
+              setTimeout(function () {
+                constraints = self.model.top.get(key);
+                var removed = [];
+                constraints.each(function(constraint) {
+                  if (constraint.get("columns").length == 0) {
+                     removed.push(constraint);
+                  }
+                });
+                constraints.remove(removed);
+              },100);
+
+            },
+            resetColOptions : function(m) {
+              var self = this,
+                updatedCols = self.model.get('columns').where(
+                {column: m.previous('name')}
+                );
+              if (updatedCols.length > 0) {
+                /*
+                 * Table column name has changed so update
+                 * column name in primary key as well.
+                 */
+                updatedCols[0].set(
+                {"column": m.get('name')},
+                {silent: true});
+              }
+
+              setTimeout(function () {
+                self.render();
+              }, 10);
+            },
+            formatter: {
+              fromRaw: function (rawValue, model) {
+                return rawValue.pluck("column").toString();
+              },
+              toRaw: function (val, model) {
+                return val;
+              }
+            },
+            render: function() {
+              return Backgrid.StringCell.prototype.render.apply(this, arguments);
+            },
+            remove: function() {
+              var tableCols = this.model.top.get('columns'),
+              primary_key_col = this.model.get('columns');
+
+              if (primary_key_col) {
+                primary_key_col.off('pgadmin:multicolumn:updated');
+              }
+
+              this.stopListening(tableCols, 'remove' , self.removeColumn);
+              this.stopListening(tableCols, 'change:name' , self.resetColOptions);
+
+              Backgrid.StringCell.prototype.remove.apply(this, arguments);
+            }
+          }),
+          canDelete: true, canAdd: true,
+          control: Backform.MultiSelectAjaxControl.extend({
+            defaults: _.extend(
+              {},
+              Backform.NodeListByNameControl.prototype.defaults,
+              {
+                select2: {
+                  multiple: true,
+                  allowClear: true,
+                  width: 'style',
+                  placeholder: gettext('Select the column(s)'),
+                }
+              }
+            ),
+            keyPathAccessor: function(obj, path) {
+              var res = obj;
+              if(_.isArray(res)) {
+                return _.map(res, function(o) { return o['column']
+                });
+              }
+              path = path.split('.');
+              for (var i = 0; i < path.length; i++) {
+                if (_.isNull(res)) return null;
+                if (_.isEmpty(path[i])) continue;
+                if (!_.isUndefined(res[path[i]])) res = res[path[i]];
+              }
+              return _.isObject(res) && !_.isArray(res) ? null : res;
+            },
+            initialize: function() {
+            // Here we will decide if we need to call URL
+            // Or fetch the data from parent columns collection
+              var self = this;
+              if(this.model.handler) {
+                Backform.Select2Control.prototype.initialize.apply(this, arguments);
+                // Do not listen for any event(s) for existing constraint.
+                if (_.isUndefined(self.model.get('oid'))) {
+                  var tableCols = self.model.top.get('columns');
+                  self.listenTo(tableCols, 'remove' , self.resetColOptions);
+                  self.listenTo(tableCols, 'change:name', self.resetColOptions);
+                }
+
+                self.custom_options();
+              } else {
+                Backform.MultiSelectAjaxControl.prototype.initialize.apply(this, arguments);
+              }
+              self.model.get('columns').on('pgadmin:multicolumn:updated', function() {
+                  self.render.apply(self);
+                });
+            },
+            resetColOptions: function(m) {
+              var self = this;
+
+              setTimeout(function () {
+                self.custom_options();
+                self.render.apply(self);
+              }, 50);
+
+            },
+            custom_options: function() {
+              // We will add all the columns entered by user in table model
+              var columns = this.model.top.get('columns'),
+                added_columns_from_tables = [];
+
+              if (columns.length > 0) {
+                _.each(columns.models, function(m) {
+                    var col = m.get('name');
+                    if(!_.isUndefined(col) && !_.isNull(col)) {
+                      added_columns_from_tables.push(
+                        {label: col, value: col, image:'icon-column'}
+                      );
+                    }
+                });
+              }
+              // Set the values in to options so that user can select
+              this.field.set('options', added_columns_from_tables);
+            },
+            onChange: function(e) {
+              var self = this,
+                  model = this.model,
+                  $el = $(e.target),
+                  attrArr = this.field.get("name").split('.'),
+                  name = attrArr.shift(),
+                  path = attrArr.join('.'),
+                  vals = this.getValueFromDOM(),
+                  collection = model.get(name),
+                  removed = [];
+
+              this.stopListening(this.model, "change:" + name, this.render);
+
+              /*
+               * Iterate through all the values, and find out how many are already
+               * present in the collection.
+               */
+              collection.each(function(m) {
+                  var column = m.get('column'),
+                      idx = _.indexOf(vals, column);
+
+                  if (idx > -1) {
+                    vals.splice(idx, 1);
+                  } else {
+                    removed.push(column);
+                  }
+               });
+
+              /*
+               * Adding new values
+               */
+
+              _.each(vals, function(v) {
+                var m = new (self.field.get('model'))(
+                      {column: v}, { silent: true,
+                      top: self.model.top,
+                      collection: collection,
+                      handler: collection
+                    });
+
+                collection.add(m);
+              });
+
+              /*
+               * Removing unwanted!
+               */
+              _.each(removed, function(v) {
+                collection.remove(collection.where({column: v}));
+              });
+
+              this.listenTo(this.model, "change:" + name, this.render);
+            },
+            remove: function() {
+              if(this.model.handler) {
+                var self = this,
+                tableCols = self.model.top.get('columns');
+                self.stopListening(tableCols, 'remove' , self.resetColOptions);
+                self.stopListening(tableCols, 'change:name' , self.resetColOptions);
+                self.model.get('columns').off('pgadmin:multicolumn:updated');
+
+                Backform.Select2Control.prototype.remove.apply(this, arguments);
+
+              } else {
+                Backform.MultiSelectAjaxControl.prototype.remove.apply(this, arguments);
+              }
+            }
+          }),
+          deps: ['index'], node: 'column',
+          model: pgBrowser.Node.Model.extend({
+            defaults: {
+              column: undefined
+            },
+            validate: function() {
+              return null;
+           }
+          }),
+          transform : function(data){
+            var res = [];
+            if (data && _.isArray(data)) {
+              _.each(data, function(d) {
+                res.push({label: d.label, value: d.label, image:'icon-column'});
+              })
+            }
+            return res;
+          },
+          select2:{allowClear:false},
+          disabled: function(m) {
+            // If we are in table edit mode then
+            if (_.has(m, 'top') && !_.isUndefined(m.top)
+                                    && !m.top.isNew()) {
+                // If OID is undefined then user is trying to add
+                // new constraint which should be allowed for Unique
+                return !_.isUndefined(m.get('oid'));
+            }
+
+            // We can't update columns of existing index constraint.
+            if (!m.isNew()) {
+                return true;
+            }
+            // Disable if index is selected.
+            var index = m.get('index');
+              if(_.isUndefined(index) || index == '') {
+                return false;
+              } else {
+                var col = m.get('columns');
+                col.reset();
+                return true;
+              }
+            }
+          },{
+          id: 'spcname', label: gettext('Tablespace'),
+          type: 'text', group: gettext('Definition'),
+          control: 'node-list-by-name', node: 'tablespace',
+          deps: ['index'],
+          select2:{allowClear:false},
+          filter: function(m) {
+            // Don't show pg_global tablespace in selection.
+            if (m.label == "pg_global") return false;
+            else return true;
+          },
+          disabled: function(m) {
+            // Disable if index is selected.
+            m = m.top || m;
+            var index = m.get('index');
+              if(_.isUndefined(index) || index == '') {
+                return false;
+              } else {
+                setTimeout(function(){
+                  m.set('spcname', '');
+                },10);
+                return true;
+              }
+          }
+        },{
+          id: 'index', label: gettext('Index'),
+          type: 'text', group: gettext('Definition'),
+          control: Backform.NodeListByNameControl.extend({
+          initialize:function() {
+            if (_.isUndefined(this.model.top)) {
+              Backform.NodeListByNameControl.prototype.initialize.apply(this,arguments);
+            } else {
+              Backform.Control.prototype.initialize.apply(this,arguments);
+            }
+          }
+          }),
+          select2:{allowClear:true}, node: 'index',
+          disabled: function(m) {
+            // If we are in table edit mode then disable it
+            if (_.has(m, 'top') && !_.isUndefined(m.top)
+                                    && !m.top.isNew()) {
+                return true;
+            }
+
+            // We can't update index of existing index constraint.
+            return !m.isNew();
+          },
+          // We will not show this field in Create Table mode
+          visible: function(m) {
+            return !_.isUndefined(m.top.node_info['table']);
+          }
+        },{
+          id: 'fillfactor', label: gettext('Fill factor'), deps: ['index'],
+          type: 'int', group: gettext('Definition'), allowNull: true,
+          disabled: function(m) {
+            // Disable if index is selected.
+            var index = m.get('index');
+              if(_.isUndefined(index) || index == '') {
+                return false;
+              } else {
+                setTimeout(function(){
+                  m.set('fillfactor', null);
+                },10);
+                return true;
+              }
+            }
+        },{
+          id: 'condeferrable', label: gettext('Deferrable?'),
+          type: 'switch', group: gettext('Definition'), deps: ['index'],
+          disabled: function(m) {
+            // If we are in table edit mode then
+            if (_.has(m, 'top') && !_.isUndefined(m.top)
+                                    && !m.top.isNew()) {
+                // If OID is undefined then user is trying to add
+                // new constraint which should allowed for Unique
+                return !_.isUndefined(m.get('oid'));
+            }
+
+            // We can't update condeferrable of existing index constraint.
+            if (!m.isNew()) {
+                return true;
+            }
+            // Disable if index is selected.
+            var index = m.get('index');
+            if(_.isUndefined(index) || index == '') {
+              return false;
+            } else {
+              setTimeout(function(){
+                if(m.get('condeferrable'))
+                  m.set('condeferrable', false);
+              },10);
+              return true;
+            }
+          }
+        },{
+          id: 'condeferred', label: gettext('Deferred?'),
+          type: 'switch', group: gettext('Definition'),
+          deps: ['condeferrable'],
+          disabled: function(m) {
+            // If we are in table edit mode then
+            if (_.has(m, 'top') && !_.isUndefined(m.top)
+                                    && !m.top.isNew()) {
+                // If OID is undefined then user is trying to add
+                // new constraint which should allowed for Unique
+                return !_.isUndefined(m.get('oid'));
+            }
+
+            // We can't update condeferred of existing index constraint.
+            if (!m.isNew()) {
+              return true;
+            }
+            // Disable if condeferred is false or unselected.
+            if(m.get('condeferrable') == true) {
+              return false;
+            } else {
+              setTimeout(function(){
+               if(m.get('condeferred'))
+                  m.set('condeferred', false);
+              },10);
+              return true;
+            }
+          }
+        }
+        ],
+        validate: function() {
+          this.errorModel.clear();
+          // Clear parent's error as well
+          if (_.has(this, 'top')) {
+            this.top.errorModel.clear();
+          }
+
+          var columns = this.get('columns'),
+            index = this.get('index');
+
+            if ((_.isUndefined(index) || String(index).replace(/^\s+|\s+$/g, '') == '') &&
+                (_.isUndefined(columns) || _.isNull(columns) || columns.length < 1)) {
+              var msg = gettext('Please specify columns for %(node)s', {node: gettext('Primary key')});
+              this.errorModel.set('columns', msg);
+              return msg;
+            }
+
+          return null;
+        }
+      })
+  });
+  }
+
+  return pgBrowser.Nodes['primary_key'];
+});
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js
new file mode 100644
index 00000000..69a92ac1
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js
@@ -0,0 +1,529 @@
+define('pgadmin.node.unique_constraint', [
+  'sources/gettext', 'sources/url_for', 'jquery', 'underscore', 'underscore.string', 'pgadmin',
+  'pgadmin.browser', 'alertify', 'pgadmin.browser.collection'
+], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify) {
+
+  // Extend the browser's node class for index constraint node
+  if (!pgBrowser.Nodes['unique_constraint']) {
+    pgAdmin.Browser.Nodes['unique_constraint'] = pgBrowser.Node.extend({
+      type: 'unique_constraint',
+      label: gettext('Unique constraint'),
+      collection_type: 'coll-constraints',
+      sqlAlterHelp: 'ddl-alter.html',
+      sqlCreateHelp: 'ddl-constraints.html',
+      dialogHelp: url_for('help.static', {filename: 'unique_constraint_dialog.html'}),
+      hasSQL: true,
+      hasDepends: true,
+      hasStatistics: true,
+      statsPrettifyFields: ['Index size'],
+      parent_type: 'table',
+      canDrop: true,
+      canDropCascade: true,
+      Init: function() {
+        /* Avoid multiple registration of menus */
+        if (this.initialized)
+            return;
+
+        this.initialized = true;
+
+        pgBrowser.add_menus([{
+          name: 'create_unique_constraint_on_coll', node: 'coll-constraints', module: this,
+          applies: ['object', 'context'], callback: 'show_obj_properties',
+          category: 'create', priority: 4, label: gettext('Unique constraint'),
+          icon: 'wcTabIcon icon-unique_constraint', data: {action: 'create', check: true},
+          enable: 'canCreate'
+
+        }
+        ]);
+      },
+      canCreate: function(itemData, item, data) {
+        // If check is false then , we will allow create menu
+        if (data && data.check == false)
+          return true;
+
+        var t = pgBrowser.tree, i = item, d = itemData, parents = [];
+        // To iterate over tree to check parent node
+        while (i) {
+          // If it is schema then allow user to c reate table
+          if (_.indexOf(['schema'], d._type) > -1) {
+            return true;
+          }
+          parents.push(d._type);
+          i = t.hasParent(i) ? t.parent(i) : null;
+          d = i ? t.itemData(i) : null;
+        }
+        // If node is under catalog then do not allow 'create' menu
+        if (_.indexOf(parents, 'catalog') > -1) {
+          return false;
+        } else {
+            return true;
+        }
+      },
+
+      // Define the model for index constraint node
+      model: pgAdmin.Browser.Node.Model.extend({
+        idAttribute: 'oid',
+
+        defaults: {
+          name: undefined,
+          oid: undefined,
+          comment: undefined,
+          spcname: undefined,
+          index: undefined,
+          fillfactor: undefined,
+          condeferrable: undefined,
+          condeferred: undefined,
+          columns: []
+        },
+
+        // Define the schema for the index constraint node
+        schema: [{
+          id: 'name', label: gettext('Name'), type: 'text',
+          mode: ['properties', 'create', 'edit'], editable:true,
+          cellHeaderClasses:'width_percent_40',
+        },{
+          id: 'oid', label: gettext('OID'), cell: 'string',
+          type: 'text' , mode: ['properties'], editable: false,
+          cellHeaderClasses:'width_percent_20',
+        },{
+          id: 'comment', label: gettext('Comment'), cell: 'string',
+          type: 'multiline', mode: ['properties', 'create', 'edit'],
+          deps:['name'], disabled:function(m) {
+            var name = m.get('name');
+            if (!(name && name != '')) {
+              setTimeout(function(){
+               if(m.get('comment') && m.get('comment') !== '') {
+                 m.set('comment', null);
+               }
+              },10);
+              return true;
+            } else {
+              return false;
+            }
+          }
+        },{
+          id: 'columns', label: gettext('Columns'),
+          type: 'collection', group: gettext('Definition'),
+          editable: false,
+          cell: Backgrid.StringCell.extend({
+            initialize: function() {
+              Backgrid.StringCell.prototype.initialize.apply(this, arguments);
+
+              var self = this,
+                collection = this.model.get('columns');
+
+               // Do not listen for any event(s) for existing constraint.
+              if (_.isUndefined(self.model.get('oid'))) {
+                var tableCols = self.model.top.get('columns');
+                  self.listenTo(tableCols, 'remove' , self.removeColumn);
+                  self.listenTo(tableCols, 'change:name', self.resetColOptions);
+              }
+
+              collection.on('pgadmin:multicolumn:updated', function() {
+                self.render.apply(self);
+              });
+              self.listenTo(collection, "add", self.render);
+              self.listenTo(collection, "remove", self.render);
+            },
+            removeColumn: function(m) {
+              var self = this,
+                  removedCols = self.model.get('columns').where(
+                    {column: m.get('name')}
+                    );
+
+              self.model.get('columns').remove(removedCols);
+              setTimeout(function () {
+                self.render();
+              }, 10);
+
+              var key = 'unique_constraint'
+              setTimeout(function () {
+                constraints = self.model.top.get(key);
+                var removed = [];
+                constraints.each(function(constraint) {
+                  if (constraint.get("columns").length == 0) {
+                     removed.push(constraint);
+                  }
+                });
+                constraints.remove(removed);
+              },100);
+
+            },
+            resetColOptions : function(m) {
+              var self = this,
+                updatedCols = self.model.get('columns').where(
+                {column: m.previous('name')}
+                );
+              if (updatedCols.length > 0) {
+                /*
+                 * Table column name has changed so update
+                 * column name in primary key as well.
+                 */
+                updatedCols[0].set(
+                {"column": m.get('name')},
+                {silent: true});
+              }
+
+              setTimeout(function () {
+                self.render();
+              }, 10);
+            },
+            formatter: {
+              fromRaw: function (rawValue, model) {
+                return rawValue.pluck("column").toString();
+              },
+              toRaw: function (val, model) {
+                return val;
+              }
+            },
+            render: function() {
+              return Backgrid.StringCell.prototype.render.apply(this, arguments);
+            },
+            remove: function() {
+              var tableCols = this.model.top.get('columns'),
+              primary_key_col = this.model.get('columns');
+
+              if (primary_key_col) {
+                primary_key_col.off('pgadmin:multicolumn:updated');
+              }
+
+              this.stopListening(tableCols, 'remove' , self.removeColumn);
+              this.stopListening(tableCols, 'change:name' , self.resetColOptions);
+
+              Backgrid.StringCell.prototype.remove.apply(this, arguments);
+            }
+          }),
+          canDelete: true, canAdd: true,
+          control: Backform.MultiSelectAjaxControl.extend({
+            defaults: _.extend(
+              {},
+              Backform.NodeListByNameControl.prototype.defaults,
+              {
+                select2: {
+                  multiple: true,
+                  allowClear: true,
+                  width: 'style',
+                  placeholder: gettext('Select the column(s)'),
+                }
+              }
+            ),
+            keyPathAccessor: function(obj, path) {
+              var res = obj;
+              if(_.isArray(res)) {
+                return _.map(res, function(o) { return o['column']
+                });
+              }
+              path = path.split('.');
+              for (var i = 0; i < path.length; i++) {
+                if (_.isNull(res)) return null;
+                if (_.isEmpty(path[i])) continue;
+                if (!_.isUndefined(res[path[i]])) res = res[path[i]];
+              }
+              return _.isObject(res) && !_.isArray(res) ? null : res;
+            },
+            initialize: function() {
+            // Here we will decide if we need to call URL
+            // Or fetch the data from parent columns collection
+              var self = this;
+              if(this.model.handler) {
+                Backform.Select2Control.prototype.initialize.apply(this, arguments);
+                // Do not listen for any event(s) for existing constraint.
+                if (_.isUndefined(self.model.get('oid'))) {
+                  var tableCols = self.model.top.get('columns');
+                  self.listenTo(tableCols, 'remove' , self.resetColOptions);
+                  self.listenTo(tableCols, 'change:name', self.resetColOptions);
+                }
+
+                self.custom_options();
+              } else {
+                Backform.MultiSelectAjaxControl.prototype.initialize.apply(this, arguments);
+              }
+              self.model.get('columns').on('pgadmin:multicolumn:updated', function() {
+                  self.render.apply(self);
+                });
+            },
+            resetColOptions: function(m) {
+              var self = this;
+
+              setTimeout(function () {
+                self.custom_options();
+                self.render.apply(self);
+              }, 50);
+
+            },
+            custom_options: function() {
+              // We will add all the columns entered by user in table model
+              var columns = this.model.top.get('columns'),
+                added_columns_from_tables = [];
+
+              if (columns.length > 0) {
+                _.each(columns.models, function(m) {
+                    var col = m.get('name');
+                    if(!_.isUndefined(col) && !_.isNull(col)) {
+                      added_columns_from_tables.push(
+                        {label: col, value: col, image:'icon-column'}
+                      );
+                    }
+                });
+              }
+              // Set the values in to options so that user can select
+              this.field.set('options', added_columns_from_tables);
+            },
+            onChange: function(e) {
+              var self = this,
+                  model = this.model,
+                  $el = $(e.target),
+                  attrArr = this.field.get("name").split('.'),
+                  name = attrArr.shift(),
+                  path = attrArr.join('.'),
+                  vals = this.getValueFromDOM(),
+                  collection = model.get(name),
+                  removed = [];
+
+              this.stopListening(this.model, "change:" + name, this.render);
+
+              /*
+               * Iterate through all the values, and find out how many are already
+               * present in the collection.
+               */
+              collection.each(function(m) {
+                  var column = m.get('column'),
+                      idx = _.indexOf(vals, column);
+
+                  if (idx > -1) {
+                    vals.splice(idx, 1);
+                  } else {
+                    removed.push(column);
+                  }
+               });
+
+              /*
+               * Adding new values
+               */
+
+              _.each(vals, function(v) {
+                var m = new (self.field.get('model'))(
+                      {column: v}, { silent: true,
+                      top: self.model.top,
+                      collection: collection,
+                      handler: collection
+                    });
+
+                collection.add(m);
+              });
+
+              /*
+               * Removing unwanted!
+               */
+              _.each(removed, function(v) {
+                collection.remove(collection.where({column: v}));
+              });
+
+              this.listenTo(this.model, "change:" + name, this.render);
+            },
+            remove: function() {
+              if(this.model.handler) {
+                var self = this,
+                tableCols = self.model.top.get('columns');
+                self.stopListening(tableCols, 'remove' , self.resetColOptions);
+                self.stopListening(tableCols, 'change:name' , self.resetColOptions);
+                self.model.get('columns').off('pgadmin:multicolumn:updated');
+
+                Backform.Select2Control.prototype.remove.apply(this, arguments);
+
+              } else {
+                Backform.MultiSelectAjaxControl.prototype.remove.apply(this, arguments);
+              }
+            }
+          }),
+          deps: ['index'], node: 'column',
+          model: pgBrowser.Node.Model.extend({
+            defaults: {
+              column: undefined
+            },
+            validate: function() {
+              return null;
+           }
+          }),
+          transform : function(data){
+            var res = [];
+            if (data && _.isArray(data)) {
+              _.each(data, function(d) {
+                res.push({label: d.label, value: d.label, image:'icon-column'});
+              })
+            }
+            return res;
+          },
+          select2:{allowClear:false},
+          disabled: function(m) {
+            // If we are in table edit mode then
+            if (_.has(m, 'top') && !_.isUndefined(m.top)
+                                    && !m.top.isNew()) {
+                // If OID is undefined then user is trying to add
+                // new constraint which should be allowed for Unique
+                return !_.isUndefined(m.get('oid'));
+            }
+
+            // We can't update columns of existing index constraint.
+            if (!m.isNew()) {
+                return true;
+            }
+            // Disable if index is selected.
+            var index = m.get('index');
+              if(_.isUndefined(index) || index == '') {
+                return false;
+              } else {
+                var col = m.get('columns');
+                col.reset();
+                return true;
+              }
+            }
+          },{
+          id: 'spcname', label: gettext('Tablespace'),
+          type: 'text', group: gettext('Definition'),
+          control: 'node-list-by-name', node: 'tablespace',
+          deps: ['index'],
+          select2:{allowClear:false},
+          filter: function(m) {
+            // Don't show pg_global tablespace in selection.
+            if (m.label == "pg_global") return false;
+            else return true;
+          },
+          disabled: function(m) {
+            // Disable if index is selected.
+            m = m.top || m;
+            var index = m.get('index');
+              if(_.isUndefined(index) || index == '') {
+                return false;
+              } else {
+                setTimeout(function(){
+                  m.set('spcname', '');
+                },10);
+                return true;
+              }
+          }
+        },{
+          id: 'index', label: gettext('Index'),
+          type: 'text', group: gettext('Definition'),
+          control: Backform.NodeListByNameControl.extend({
+          initialize:function() {
+            if (_.isUndefined(this.model.top)) {
+              Backform.NodeListByNameControl.prototype.initialize.apply(this,arguments);
+            } else {
+              Backform.Control.prototype.initialize.apply(this,arguments);
+            }
+          }
+          }),
+          select2:{allowClear:true}, node: 'index',
+          disabled: function(m) {
+            // If we are in table edit mode then disable it
+            if (_.has(m, 'top') && !_.isUndefined(m.top)
+                                    && !m.top.isNew()) {
+                return true;
+            }
+
+            // We can't update index of existing index constraint.
+            return !m.isNew();
+          },
+          // We will not show this field in Create Table mode
+          visible: function(m) {
+            return !_.isUndefined(m.top.node_info['table']);
+          }
+        },{
+          id: 'fillfactor', label: gettext('Fill factor'), deps: ['index'],
+          type: 'int', group: gettext('Definition'), allowNull: true,
+          disabled: function(m) {
+            // Disable if index is selected.
+            var index = m.get('index');
+              if(_.isUndefined(index) || index == '') {
+                return false;
+              } else {
+                setTimeout(function(){
+                  m.set('fillfactor', null);
+                },10);
+                return true;
+              }
+            }
+        },{
+          id: 'condeferrable', label: gettext('Deferrable?'),
+          type: 'switch', group: gettext('Definition'), deps: ['index'],
+          disabled: function(m) {
+            // If we are in table edit mode then
+            if (_.has(m, 'top') && !_.isUndefined(m.top)
+                                    && !m.top.isNew()) {
+                // If OID is undefined then user is trying to add
+                // new constraint which should allowed for Unique
+                return !_.isUndefined(m.get('oid'));
+            }
+
+            // We can't update condeferrable of existing index constraint.
+            if (!m.isNew()) {
+                return true;
+            }
+            // Disable if index is selected.
+            var index = m.get('index');
+            if(_.isUndefined(index) || index == '') {
+              return false;
+            } else {
+              setTimeout(function(){
+                if(m.get('condeferrable'))
+                  m.set('condeferrable', false);
+              },10);
+              return true;
+            }
+          }
+        },{
+          id: 'condeferred', label: gettext('Deferred?'),
+          type: 'switch', group: gettext('Definition'),
+          deps: ['condeferrable'],
+          disabled: function(m) {
+            // If we are in table edit mode then
+            if (_.has(m, 'top') && !_.isUndefined(m.top)
+                                    && !m.top.isNew()) {
+                // If OID is undefined then user is trying to add
+                // new constraint which should allowed for Unique
+                return !_.isUndefined(m.get('oid'));
+            }
+
+            // We can't update condeferred of existing index constraint.
+            if (!m.isNew()) {
+              return true;
+            }
+            // Disable if condeferred is false or unselected.
+            if(m.get('condeferrable') == true) {
+              return false;
+            } else {
+              setTimeout(function(){
+               if(m.get('condeferred'))
+                  m.set('condeferred', false);
+              },10);
+              return true;
+            }
+          }
+        }
+        ],
+        validate: function() {
+          this.errorModel.clear();
+          // Clear parent's error as well
+          if (_.has(this, 'top')) {
+            this.top.errorModel.clear();
+          }
+
+          var columns = this.get('columns'),
+            index = this.get('index');
+
+            if ((_.isUndefined(index) || String(index).replace(/^\s+|\s+$/g, '') == '') &&
+                (_.isUndefined(columns) || _.isNull(columns) || columns.length < 1)) {
+              var msg = gettext('Please specify columns for %(node)s', {node: gettext('Unique constraint')});
+              this.errorModel.set('columns', msg);
+              return msg;
+            }
+
+          return null;
+        }
+      })
+  });
+  }
+
+  return pgBrowser.Nodes['unique_constraint'];
+});
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/templates/constraints/js/constraints.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/templates/constraints/js/constraints.js
index e372b3cc..6c3af6ff 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/templates/constraints/js/constraints.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/templates/constraints/js/constraints.js
@@ -1,6 +1,8 @@
 define('pgadmin.node.constraints', [
   'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'pgadmin',
-  'pgadmin.browser', 'pgadmin.browser.collection'{% for c in constraints %}, 'pgadmin.node.{{ c|safe }}'{%endfor%}
+  'pgadmin.browser', 'pgadmin.browser.collection', 'pgadmin.node.unique_constraint',
+  'pgadmin.node.check_constraints', 'pgadmin.node.foreign_key',
+  'pgadmin.node.exclusion_constraint', 'pgadmin.node.primary_key'
 ], function(gettext, $, _, S, pgAdmin, pgBrowser) {
 
   if (!pgBrowser.Nodes['coll-constraints']) {
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/templates/index/js/index.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/templates/index/js/index.js
index 4fc1d54a..0bb2d40f 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/templates/index/js/index.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/templates/index/js/index.js
@@ -32,7 +32,7 @@ define('pgadmin.node.index', [
           editable = this.column.get("editable"),
           input = this.$el.find('select').first();
 
-        is_editable = _.isFunction(editable) ? !!editable.apply(column, [model]) : !!editable;
+        var is_editable = _.isFunction(editable) ? !!editable.apply(column, [model]) : !!editable;
         if (is_editable) {
            this.$el.addClass("editable");
            input.prop('disabled', false);
@@ -165,7 +165,7 @@ define('pgadmin.node.index', [
 
           if (_.isUndefined(this.get('colname'))
               || String(this.get('colname')).replace(/^\s+|\s+$/g, '') == '') {
-            msg = gettext('Column Name cannot be empty.');
+            var msg = gettext('Column Name cannot be empty.');
             this.errorModel.set('colname', msg);
             return msg;
           }
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/templates/rules/js/rules.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/templates/rules/js/rules.js
index db91af32..19fcad2e 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/templates/rules/js/rules.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/templates/rules/js/rules.js
@@ -230,12 +230,12 @@ define('pgadmin.node.rule', [
           if ('coll-rule' == d._type) {
 
             //Check if we are not child of rule
-            prev_i = t.hasParent(i) ? t.parent(i) : null;
-            prev_d = prev_i ? t.itemData(prev_i) : null;
-            prev_j = t.hasParent(prev_i) ? t.parent(prev_i) : null;
-            prev_e = prev_j ? t.itemData(prev_j) : null;
-            prev_k = t.hasParent(prev_j) ? t.parent(prev_j) : null;
-            prev_f = prev_k ? t.itemData(prev_k) : null;
+            var prev_i = t.hasParent(i) ? t.parent(i) : null,
+              prev_d = prev_i ? t.itemData(prev_i) : null,
+              prev_j = t.hasParent(prev_i) ? t.parent(prev_i) : null,
+              prev_e = prev_j ? t.itemData(prev_j) : null,
+              prev_k = t.hasParent(prev_j) ? t.parent(prev_j) : null,
+              prev_f = prev_k ? t.itemData(prev_k) : null;
             if( prev_f._type == 'catalog') {
               return false;
             } else {
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/partition.utils.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/partition.utils.js
index a1b7a9aa..080118a9 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/partition.utils.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/partition.utils.js
@@ -1,4 +1,4 @@
-define(
+define('pgadmin.node.table_partition_utils',
         ['sources/gettext', 'jquery', 'underscore', 'pgadmin.browser',
         'backform','backgrid', 'pgadmin.browser.collection'],
 function(gettext, $, _, pgBrowser, Backform, Backgrid) {
@@ -205,21 +205,21 @@ function(gettext, $, _, pgBrowser, Backform, Backgrid) {
 
       if (_.isUndefined(col_type) || _.isNull(col_type) ||
         String(col_type).replace(/^\s+|\s+$/g, '') == '') {
-        msg = gettext('Partition key type cannot be empty.');
+        var msg = gettext('Partition key type cannot be empty.');
         this.errorModel.set('key_type', msg);
         return msg;
       }
       else if (col_type == 'column' &&
         _.isUndefined(pt_column) || _.isNull(pt_column) ||
         String(pt_column).replace(/^\s+|\s+$/g, '') == '') {
-        msg = gettext('Partition key column cannot be empty.');
+        var msg = gettext('Partition key column cannot be empty.');
         this.errorModel.set('pt_column', msg);
         return msg;
       }
       else if (col_type == 'expression' &&
         _.isUndefined(expression) || _.isNull(expression) ||
         String(expression).replace(/^\s+|\s+$/g, '') == '') {
-        msg = gettext('Partition key expression cannot be empty.');
+        var msg = gettext('Partition key expression cannot be empty.');
         this.errorModel.set('expression', msg);
         return msg;
       }
@@ -306,7 +306,7 @@ function(gettext, $, _, pgBrowser, Backform, Backgrid) {
 
       if (_.isUndefined(partition_name) || _.isNull(partition_name) ||
        String(partition_name).replace(/^\s+|\s+$/g, '') == '') {
-       msg = gettext('Partition name cannot be empty.');
+       var msg = gettext('Partition name cannot be empty.');
        this.errorModel.set('partition_name', msg);
        return msg;
       }
@@ -314,19 +314,19 @@ function(gettext, $, _, pgBrowser, Backform, Backgrid) {
       if (this.top.get('partition_type') == 'range') {
         if (_.isUndefined(values_from) || _.isNull(values_from) ||
           String(values_from).replace(/^\s+|\s+$/g, '') == '') {
-          msg = gettext('For range partition From field cannot be empty.');
+          var msg = gettext('For range partition From field cannot be empty.');
           this.errorModel.set('values_from', msg);
           return msg;
         } else if (_.isUndefined(values_to) || _.isNull(values_to) ||
           String(values_to).replace(/^\s+|\s+$/g, '') == '') {
-          msg = gettext('For range partition To field cannot be empty.');
+          var msg = gettext('For range partition To field cannot be empty.');
           this.errorModel.set('values_to', msg);
           return msg;
         }
       } else if (this.top.get('partition_type') == 'list') {
         if (_.isUndefined(values_in) || _.isNull(values_in) ||
           String(values_in).replace(/^\s+|\s+$/g, '') == '') {
-          msg = gettext('For list partition In field cannot be empty.');
+          var msg = gettext('For list partition In field cannot be empty.');
           this.errorModel.set('values_in', msg);
           return msg;
         }
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js
index faa8b7de..2bbd924d 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js
@@ -114,7 +114,7 @@ define('pgadmin.node.table', [
         set_triggers: function(args, params) {
           // This function will send request to enable or
           // disable triggers on table level
-          var input = args || {};
+          var input = args || {},
           obj = this,
           t = pgBrowser.tree,
           i = input.item || t.selected(),
@@ -162,7 +162,7 @@ define('pgadmin.node.table', [
             this.callbacks.truncate.apply(this, [args, params]);
         },
         truncate: function(args, params) {
-          var input = args || {};
+          var input = args || {},
           obj = this,
           t = pgBrowser.tree,
           i = input.item || t.selected(),
@@ -708,7 +708,7 @@ define('pgadmin.node.table', [
           }]
         },{
           id: 'typname', label: gettext('Of type'), type: 'text',
-          control: 'node-ajax-options', mode: ['properties', 'create', 'edit'],
+          mode: ['properties', 'create', 'edit'],
           disabled: 'checkOfType', url: 'get_oftype', group: gettext('Advanced'),
           deps: ['coll_inherits'], transform: function(data, cell) {
             var control = cell || this,
@@ -1244,7 +1244,7 @@ define('pgadmin.node.table', [
           var self = this,
               url = 'get_columns',
               m = self.model.top || self.model,
-              old_columns = _.clone(m.get('columns'))
+              old_columns = _.clone(m.get('columns')),
               data = undefined,
               node = this.field.get('schema_node'),
               node_info = this.field.get('node_info'),
@@ -1291,7 +1291,7 @@ define('pgadmin.node.table', [
 
             if ('coll-table' == d._type) {
               //Check if we are not child of catalog
-              prev_i = t.hasParent(i) ? t.parent(i) : null;
+              var prev_i = t.hasParent(i) ? t.parent(i) : null,
               prev_d = prev_i ? t.itemData(prev_i) : null;
               if( prev_d._type == 'catalog') {
                 return false;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js
index da24e2bf..0a0491a9 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js
@@ -24,9 +24,9 @@ define('pgadmin.node.type', [
         this.$el.empty();
         var model = this.model;
         var column = this.column;
-        editable = this.column.get("editable");
+        var editable = this.column.get("editable");
 
-        is_editable = _.isFunction(editable) ? !!editable.apply(column, [model]) : !!editable;
+        var is_editable = _.isFunction(editable) ? !!editable.apply(column, [model]) : !!editable;
         if (is_editable){ this.$el.addClass("editable"); }
         else { this.$el.removeClass("editable"); }
 
@@ -48,7 +48,7 @@ define('pgadmin.node.type', [
           editable = this.column.get("editable"),
           input = this.$el.find('select').first();
 
-        is_editable = _.isFunction(editable) ? !!editable.apply(column, [model]) : !!editable;
+        var is_editable = _.isFunction(editable) ? !!editable.apply(column, [model]) : !!editable;
         if (is_editable) {
            this.$el.addClass("editable");
            input.prop('disabled', false);
@@ -337,7 +337,6 @@ define('pgadmin.node.type', [
           id: 'typtype', label: gettext('Type'),
           mode: ['create','edit'], disabled: 'inSchemaWithModelCheck',
           group: gettext('Definition'),
-          mode: ['edit', 'create'],
           select2: { width: "50%", allowClear: false },
           options: function(obj) {
               return [
@@ -929,7 +928,7 @@ define('pgadmin.node.type', [
 
             if ('coll-type' == d._type) {
               //Check if we are not child of catalog
-              prev_i = t.hasParent(i) ? t.parent(i) : null;
+              var prev_i = t.hasParent(i) ? t.parent(i) : null,
               prev_d = prev_i ? t.itemData(prev_i) : null;
               if( prev_d._type == 'catalog') {
                 return false;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js
index 24981071..22733268 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js
@@ -261,8 +261,8 @@ define('pgadmin.node.mview', [
           if ('coll-mview' == d._type) {
 
             // Check if we are not child of view
-            prev_i = t.hasParent(i) ? t.parent(i) : null;
-            prev_d = prev_i ? t.itemData(prev_i) : null;
+            var prev_i = t.hasParent(i) ? t.parent(i) : null,
+              prev_d = prev_i ? t.itemData(prev_i) : null;
             if( prev_d._type == 'catalog') {
               return false;
             } else {
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js
index da4de276..d6c794e6 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js
@@ -113,8 +113,7 @@ define('pgadmin.node.view', [
           id: 'schema', label: gettext('Schema'), cell: 'string', first_empty: false,
           control: 'node-list-by-name', type: 'text', cache_level: 'database',
           node: 'schema', disabled: 'notInSchema', mode: ['create', 'edit'],
-          select2: { allowClear: false }, cache_node: 'database',
-          cache_level: 'database'
+          select2: { allowClear: false }, cache_node: 'database'
         },{
           id: 'system_view', label: gettext('System view?'), cell: 'string',
           type: 'switch', disabled: true, mode: ['properties']
@@ -221,8 +220,8 @@ define('pgadmin.node.view', [
           if ('coll-view' == d._type) {
 
             // Check if we are not child of view
-            prev_i = t.hasParent(i) ? t.parent(i) : null;
-            prev_d = prev_i ? t.itemData(prev_i) : null;
+            var prev_i = t.hasParent(i) ? t.parent(i) : null,
+              prev_d = prev_i ? t.itemData(prev_i) : null;
             if( prev_d._type == 'catalog') {
               return false;
             } else {
diff --git a/web/pgadmin/browser/server_groups/servers/databases/static/js/database.js b/web/pgadmin/browser/server_groups/servers/databases/static/js/database.js
index e3797338..d2d4c48c 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/static/js/database.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/static/js/database.js
@@ -1,6 +1,6 @@
 define('pgadmin.node.database', [
   'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
-  'underscore.string', 'pgadmin', 'pgadmin.browser', 'alertify',
+  'underscore.string', 'pgadmin', 'pgadmin.browser.utils', 'alertify',
   'sources/alerts/alertify_wrapper',
 
   'pgadmin.browser.collection', 'pgadmin.browser.server.privilege',
diff --git a/web/pgadmin/browser/server_groups/servers/static/js/privilege.js b/web/pgadmin/browser/server_groups/servers/static/js/privilege.js
index e89fdbfa..49e705eb 100644
--- a/web/pgadmin/browser/server_groups/servers/static/js/privilege.js
+++ b/web/pgadmin/browser/server_groups/servers/static/js/privilege.js
@@ -1,31 +1,5 @@
-(function(root, factory) {
-  // Set up Backform appropriately for the environment. Start with AMD.
-  if (typeof define === 'function' && define.amd) {
-    define(['sources/gettext', 'underscore', 'jquery', 'backbone', 'backform', 'backgrid', 'alertify', 'pgadmin.browser.node'],
-     function(gettext, _, $, Backbone, Backform, Backgrid, Alertify, pgNode) {
-      // Export global even in AMD case in case this script is loaded with
-      // others that may still expect a global Backform.
-      return factory(root, gettext, _, $, Backbone, Backform, Backgrid, Alertify, pgNode);
-    });
-
-  // Next for Node.js or CommonJS. jQuery may not be needed as a module.
-  } else if (typeof exports !== 'undefined') {
-    var _ = require('underscore') || root._,
-      $ = root.jQuery || root.$ || root.Zepto || root.ender,
-      Backbone = require('backbone') || root.Backbone,
-      Backform = require('backform') || root.Backform;
-      Backgrid = require('backgrid') || root.Backgrid;
-      Alertify = require('alertify') || root.Alertify;
-      pgAdmin = require('pgadmin.browser.node') || root.pgAdmin.Browser.Node,
-      gettext = require('sources/gettext') || root.gettext;
-    factory(root, gettext, _, $, Backbone, Backform, Alertify, pgNode);
-
-  // Finally, as a browser global.
-  } else {
-    factory(root, root.gettext, root._, (root.jQuery || root.Zepto || root.ender || root.$), root.Backbone, root.Backform, root.Backgrid, root.alertify, root.pgAdmin.Browser.Node);
-  }
-} (this, function(root, gettext, _, $, Backbone, Backform, Backgrid, Alertify, pgNode) {
-
+define(['sources/gettext', 'underscore', 'jquery', 'backbone', 'backform', 'backgrid', 'alertify', 'pgadmin.browser.node', 'pgadmin.browser.node.ui'],
+ function(gettext, _, $, Backbone, Backform, Backgrid, Alertify, pgNode) {
   /**
    * Each Privilege, supporeted by an database object, will be represented
    * using this Model.
@@ -706,4 +680,4 @@
 
   return PrivilegeRoleModel;
 
-}));
+});
diff --git a/web/pgadmin/browser/server_groups/servers/static/js/server.js b/web/pgadmin/browser/server_groups/servers/static/js/server.js
index 0fad2f62..c57a0e24 100644
--- a/web/pgadmin/browser/server_groups/servers/static/js/server.js
+++ b/web/pgadmin/browser/server_groups/servers/static/js/server.js
@@ -3,7 +3,7 @@ define('pgadmin.node.server', [
   'underscore.string', 'pgadmin', 'pgadmin.browser', 'alertify',
   'pgadmin.server.supported_servers',
   'pgadmin.user_management.current_user',
-  'sources/alerts/alertify_wrapper',
+  'sources/alerts/alertify_wrapper', 'pgadmin.browser.server.privilege'
 ], function(
   gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify,
   supported_servers, current_user, AlertifyWrapper
@@ -1037,7 +1037,7 @@ define('pgadmin.node.server', [
       };
 
       data.is_connecting = true;
-      url = obj.generate_url(item, "connect", data, true);
+      var url = obj.generate_url(item, "connect", data, true);
       $.post(url)
       .done(function(res) {
         if (res.success == 1) {
diff --git a/web/pgadmin/browser/server_groups/servers/static/js/variable.js b/web/pgadmin/browser/server_groups/servers/static/js/variable.js
index de274263..a02ba62a 100644
--- a/web/pgadmin/browser/server_groups/servers/static/js/variable.js
+++ b/web/pgadmin/browser/server_groups/servers/static/js/variable.js
@@ -1,36 +1,8 @@
-(function(root, factory) {
-  // Set up Backform appropriately for the environment. Start with AMD.
-  if (typeof define === 'function' && define.amd) {
-    define([
-      'underscore', 'jquery', 'backbone', 'backform', 'backgrid', 'alertify',
-      'pgadmin', 'pgadmin.browser.node', 'pgadmin.browser.node.ui'
-      ],
-     function(_, $, Backbone, Backform, Backgrid, Alertify, pgAdmin, pgNode) {
-      // Export global even in AMD case in case this script is loaded with
-      // others that may still expect a global Backform.
-      return factory(root, _, $, Backbone, Backform, Alertify, pgAdmin, pgNode);
-    });
-
-  // Next for Node.js or CommonJS. jQuery may not be needed as a module.
-  } else if (typeof exports !== 'undefined') {
-    var _ = require('underscore') || root._,
-      $ = root.jQuery || root.$ || root.Zepto || root.ender,
-      Backbone = require('backbone') || root.Backbone,
-      Backform = require('backform') || root.Backform;
-      Alertify = require('alertify') || root.Alertify;
-      pgAdmin = require('pgadmin') || root.pgAdmin,
-      pgNode = require('pgadmin.browser.node') || root.pgAdmin.Browser.Node;
-
-    factory(root, _, $, Backbone, Backform, Alertify, pgAdmin, pgNode);
-
-  // Finally, as a browser global.
-  } else {
-    factory(
-        root, root._, (root.jQuery || root.Zepto || root.ender || root.$),
-        root.Backbone, root.Backform, root.pgAdmin.Browser.Node
-        );
-  }
-} (this, function(root, _, $, Backbone, Backform, Alertify, pgAdmin, pgNode) {
+define([
+  'underscore', 'jquery', 'backbone', 'backform', 'backgrid', 'alertify',
+  'pgadmin', 'pgadmin.browser.node', 'pgadmin.browser.node.ui'
+  ],
+ function(_, $, Backbone, Backform, Backgrid, Alertify, pgAdmin, pgNode) {
 
   /*
    * cellFunction for variable control.
@@ -159,7 +131,7 @@
     },
     schema: [
       {
-        id: 'name', label:'Name', type:'text', editable: true, cellHeaderClasses: 'width_percent_30',
+        id: 'name', label:'Name', type:'text', cellHeaderClasses: 'width_percent_30',
         editable: function(m) {
           return (m instanceof Backbone.Collection) ? true : m.isNew();
         },
@@ -513,8 +485,6 @@
 
         newRow.addClass("new");
         $(newRow).pgMakeVisible('backform-tab');
-      } else {
-        delete m;
       }
 
       return false;
@@ -522,4 +492,4 @@
   });
 
   return VariableModel;
-}));
+});
diff --git a/web/pgadmin/browser/server_groups/static/js/server-group.js b/web/pgadmin/browser/server_groups/static/js/server-group.js
index 2c58ea87..eb551244 100644
--- a/web/pgadmin/browser/server_groups/static/js/server-group.js
+++ b/web/pgadmin/browser/server_groups/static/js/server-group.js
@@ -1,4 +1,4 @@
-define('pgadmin.node.server-group', [
+define('pgadmin.node.server_group', [
   'sources/gettext', 'sources/url_for', 'jquery', 'underscore', 'pgadmin',
   'backbone', 'pgadmin.browser', 'pgadmin.browser.node'
 ], function(gettext, url_for, $, _, pgAdmin, Backbone) {
diff --git a/web/pgadmin/browser/static/js/datamodel.js b/web/pgadmin/browser/static/js/datamodel.js
index ad8f95f1..e47ce95b 100644
--- a/web/pgadmin/browser/static/js/datamodel.js
+++ b/web/pgadmin/browser/static/js/datamodel.js
@@ -52,8 +52,6 @@ function(_, S, pgAdmin, $, Backbone) {
                     }
                   }
                   else {
-                    if (obj)
-                      delete obj;
                     obj = null;
                   }
                   self.set(s.id, obj, {silent: true});
@@ -81,8 +79,6 @@ function(_, S, pgAdmin, $, Backbone) {
                     }
                     obj.set(val, {parse: true, silent: true});
                   } else {
-                    if (obj)
-                      delete obj;
                     obj = null;
                   }
                   res[s.id] = obj;
@@ -258,19 +254,16 @@ function(_, S, pgAdmin, $, Backbone) {
         if (opts && opts.stop)
             this.stopSession();
 
-        for(id in this.objects) {
+        for(var id in this.objects) {
           obj = this.get(id);
 
           if (obj) {
             if (obj instanceof pgBrowser.DataModel) {
               obj.reset(opts);
-              delete obj;
             } else if (obj instanceof Backbone.Model) {
               obj.clear(opts);
-              delete obj;
             } else if (obj instanceof pgBrowser.DataCollection) {
               obj.reset(opts);
-              delete obj;
             } else if (obj instanceof Backbone.Collection) {
               obj.each(function(m) {
                 if (m instanceof Backbone.DataModel) {
@@ -280,7 +273,6 @@ function(_, S, pgAdmin, $, Backbone) {
               });
               if (!(opts instanceof Array)){ opts = [opts] }
               Backbone.Collection.prototype.reset.apply(obj, opts);
-              delete obj;
             }
           }
         }
@@ -331,7 +323,7 @@ function(_, S, pgAdmin, $, Backbone) {
               self = this,
               msg;
 
-          attrChanged = function(v, k) {
+          var attrChanged = function(v, k) {
             if (k in self.objects) {
               return;
             }
@@ -520,7 +512,7 @@ function(_, S, pgAdmin, $, Backbone) {
           if (!objName) {
             var hasPrimaryKey = obj.primary_key &&
                   typeof(obj.primary_key) === 'function';
-                key = hasPrimaryKey ? obj.primary_key() : obj.cid,
+              var key = hasPrimaryKey ? obj.primary_key() : obj.cid,
                 comparator = hasPrimaryKey ?
                   function(k) {
                     var o = self.get('k');
@@ -570,7 +562,7 @@ function(_, S, pgAdmin, $, Backbone) {
           if (!objName) {
               var hasPrimaryKey = (obj.primary_key &&
                 (typeof(obj.primary_key) === 'function'));
-              key = hasPrimaryKey ? obj.primary_key() : obj.cid,
+              var key = hasPrimaryKey ? obj.primary_key() : obj.cid,
               comparator = hasPrimaryKey ?
                 function(k) {
                   var o = self.get('k');
@@ -614,7 +606,7 @@ function(_, S, pgAdmin, $, Backbone) {
               };
 
           if (obj instanceof Backbone.Collection) {
-            for (idx in obj.models) {
+            for (var idx in obj.models) {
               if (validate(obj.models[idx]))
                 break;
             }
@@ -1248,7 +1240,7 @@ function(_, S, pgAdmin, $, Backbone) {
           self.clearInvalidSessionIfModelValid(m);
         }
 
-        new_conflicting_models = self.where(condition);
+        var new_conflicting_models = self.where(condition);
         if (new_conflicting_models.length == 0) {
           self.clearInvalidSessionIfModelValid(model);
         } else if (new_conflicting_models.length == 1) {
diff --git a/web/pgadmin/browser/static/js/node.ui.js b/web/pgadmin/browser/static/js/node.ui.js
index 954aacc6..0831c1b9 100644
--- a/web/pgadmin/browser/static/js/node.ui.js
+++ b/web/pgadmin/browser/static/js/node.ui.js
@@ -1,8 +1,8 @@
 define([
-  'sources/gettext', 'jquery', 'underscore', 'pgadmin', 'backbone', 'backform', 'alertify',
-  'pgadmin.browser.node'
+  'sources/gettext', 'jquery', 'underscore', 'pgadmin', 'backbone', 'backform',
+   'alertify', 'backgrid', 'select2', 'pgadmin.browser.node'
 ],
-function(gettext, $, _, pgAdmin, Backbone, Backform, Alertify, Node) {
+function(gettext, $, _, pgAdmin, Backbone, Backform, Alertify, Backgrid) {
 
   var pgBrowser = pgAdmin.Browser;
 
@@ -169,7 +169,7 @@ function(gettext, $, _, pgAdmin, Backbone, Backform, Alertify, Node) {
         /*
          * Transform the data
          */
-        transform = this.field.get('transform') || self.defaults.transform;
+        var transform = this.field.get('transform') || self.defaults.transform;
         if (transform && _.isFunction(transform)) {
           // We will transform the data later, when rendering.
           // It will allow us to generate different data based on the
@@ -405,7 +405,7 @@ function(gettext, $, _, pgAdmin, Backbone, Backform, Alertify, Node) {
         /*
          * Transform the data
          */
-        transform = column.get('transform') || self.defaults.transform;
+        var transform = column.get('transform') || self.defaults.transform;
         if (transform && _.isFunction(transform)) {
           // We will transform the data later, when rendering.
           // It will allow us to generate different data based on the
diff --git a/web/pgadmin/browser/static/js/wizard.js b/web/pgadmin/browser/static/js/wizard.js
index 2e65c6bf..0becb2d5 100644
--- a/web/pgadmin/browser/static/js/wizard.js
+++ b/web/pgadmin/browser/static/js/wizard.js
@@ -133,7 +133,7 @@ function(_, Backbone, pgAdmin, pgBrowser) {
       this.options.disable_prev = (this.options.disable_prev ? true : this.evalASFunc(this.currPage.disable_prev));
       this.options.disable_cancel = (this.currPage.canCancel ? true : this.evalASFunc(this.currPage.disable_cancel));
 
-      that = this;
+      var that = this;
 
       /* HTML Content */
       if (data.html) { data.content = data.html; }
@@ -149,10 +149,9 @@ function(_, Backbone, pgAdmin, pgBrowser) {
       return this;
     },
     nextPage: function() {
-      this.options.curr_page.el = this.$el;
       if (!this.beforeNext()) { return false; }
 
-      page_id = this.onNext();
+      var page_id = this.onNext();
 
       if (page_id ) {
         this.currPage = this.collection.get(page_id).toJSON();
@@ -171,7 +170,7 @@ function(_, Backbone, pgAdmin, pgBrowser) {
     prevPage: function() {
       if (!this.beforePrev()) { return false; }
 
-      page_id = this.onPrev();
+      var page_id = this.onPrev();
 
       if (page_id){
         this.currPage = this.collection.get(page_id).toJSON();
@@ -264,16 +263,16 @@ function(_, Backbone, pgAdmin, pgBrowser) {
     },
     onDialogHelp: function() {
       // See if we can find an existing panel, if not, create one
-      pnlDialogHelp = pgBrowser.docker.findPanels('pnl_online_help')[0];
+      var pnlDialogHelp = pgBrowser.docker.findPanels('pnl_online_help')[0];
 
       if (pnlDialogHelp == null) {
-        pnlProperties = pgBrowser.docker.findPanels('properties')[0];
+        var pnlProperties = pgBrowser.docker.findPanels('properties')[0];
         pgBrowser.docker.addPanel('pnl_online_help', wcDocker.DOCK.STACKED, pnlProperties);
         pnlDialogHelp = pgBrowser.docker.findPanels('pnl_online_help')[0];
       }
 
       // Update the panel
-      iframe = $(pnlDialogHelp).data('embeddedFrame');
+      var iframe = $(pnlDialogHelp).data('embeddedFrame');
 
       pnlDialogHelp.focus();
       iframe.openURL(this.options.wizard_help);
diff --git a/web/pgadmin/browser/templates/browser/index.html b/web/pgadmin/browser/templates/browser/index.html
index 03ac6d22..54b3bd54 100644
--- a/web/pgadmin/browser/templates/browser/index.html
+++ b/web/pgadmin/browser/templates/browser/index.html
@@ -3,9 +3,8 @@
 {% block init_script %}
 try {
 require(
-['pgadmin', 'pgadmin.browser'],
-function(pgAdmin, pgBrowser) {
-  pgBrowser.init();
+['sources/generated/app.bundle'],
+function() {
 },
 function() {
 /* TODO:: Show proper error dialog */
@@ -30,7 +29,13 @@ require.onResourceLoad = function (context, map, depMaps) {
       // is not loading anything hide the indicator and exit
       setTimeout(function() {
         if (panel != null) {
-          $(panel).remove();
+            try{
+                $(panel).remove();
+            }
+            catch(e){
+                panel.outerHTML = "";
+                delete panel;
+            }
           return;
         }
       }, 500);
@@ -61,6 +66,18 @@ require.onResourceLoad = function (context, map, depMaps) {
     }, 400)
   }
 };
+window.onload = function(e){
+ setTimeout(function() {
+   var gravatarImg = '<img src="{{ username | gravatar }}" width="18" height="18" alt="Gravatar image for {{ username }}"> {{ username }} <span class="caret"></span>';
+   //$('#navbar-menu .navbar-right > li > a').html(gravatarImg);
+   var navbarRight = document.getElementById("navbar-menu").getElementsByClassName("navbar-right")[0];
+   if (navbarRight) {
+     var list = navbarRight.getElementsByTagName("LI")[0];
+     list.getElementsByTagName("a")[0].innerHTML = gravatarImg;
+   }
+ }, 1000);
+};
+
 {% endblock %}
 {% block body %}
 <style>
@@ -151,9 +168,7 @@ require.onResourceLoad = function (context, map, depMaps) {
             {% if config.SERVER_MODE %}
             <ul class="nav navbar-nav navbar-right">
                 <li class="dropdown">
-                    <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false"><img
-                            src="{{ username | gravatar }}" width="18" height="18"
-                            alt="Gravatar image for {{ username }}"> {{ username }} <span class="caret"></span></a>
+                    <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false"></a>
                     <ul class="dropdown-menu navbar-inverse">
                         <li><a href="{{ url_for('security.change_password') }}">{{ _('Change Password') }}</a></li>
                         <li class="divider"></li>
diff --git a/web/pgadmin/browser/templates/browser/js/browser.js b/web/pgadmin/browser/templates/browser/js/browser.js
index 6b260dc8..c3534185 100644
--- a/web/pgadmin/browser/templates/browser/js/browser.js
+++ b/web/pgadmin/browser/templates/browser/js/browser.js
@@ -1,17 +1,16 @@
 define(
   'pgadmin.browser', [
     'sources/gettext', 'sources/url_for', 'require', 'jquery', 'underscore', 'underscore.string',
-    'bootstrap', 'pgadmin', 'alertify', 'codemirror',
-    'sources/check_node_visibility', 'codemirror/mode/sql/sql', 'wcdocker',
+    'bootstrap', 'pgadmin', 'alertify', 'bundled_codemirror',
+    'sources/check_node_visibility', 'pgadmin.browser.utils', 'wcdocker',
     'jquery.contextmenu', 'jquery.aciplugin', 'jquery.acitree',
     'pgadmin.alertifyjs', 'pgadmin.browser.messages',
     'pgadmin.browser.menu', 'pgadmin.browser.panel',
     'pgadmin.browser.error', 'pgadmin.browser.frame',
-    'pgadmin.browser.node', 'pgadmin.browser.collection',
-    'codemirror/addon/edit/matchbrackets', 'codemirror/addon/edit/closebrackets'
+    'pgadmin.browser.node', 'pgadmin.browser.collection'
   ], function(
     gettext, url_for, require, $, _, S, Bootstrap, pgAdmin, Alertify,
-    CodeMirror, checkNodeVisibility
+    codemirror, checkNodeVisibility
 ) {
 
   // Some scripts do export their object in the window only.
@@ -19,8 +18,10 @@ define(
   var wcDocker = window.wcDocker;
   $ = $ || window.jQuery || window.$;
   Bootstrap = Bootstrap || window.Bootstrap;
+  var CodeMirror = codemirror.default;
 
   var pgBrowser = pgAdmin.Browser = pgAdmin.Browser || {};
+  var select_object_msg = gettext('Please select an object in the tree view.');
 
   var panelEvents = {};
   panelEvents[wcDocker.EVENT.VISIBILITY_CHANGED] = function() {
@@ -64,7 +65,7 @@ define(
         ajaxHook: function(item, settings) {
           if (item != null) {
             var d = this.itemData(item);
-            n = b.Nodes[d._type];
+            var n = b.Nodes[d._type];
             if (n)
               settings.url = n.generate_url(item, 'children', d, true);
           }
@@ -121,7 +122,7 @@ define(
         isCloseable: false,
         isPrivate: true,
         elContainer: true,
-        content: '<div class="obj_properties"><div class="alert alert-info pg-panel-message">{{ _('Please select an object in the tree view.') }}</div></div>',
+        content: '<div class="obj_properties"><div class="alert alert-info pg-panel-message">' + select_object_msg + '</div></div>',
         events: panelEvents,
         onCreate: function(myPanel, $container) {
           $container.addClass('pg-no-overflow');
@@ -135,7 +136,7 @@ define(
         width: 500,
         isCloseable: false,
         isPrivate: true,
-        content: '<div><div class="alert alert-info pg-panel-message pg-panel-statistics-message">{{ _('Please select an object in the tree view.') }}</div><div class="pg-panel-statistics-container hidden"></div></div>',
+        content: '<div><div class="alert alert-info pg-panel-message pg-panel-statistics-message">' + select_object_msg + '</div><div class="pg-panel-statistics-container hidden"></div></div>',
         events: panelEvents
       }),
       // Reversed engineered SQL for the object
@@ -156,7 +157,7 @@ define(
         width: 500,
         isCloseable: false,
         isPrivate: true,
-        content: '<div><div class="alert alert-info pg-panel-message pg-panel-depends-message">{{ _('Please select an object in the tree view.') }}</div><div class="pg-panel-depends-container hidden"></div></div>',
+        content: '<div><div class="alert alert-info pg-panel-message pg-panel-depends-message">' + select_object_msg + '</div><div class="pg-panel-depends-container hidden"></div></div>',
         events: panelEvents
       }),
       // Dependents of the object
@@ -167,38 +168,12 @@ define(
         width: 500,
         isCloseable: false,
         isPrivate: true,
-        content: '<div><div class="alert alert-info pg-panel-message pg-panel-depends-message">{{ _('Please select an object in the tree view.') }}</div><div class="pg-panel-depends-container hidden"></div></div>',
+        content: '<div><div class="alert alert-info pg-panel-message pg-panel-depends-message">' + select_object_msg + '</div><div class="pg-panel-depends-container hidden"></div></div>',
         events: panelEvents
-      })/* Add hooked-in panels by extensions */{% for panel_item in current_app.panels %}{% if not panel_item.isIframe %},'{{ panel_item.name }}' : new pgAdmin.Browser.Panel({
-        name: '{{ panel_item.name }}',
-        title: '{{ panel_item.title }}',
-        icon: '{{ panel_item.icon }}',
-        width: {{ panel_item.width }},
-        height: {{ panel_item.height }},
-        showTitle: {% if panel_item.showTitle %}true{% else %}false{% endif %},
-        isCloseable: {% if panel_item.isCloseable %}true{% else %}false{% endif %},
-        isPrivate: {% if panel_item.isPrivate %}true{% else %}false{% endif %},
-        content: '{{ panel_item.content }}',
-        canHide: {% if panel_item.canHide %}true{% else %}false{% endif %}{% if panel_item.limit is not none %},
-        limit: {{ panel_item.limit }}{% endif %}{% if panel_item.events is not none %},
-        events: {{ panel_item.events }} {% endif %}
-      }){% endif %}{% endfor %}
+      })
     },
     // We also support showing dashboards, HTML file, external URL
-    frames: {
-      /* Add hooked-in frames by extensions */{% for panel_item in current_app.panels %}{% if panel_item.isIframe %}
-      '{{ panel_item.name }}' : new pgAdmin.Browser.Frame({
-        name: '{{ panel_item.name }}',
-        title: '{{ panel_item.title }}',
-        icon: '{{ panel_item.icon }}',
-        width: {{ panel_item.width }},
-        height: {{ panel_item.height }},
-        showTitle: {% if panel_item.showTitle %}true{% else %}false{% endif %},
-        isCloseable: {% if panel_item.isCloseable %}true{% else %}false{% endif %},
-        isPrivate: {% if panel_item.isPrivate %}true{% else %}false{% endif %},
-        url: '{{ panel_item.content }}'
-     }),{% endif %}{% endfor %}
-    },
+    frames: {},
       /* Menus */
       // pgAdmin.Browser.MenuItem.add_menus(...) will register all the menus
       // in this container
@@ -219,10 +194,44 @@ define(
       // Help menus
       help: {}
     },
+    add_panels: function() {
+      /* Add hooked-in panels by extensions */
+      //debugger;
+      var panels = JSON.parse(pgBrowser.panels_items);
+      _.each(panels, function(panel) {
+        if (panel.isIframe) {
+          pgBrowser.frames[panel.name] = new pgBrowser.Frame({
+            name: panel.name,
+            title: panel.title,
+            icon: panel.icon,
+            width: panel.width,
+            height: panel.height,
+            showTitle: panel.showTitle,
+            isCloseable: panel.isCloseable,
+            isPrivate: panel.isPrivate,
+            url: panel.content
+          })
+        } else {
+          pgBrowser.panels[panel.name] = new pgBrowser.Panel({
+            name: panel.name,
+            title: panel.title,
+            icon: panel.icon,
+            width: panel.width,
+            height: panel.height,
+            showTitle: panel.showTitle,
+            isCloseable: panel.isCloseable,
+            isPrivate: panel.isPrivate,
+            content: (panel.content) ? panel.content : '',
+            events: (panel.events) ? panel.events : ''
+          })
+        }
+      });
+
+    },
     menu_categories: {
       /* name, label (pair) */
       'create': {
-        label: '{{ _('Create')|safe }}',
+        label: gettext('Create'),
         priority: 1,
         /* separator above this menu */
         above: false,
@@ -300,9 +309,9 @@ define(
         )
       } else {
         // Create a dummy 'no object seleted' menu
-        create_submenu = pgAdmin.Browser.MenuGroup(
+        var create_submenu = pgAdmin.Browser.MenuGroup(
           obj.menu_categories['create'], [{
-            $el: $('<li class="menu-item disabled"><a href="#">{{ _("No object selected") }}</a></li>'),
+            $el: $('<li class="menu-item disabled"><a href="#">' + gettext("No object selected") + '</a></li>'),
             priority: 1,
             category: 'create',
             update: function() {}
@@ -312,8 +321,8 @@ define(
     },
     save_current_layout: function(obj) {
       if(obj.docker) {
-        state = obj.docker.save();
-        settings = { setting: "Browser/Layout", value: state };
+        var state = obj.docker.save();
+        var settings = { setting: "Browser/Layout", value: state };
         $.ajax({
           type: 'POST',
           url: url_for('settings.store_bulk'),
@@ -330,7 +339,7 @@ define(
 
       // Cache preferences
       obj.cache_preferences();
-
+      this.add_panels();
       // Initialize the Docker
       obj.docker = new wcDocker(
         '#dockerContainer', {
@@ -350,7 +359,7 @@ define(
         });
 
         // Stored layout in database from the previous session
-        var layout = '{{ layout }}';
+        var layout = pgBrowser.utils.layout;
 
         // Try to restore the layout if there is one
         if (layout != '') {
@@ -445,36 +454,6 @@ define(
                  *
                  */
                 delete obj.scripts[d._type];
-
-                setTimeout(function() {
-                  _.each(scripts, function(s) {
-                    if (!s.loaded) {
-                      require([s.name], function(m) {
-                        s.loaded = true;
-                        // Call the initializer (if present)
-                        if (m && m.init && typeof m.init == 'function') {
-                          try {
-                            m.init();
-                            obj.Events.trigger(
-                              'pgadmin:module:' + s.name + ':initialized', m, obj
-                            );
-                          } catch (err) {
-                            console.log("Error running module init script for '" + s.path + "'");
-                            console.log(err);
-
-                            obj.report_error(
-                              gettext('Error initializing script - ') + s.path, err);
-                            }
-                        }
-                      }, function() {
-                        console.log("Error loading script - " + s.path);
-                        console.log(arguments);
-                        obj.report_error(
-                          gettext('Error loading script - ') + s.path);
-                      }).bind(s);
-                    }
-                  });
-                }, 1);
               }
             }
             break;
@@ -518,45 +497,9 @@ define(
         return true;
       });
 
-      // There are some scripts which needed to be loaded immediately,
-      // but - not all. We will will need to generate all the menus only
-      // after they all were loaded completely.
-      var counter = {total: 0, loaded: 0};
-      {% for script in current_app.javascripts %}{% if 'when' in script %}
-      {% if script.when %}/* Registering '{{ script.path }}.js' to be loaded when a node '{{ script.when }}' is loaded */
-      this.register_script('{{ script.when }}', '{{ script.name }}', '{{ script.path }}.js');{% else %}/* Loading '{{ script.path }}' */
-      counter.total += 1;
-      this.load_module('{{ script.name }}', '{{ script.path }}', counter);{% endif %}{% endif %}{% endfor %}
-
-      var geneate_menus = function() {
-        // Generate the menu items only when all the initial scripts
-        // were loaded completely.
-        //
-        // First - register the menus from the other
-        // modules/extensions.
-        if (counter.total == counter.loaded) {
-{% for key in ('File', 'Edit', 'Object' 'Tools', 'Management', 'Help') %}
-          obj.add_menus([{% for item in current_app.menu_items['%s_items' % key.lower()] %}{% if loop.index != 1 %}, {% endif %}{
-            name: "{{ item.name }}",
-            {% if item.module %}module: {{ item.module }},
-            {% endif %}{% if item.url %}url: "{{ item.url }}",
-            {% endif %}{% if item.target %}target: "{{ item.target }}",
-            {% endif %}{% if item.callback %}callback: "{{ item.callback }}",
-            {% endif %}{% if item.category %}category: "{{ item.category }}",
-            {% endif %}{% if item.icon %}icon: '{{ item.icon }}',
-            {% endif %}{% if item.data %}data: {{ item.data }},
-            {% endif %}label: '{{ item.label }}', applies: ['{{ key.lower() }}'],
-            priority: {{ item.priority }},
-            enable: '{{ item.enable }}'
-          }{% set hasMenus = True %}{% endfor %}]);
-{% endfor %}
-          obj.create_menus();
-        } else {
-          // recall after some time
-          setTimeout(function() { geneate_menus(); }, 300);
-        }
-      };
-      geneate_menus();
+      // Register scripts and add menus
+      pgBrowser.utils.registerScripts(this);
+      pgBrowser.utils.addMenus(obj);
 
       // Ping the server every 5 minutes
       setInterval(function() {
@@ -571,27 +514,7 @@ define(
       obj.Events.on('pgadmin:browser:tree:update', obj.onUpdateTreeNode, obj);
       obj.Events.on('pgadmin:browser:tree:refresh', obj.onRefreshTreeNode, obj);
     },
-    // load the module right now
-    load_module: function(name, path, c) {
-      var obj = this;
-      require([name],function(m) {
-        try {
-          // initialze the module (if 'init' function present).
-          if (m.init && typeof(m.init) == 'function')
-            m.init();
-        } catch (e) {
-          // Log this exception on console to understand the issue properly.
-          console.log(e);
-          obj.report_error(gettext('Error loading script - ') + path);
-        }
-        if (c)
-        c.loaded += 1;
-      }, function() {
-        // Log the arguments on console to understand the issue properly.
-        console.log(arguments);
-        obj.report_error(gettext('Error loading script - ') + path);
-      });
-    },
+
     add_menu_category: function(
       id, label, priority, icon, above_separator, below_separator, single
     ) {
@@ -644,12 +567,7 @@ define(
               menus = pgMenu[a];
             }
 
-            if (_.has(menus, m.name)) {
-              console && console.log && console.log(m.name +
-                ' has been ignored!\nIt already exists in the ' +
-                a +
-                ' list of menus!');
-            } else {
+            if (!_.has(menus, m.name)) {
               menus[m.name] = new MenuItem({
                 name: m.name, label: m.label, module: m.module,
                 category: m.category, callback: m.callback,
@@ -704,32 +622,31 @@ define(
     showHelp: function(type, url, node, item, label) {
       if (type == "object_help") {
         // See if we can find an existing panel, if not, create one
-        pnlSqlHelp = this.docker.findPanels('pnl_sql_help')[0];
+        var pnlSqlHelp = this.docker.findPanels('pnl_sql_help')[0];
 
         if (pnlSqlHelp == null) {
-          pnlProperties = this.docker.findPanels('properties')[0];
+          var pnlProperties = this.docker.findPanels('properties')[0];
           this.docker.addPanel('pnl_sql_help', wcDocker.DOCK.STACKED, pnlProperties);
           pnlSqlHelp = this.docker.findPanels('pnl_sql_help')[0];
         }
 
         // Construct the URL
-        server = node.getTreeNodeHierarchy(item).server;
-
-        baseUrl = '{{ pg_help_path }}'
+        var server = node.getTreeNodeHierarchy(item).server;
+        var baseUrl = pgBrowser.utils.pg_help_path;
         if (server.server_type == 'ppas') {
-          baseUrl = '{{ edbas_help_path }}'
+          baseUrl = pgBrowser.utils.edbas_help_path;
         }
 
-        major = Math.floor(server.version / 10000)
-        minor = Math.floor(server.version / 100) - (major * 100)
+        var major = Math.floor(server.version / 10000),
+          minor = Math.floor(server.version / 100) - (major * 100);
 
         baseUrl = baseUrl.replace('$VERSION$', major + '.' + minor)
         if (!S(baseUrl).endsWith('/')) {
           baseUrl = baseUrl + '/'
         }
-        fullUrl = baseUrl+ url;
+        var fullUrl = baseUrl+ url;
         // Update the panel
-        iframe = $(pnlSqlHelp).data('embeddedFrame');
+        var iframe = $(pnlSqlHelp).data('embeddedFrame');
         pnlSqlHelp.title('Help: '+ label);
 
         pnlSqlHelp.focus();
@@ -737,16 +654,16 @@ define(
       } else if(type == "dialog_help") {
         if(this.docker) {
           // See if we can find an existing panel, if not, create one
-          pnlDialogHelp = this.docker.findPanels('pnl_online_help')[0];
+          var pnlDialogHelp = this.docker.findPanels('pnl_online_help')[0];
 
           if (pnlDialogHelp == null) {
-            pnlProperties = this.docker.findPanels('properties')[0];
+            var pnlProperties = this.docker.findPanels('properties')[0];
             this.docker.addPanel('pnl_online_help', wcDocker.DOCK.STACKED, pnlProperties);
             pnlDialogHelp = this.docker.findPanels('pnl_online_help')[0];
           }
 
           // Update the panel
-          iframe = $(pnlDialogHelp).data('embeddedFrame');
+          var iframe = $(pnlDialogHelp).data('embeddedFrame');
 
           pnlDialogHelp.focus();
           iframe.openURL(url);
@@ -932,7 +849,7 @@ define(
                       linearSearch = function() {
                         while (e >= s) {
                           i = items.eq(s);
-                          d = ctx.t.itemData(i);
+                          var d = ctx.t.itemData(i);
                           if (
                             pgAdmin.natural_sort(
                               d._label, _data._label
@@ -957,7 +874,7 @@ define(
                         // We will try until it's half.
                         while (e - s > 22) {
                           i = items.eq(s);
-                          d = ctx.t.itemData(i);
+                          var d = ctx.t.itemData(i);
                           if (
                             pgAdmin.natural_sort(
                               d._label, _data._label
@@ -972,7 +889,7 @@ define(
                             ) != 1
                           )
                             return true;
-                          m = s + Math.round((e - s) / 2);
+                          var m = s + Math.round((e - s) / 2);
                           i = items.eq(m);
                           d = ctx.t.itemData(i);
                           var res = pgAdmin.natural_sort(d._label, _data._label);
@@ -1186,7 +1103,7 @@ define(
                   if (_item_parent && !_item_grand_parent) {
                     var parent = null;
                     // We need to search in all parent siblings (eg: server groups)
-                    parents = this.t.siblings(this.i) || [];
+                    var parents = this.t.siblings(this.i) || [];
                     parents.push(this.i[0])
                     _.each(parents, function (p) {
                       var d = self.t.itemData($(p));
@@ -1208,8 +1125,8 @@ define(
                       this.notFound = errorOut;
 
                       var _d = {_id: this.new._pid, _type: self.d._type}
-                        parent = $(parent),
-                        loaded = this.t.wasLoad(parent),
+                        parent = $(parent);
+                        var loaded = this.t.wasLoad(parent),
                         onLoad = function() {
                           self.i = parent;
                           self.d = self.d;
@@ -1431,7 +1348,7 @@ define(
                       linearSearch = function() {
                         while (e >= s) {
                           i = items.eq(s);
-                          d = ctx.t.itemData(i);
+                          var d = ctx.t.itemData(i);
                           if (
                             pgAdmin.natural_sort(
                               d._label, _new._label
@@ -1450,7 +1367,7 @@ define(
                       binarySearch = function() {
                         while (e - s > 22) {
                           i = items.eq(s);
-                          d = ctx.t.itemData(i);
+                          var d = ctx.t.itemData(i);
                           if (
                             pgAdmin.natural_sort(
                               d._label, _new._label
@@ -1465,7 +1382,7 @@ define(
                             ) != 1
                           )
                             return true;
-                          m = s + Math.round((e - s) / 2);
+                          var m = s + Math.round((e - s) / 2);
                           i = items.eq(m);
                           d = ctx.t.itemData(i);
                           var res = pgAdmin.natural_sort(d._label, _new._label);
@@ -1981,7 +1898,7 @@ define(
 
             for (; idx < size; idx++) {
               d = _d.branch[idx];
-              n = _ctx.b.Nodes[d._type];
+              var n = _ctx.b.Nodes[d._type];
               ctx = {
                 b: _ctx.b,
                 t: _ctx.t,
@@ -1989,7 +1906,7 @@ define(
                 i: _ctx.i,
                 d: d,
                 select: _ctx.select,
-                hasId: !n.collection_node,
+                hasId: n && !n.collection_node,
                 o: _ctx.o,
                 load: true
               };
@@ -2050,10 +1967,10 @@ define(
       "Shift-Tab": "indentLess"
     },
     editor_options: {
-      tabSize: '{{ editor_tab_size }}',
-      wrapCode: '{{ editor_wrap_code }}' == 'True',
-      insert_pair_brackets: '{{ editor_insert_pair_brackets }}' == 'True',
-      brace_matching: '{{ editor_brace_matching }}' == 'True'
+      tabSize: pgBrowser.utils.tabSize,
+      wrapCode: pgBrowser.utils.wrapCode,
+      insert_pair_brackets: pgBrowser.utils.insertPairBrackets,
+      brace_matching: pgBrowser.utils.braceMatching
     }
 
   });
@@ -2066,13 +1983,13 @@ define(
   delete CodeMirror.keyMap.emacsy["Ctrl-V"];
 
   // Use spaces instead of tab
-  if ('{{ editor_use_spaces }}' == 'True') {
+  if (pgBrowser.utils.useSpaces == 'True') {
     pgAdmin.Browser.editor_shortcut_keys.Tab = "insertSoftTab";
   }
 
   window.onbeforeunload = function(ev) {
     var e = ev || window.event,
-        msg = '{{ _('Are you sure you wish to close the %(appname)s browser?', appname=config.APP_NAME) }}';
+        msg = S(gettext('Are you sure you wish to close the %s browser?')).sprintf(pgBrowser.utils.app_name).value();
 
     // For IE and Firefox prior to version 4
     if (e) {
diff --git a/web/pgadmin/browser/templates/browser/js/collection.js b/web/pgadmin/browser/templates/browser/js/collection.js
index cb438f6f..72570c75 100644
--- a/web/pgadmin/browser/templates/browser/js/collection.js
+++ b/web/pgadmin/browser/templates/browser/js/collection.js
@@ -1,8 +1,8 @@
 define([
   'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'pgadmin',
-  'backbone', 'alertify', 'backform', 'pgadmin.backform', 'pgadmin.backgrid',
+  'backbone', 'alertify', 'backform', 'backgrid', 'pgadmin.backform', 'pgadmin.backgrid',
   'pgadmin.browser.node'
-], function(gettext, $, _, S, pgAdmin, Backbone, Alertify, Backform) {
+], function(gettext, $, _, S, pgAdmin, Backbone, Alertify, Backform, Backgrid) {
 
   var pgBrowser = pgAdmin.Browser = pgAdmin.Browser || {};
 
@@ -113,25 +113,27 @@ define([
       j.append(content);
 
       // Fetch Data
-      collection.fetch({reset: true})
-      .error(function(xhr, error, message) {
-        pgBrowser.Events.trigger(
-          'pgadmin:collection:retrieval:error', 'properties', xhr, error, message, item, that
-        );
-        if (
-          !Alertify.pgHandleItemError(xhr, error, message, {item: item, info: info})
-        ) {
-          Alertify.pgNotifier(
-            error, xhr,
-            S(
-              gettext("Error retrieving properties - %s.")
-            ).sprintf(message || that.label).value(),
-            function() {
-              console.log(arguments);
-            }
+      collection.fetch({
+        reset: true,
+        error: function(xhr, error, message) {
+          pgBrowser.Events.trigger(
+            'pgadmin:collection:retrieval:error', 'properties', xhr, error, message, item, that
           );
+          if (
+            !Alertify.pgHandleItemError(xhr, error, message, {item: item, info: info})
+          ) {
+            Alertify.pgNotifier(
+              error, xhr,
+              S(
+                gettext("Error retrieving properties - %s.")
+              ).sprintf(message || that.label).value(),
+              function() {
+                console.log(arguments);
+              }
+            );
+          }
         }
-      });
+      })
     },
     generate_url: function(item, type, d) {
       var url = pgAdmin.Browser.URL + '{TYPE}/{REDIRECT}{REF}',
diff --git a/web/pgadmin/browser/templates/browser/js/error.js b/web/pgadmin/browser/templates/browser/js/error.js
index 5fb32636..7f845af6 100644
--- a/web/pgadmin/browser/templates/browser/js/error.js
+++ b/web/pgadmin/browser/templates/browser/js/error.js
@@ -1,17 +1,16 @@
 define(
-    ['underscore', 'alertify', 'pgadmin'],
-function(_, alertify, pgAdmin) {
+    ['sources/gettext', 'underscore', 'alertify', 'pgadmin'],
+function(gettext, _, alertify, pgAdmin) {
   pgAdmin.Browser = pgAdmin.Browser || {};
 
   _.extend(pgAdmin.Browser, {
     report_error: function(title, message, info) {
-      text = '<div class="panel-group" id="accordion" role="tablist" aria-multiselectable="true">\
+      var text = '<div class="panel-group" id="accordion" role="tablist" aria-multiselectable="true">\
            <div class="panel panel-default">\
            <div class="panel-heading" role="tab" id="headingOne">\
            <h4 class="panel-title">\
            <a data-toggle="collapse" data-parent="#accordion" href="#collapseOne" aria-expanded="true" aria-controls="collapseOne">\
-           {{ _('Error message') }}\
-      </a>\
+           ' + gettext("Error message") + '</a>\
         </h4>\
         </div>\
         <div id="collapseOne" class="panel-collapse collapse in" role="tabpanel" aria-labelledby="headingOne">\
@@ -24,7 +23,7 @@ function(_, alertify, pgAdmin) {
             <div class="panel-heading" role="tab" id="headingTwo">\
             <h4 class="panel-title">\
             <a class="collapsed" data-toggle="collapse" data-parent="#accordion" href="#collapseTwo" aria-expanded="false" aria-controls="collapseTwo">\
-            {{ _('Additional info') }}</a>\
+            ' + gettext("Additional info") + '</a>\
           </h4>\
           </div>\
           <div id="collapseTwo" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingTwo">\
diff --git a/web/pgadmin/browser/templates/browser/js/messages.js b/web/pgadmin/browser/templates/browser/js/messages.js
index ee22b723..ab501873 100644
--- a/web/pgadmin/browser/templates/browser/js/messages.js
+++ b/web/pgadmin/browser/templates/browser/js/messages.js
@@ -1,7 +1,7 @@
 define(
  'pgadmin.browser.messages',
-  ['sources/gettext', 'underscore', 'underscore.string', 'pgadmin'],
-  function(gettext, S, _, pgAdmin) {
+  ['sources/gettext', 'pgadmin'],
+  function(gettext, pgAdmin) {
 
   var pgBrowser = pgAdmin.Browser = pgAdmin.Browser || {};
 
diff --git a/web/pgadmin/browser/templates/browser/js/node.js b/web/pgadmin/browser/templates/browser/js/node.js
index f57ed44e..ce3b105f 100644
--- a/web/pgadmin/browser/templates/browser/js/node.js
+++ b/web/pgadmin/browser/templates/browser/js/node.js
@@ -1,11 +1,9 @@
-define([
-  'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'pgadmin',
-  'pgadmin.browser.menu', 'backbone', 'alertify', 'pgadmin.browser.datamodel',
-  'backform',
-  'sources/alerts/alertify_wrapper',
-
-  'pgadmin.backform', 'wcdocker', 'pgadmin.alertifyjs'
-], function(gettext, $, _, S, pgAdmin, Menu, Backbone, Alertify, pgBrowser, Backform, AlertifyWrapper) {
+define(
+  'pgadmin.browser.node', [
+    'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'pgadmin',
+    'pgadmin.browser.menu', 'backbone', 'alertify', 'pgadmin.browser.datamodel',
+    'backform', 'pgadmin.browser.utils', 'pgadmin.backform', 'pgadmin.alertifyjs'
+], function(gettext, $, _, S, pgAdmin, Menu, Backbone, Alertify, pgBrowser, Backform) {
 
   var wcDocker = window.wcDocker,
     keyCode = {
@@ -71,7 +69,7 @@ define([
     sqlCreateHelp: '',
     dialogHelp: '',
 
-    title: function(d) {
+    title: function(o, d) {
       return o.label + (d ? (' - ' + d.label) : '');
     },
     hasId: true,
@@ -128,7 +126,7 @@ define([
       }
 
       // show query tool only in context menu of supported nodes.
-      if (pgAdmin.DataGrid && pgAdmin.unsupported_nodes) {
+      if (true) {
         if (_.indexOf(pgAdmin.unsupported_nodes, self.type) == -1) {
           pgAdmin.Browser.add_menus([{
             name: 'show_query_tool', node: self.type, module: self,
@@ -154,7 +152,7 @@ define([
           _.each(self.hasScriptTypes, function(stype) {
 
             var type_label = S(
-                "{{ _("%s Script") }}"
+                gettext("%s Script")
                 ).sprintf(stype.toUpperCase()).value(),
               stype = stype.toLowerCase();
 
@@ -329,45 +327,46 @@ define([
               }
             }, 1000, ctx);
 
-            newModel.fetch()
-            .success(function(res, msg, xhr) {
-              // clear timeout and remove message
-              clearTimeout(timer);
-              $msgDiv.addClass('hidden');
-
-              // We got the latest attributes of the
-              // object. Render the view now.
-              view.render();
-              setFocusOnEl();
-              newModel.startNewSession();
-            })
-            .error(function(xhr, error, message) {
-              var _label = that && item ?
-                            that.getTreeNodeHierarchy(
-                              item
-                            )[that.type].label : '';
-              pgBrowser.Events.trigger(
-                'pgadmin:node:retrieval:error', 'properties',
-                xhr, error, message, item
-              );
-              if (
-                !Alertify.pgHandleItemError(
-                  xhr, error, message, {item: item, info: info}
-                )
-              ) {
-                Alertify.pgNotifier(
-                  error, xhr,
-                  S(
-                    gettext("Error retrieving properties - %s")
-                  ).sprintf(message || _label).value(),
-                  function() {
-                    console.log(arguments);
-                  }
+            newModel.fetch({
+              success: function(res, msg, xhr) {
+                // clear timeout and remove message
+                clearTimeout(timer);
+                $msgDiv.addClass('hidden');
+
+                // We got the latest attributes of the
+                // object. Render the view now.
+                view.render();
+                setFocusOnEl();
+                newModel.startNewSession();
+              },
+              error: function(xhr, error, message) {
+                var _label = that && item ?
+                              that.getTreeNodeHierarchy(
+                                item
+                              )[that.type].label : '';
+                pgBrowser.Events.trigger(
+                  'pgadmin:node:retrieval:error', 'properties',
+                  xhr, error, message, item
                 );
-              }
-              // Close the panel (if could not fetch properties)
-              if (cancelFunc) {
-                cancelFunc();
+                if (
+                  !Alertify.pgHandleItemError(
+                    xhr, error, message, {item: item, info: info}
+                  )
+                ) {
+                  Alertify.pgNotifier(
+                    error, xhr,
+                    S(
+                      gettext("Error retrieving properties - %s")
+                    ).sprintf(message || _label).value(),
+                    function() {
+                      console.log(arguments);
+                    }
+                  );
+                }
+                // Close the panel (if could not fetch properties)
+                if (cancelFunc) {
+                  cancelFunc();
+                }
               }
             });
           } else {
@@ -410,7 +409,7 @@ define([
           isCloseable: true,
           isPrivate: true,
           elContainer: true,
-          content: '<div class="obj_properties"><div class="alert alert-info pg-panel-message">{{ _('Please wait while we fetch information about the node from the server!') }}</div></div>',
+          content: '<div class="obj_properties"><div class="alert alert-info pg-panel-message">' + gettext('Please wait while we fetch information about the node from the server!') + '</div></div>',
           onCreate: function(myPanel, $container) {
             $container.addClass('pg-no-overflow');
           },
@@ -464,7 +463,7 @@ define([
       show_obj_properties: function(args, item) {
         var t = pgBrowser.tree,
           i = args.item || item || t.selected(),
-          d = i && i.length == 1 ? t.itemData(i) : undefined
+          d = i && i.length == 1 ? t.itemData(i) : undefined,
           o = this,
           l = o.title.apply(this, [d]);
 
@@ -490,19 +489,19 @@ define([
               d.body.insertBefore(el, d.body.firstChild);
 
               var pW = screen.width < 800 ? '95%' : '500px',
-                  pH = screen.height < 600 ? '95%' : '550px';
+                  pH = screen.height < 600 ? '95%' : '550px',
                   w = pgAdmin.toPx(el, self.width || pW, 'width', true),
                   h = pgAdmin.toPx(el, self.height|| pH, 'height', true),
                   x = (b.offsetWidth - w) / 2,
                   y = (b.offsetHeight - h) / 2;
 
-              p = pgBrowser.docker.addPanel(
+              var p = pgBrowser.docker.addPanel(
                 'node_props', wcDocker.DOCK.FLOAT, undefined,
                 {w: w + 'px', h: h + 'px', x: x + 'px', y: y + 'px'}
               );
 
               b.removeChild(el);
-              delete(el);
+              // delete(el);
 
               return p;
             };
@@ -525,7 +524,7 @@ define([
             // And, actual parent of a table is schema, not Tables.
             while (i && t.hasParent(i)) {
               i = t.parent(i);
-              pd = t.itemData(i);
+              var pd = t.itemData(i);
 
               if (isParent(pd)) {
                 // Assign the data, this is my actual parent.
@@ -559,7 +558,7 @@ define([
         } else {
           if (pgBrowser.Node.panels && pgBrowser.Node.panels[d.id] &&
               pgBrowser.Node.panels[d.id].$container) {
-            p = pgBrowser.Node.panels[d.id];
+            var p = pgBrowser.Node.panels[d.id];
             /**  TODO ::
              *  Run in edit mode (if asked) only when it is
              *  not already been running edit mode
@@ -697,7 +696,8 @@ define([
          * Make sure - we're using the correct version of node
          */
         obj = pgBrowser.Nodes[d._type];
-        var objName = d.label;
+        var objName = d.label,
+          sql_url;
 
         // URL for script type
         if(scriptType == 'insert') {
@@ -996,7 +996,7 @@ define([
             // Release the view
             view.remove({data: true, internal: true, silent: true});
             // Deallocate the view
-            delete view;
+            // delete view;
             view = null;
             // Reset the data object
             j.data('obj-view', null);
@@ -1052,26 +1052,26 @@ define([
         onSqlHelp = function() {
           var panel = this;
           // See if we can find an existing panel, if not, create one
-          pnlSqlHelp = pgBrowser.docker.findPanels('pnl_sql_help')[0];
+          var pnlSqlHelp = pgBrowser.docker.findPanels('pnl_sql_help')[0];
 
           if (pnlSqlHelp == null) {
-            pnlProperties = pgBrowser.docker.findPanels('properties')[0];
+            var pnlProperties = pgBrowser.docker.findPanels('properties')[0];
             pgBrowser.docker.addPanel('pnl_sql_help', wcDocker.DOCK.STACKED, pnlProperties);
             pnlSqlHelp = pgBrowser.docker.findPanels('pnl_sql_help')[0];
           }
 
           // Construct the URL
-          server = that.getTreeNodeHierarchy(item).server;
+          var server = that.getTreeNodeHierarchy(item).server;
 
-          url = '{{ pg_help_path }}'
+          var url = pgBrowser.utils.pg_help_path;
           if (server.server_type == 'ppas') {
-            url = '{{ edbas_help_path }}'
+            url = pgBrowser.utils.edbas_help_path;
           }
 
-          major = Math.floor(server.version / 10000)
-          minor = Math.floor(server.version / 100) - (major * 100)
+          var major = Math.floor(server.version / 10000),
+            minor = Math.floor(server.version / 100) - (major * 100);
 
-          url = url.replace('$VERSION$', major + '.' + minor)
+          url = url.replace('$VERSION$', major + '.' + minor);
           if (!S(url).endsWith('/')) {
             url = url + '/'
           }
@@ -1088,7 +1088,7 @@ define([
           }
 
           // Update the panel
-          iframe = $(pnlSqlHelp).data('embeddedFrame');
+          var iframe = $(pnlSqlHelp).data('embeddedFrame');
           pnlSqlHelp.title('SQL: ' + that.label);
 
           pnlSqlHelp.focus();
@@ -1098,16 +1098,16 @@ define([
         onDialogHelp = function() {
           var panel = this;
           // See if we can find an existing panel, if not, create one
-          pnlDialogHelp = pgBrowser.docker.findPanels('pnl_online_help')[0];
+          var pnlDialogHelp = pgBrowser.docker.findPanels('pnl_online_help')[0];
 
           if (pnlDialogHelp == null) {
-            pnlProperties = pgBrowser.docker.findPanels('properties')[0];
+            var pnlProperties = pgBrowser.docker.findPanels('properties')[0];
             pgBrowser.docker.addPanel('pnl_online_help', wcDocker.DOCK.STACKED, pnlProperties);
             pnlDialogHelp = pgBrowser.docker.findPanels('pnl_online_help')[0];
           }
 
           // Update the panel
-          iframe = $(pnlDialogHelp).data('embeddedFrame');
+          var iframe = $(pnlDialogHelp).data('embeddedFrame');
 
           pnlDialogHelp.focus();
           iframe.openURL(that.dialogHelp);
@@ -1180,7 +1180,6 @@ define([
             // Release the view
             view.remove({data: true, internal: true, silent: true});
             // Deallocate the view
-            delete view;
             view = null;
             // Reset the data object
             j.data('obj-view', null);
@@ -1495,7 +1494,8 @@ define([
     getTreeNodeHierarchy: function(i) {
       var idx = 0,
           res = {},
-          t = pgBrowser.tree;
+          t = pgBrowser.tree,
+          d;
       do {
         d = t.itemData(i);
         if (d._type in pgBrowser.Nodes && pgBrowser.Nodes[d._type].hasId) {
diff --git a/web/pgadmin/browser/templates/browser/js/utils.js b/web/pgadmin/browser/templates/browser/js/utils.js
new file mode 100644
index 00000000..2e595125
--- /dev/null
+++ b/web/pgadmin/browser/templates/browser/js/utils.js
@@ -0,0 +1,88 @@
+define('pgadmin.browser.utils',
+  ['pgadmin'], function(pgAdmin) {
+
+  var pgBrowser = pgAdmin.Browser = pgAdmin.Browser || {};
+
+  /* Add hooked-in panels by extensions */
+  pgBrowser['panels_items'] = '{{ current_app.panels|tojson }}';
+
+
+  // Define list of nodes on which Query tool option doesn't appears
+  var unsupported_nodes = pgAdmin.unsupported_nodes = [
+     'server-group', 'server', 'coll-tablespace', 'tablespace',
+     'coll-role', 'role', 'coll-resource_group', 'resource_group',
+     'coll-database'
+  ];
+
+  pgBrowser.utils = {
+    layout: '{{ layout }}',
+    pg_help_path: '{{ pg_help_path }}',
+    edbas_help_path: '{{ edbas_help_path }}',
+    tabSize: '{{ editor_tab_size }}',
+    wrapCode: '{{ editor_wrap_code }}' == 'True',
+    useSpaces: '{{ editor_use_spaces }}',
+    insertPairBrackets: '{{ editor_insert_pair_brackets }}' == 'True',
+    braceMatching: '{{ editor_brace_matching }}' == 'True',
+    app_name: '{{ app_name }}',
+
+    counter: {total: 0, loaded: 0},
+    registerScripts: function (ctx) {
+      // There are some scripts which needed to be loaded immediately,
+      // but - not all. We will will need to generate all the menus only
+      // after they all were loaded completely.
+    },
+
+    addMenus: function (obj) {
+      // Generate the menu items only when all the initial scripts
+      // were loaded completely.
+      //
+      // First - register the menus from the other
+      // modules/extensions.
+      var self = this;
+      if (this.counter.total == this.counter.loaded) {
+        {% for key in ('File', 'Edit', 'Object' 'Tools', 'Management', 'Help') %}
+        obj.add_menus([{% for item in current_app.menu_items['%s_items' % key.lower()] %}{% if loop.index != 1 %}, {% endif %}{
+          name: "{{ item.name }}",
+          {% if item.module %}module: {{ item.module }},
+          {% endif %}{% if item.url %}url: "{{ item.url }}",
+          {% endif %}{% if item.target %}target: "{{ item.target }}",
+          {% endif %}{% if item.callback %}callback: "{{ item.callback }}",
+          {% endif %}{% if item.category %}category: "{{ item.category }}",
+          {% endif %}{% if item.icon %}icon: '{{ item.icon }}',
+          {% endif %}{% if item.data %}data: {{ item.data }},
+          {% endif %}label: '{{ item.label }}', applies: ['{{ key.lower() }}'],
+          priority: {{ item.priority }},
+          enable: '{{ item.enable }}'
+        }{% set hasMenus = True %}{% endfor %}]);
+        {% endfor %}
+        obj.create_menus();
+      } else {
+         //recall after some time
+         setTimeout(function(){ self.addMenus(obj); }, 3000);
+      }
+    },
+
+    // load the module right now
+    load_module: function(name, path, c) {
+      var obj = this;
+      require([name],function(m) {
+        try {
+          // initialize the module (if 'init' function present).
+          if (m.init && typeof(m.init) == 'function')
+            m.init();
+        } catch (e) {
+          // Log this exception on console to understand the issue properly.
+          console.log(e);
+          obj.report_error(gettext('Error loading script - ') + path);
+        }
+        if (c)
+        c.loaded += 1;
+      }, function() {
+        // Log the arguments on console to understand the issue properly.
+        console.log(arguments);
+        obj.report_error(gettext('Error loading script - ') + path);
+      });
+    }
+  };
+  return pgBrowser;
+});
\ No newline at end of file
diff --git a/web/pgadmin/dashboard/__init__.py b/web/pgadmin/dashboard/__init__.py
index 8f813d7c..b91ccb2a 100644
--- a/web/pgadmin/dashboard/__init__.py
+++ b/web/pgadmin/dashboard/__init__.py
@@ -62,7 +62,7 @@ class DashboardModule(PgAdminModule):
                 isPrivate=False,
                 limit=1,
                 isIframe=False,
-                canHide=True)
+                canHide=True).__dict__
         ]
 
     def register_preferences(self):
@@ -114,6 +114,41 @@ class DashboardModule(PgAdminModule):
             help_str=gettext('The number of seconds between graph samples.')
         )
 
+    def get_exposed_url_endpoints(self):
+        """
+        Returns:
+            list: a list of url endpoints exposed to the client.
+        """
+        return [
+            'dashboard.index', 'dashboard.get_by_sever_id',
+            'dashboard.get_by_database_id',
+            'dashboard.session_stats',
+            'dashboard.get_session_stats_by_sever_id',
+            'dashboard.get_session_stats_by_database_id',
+            'dashboard.tps_stats',
+            'dashboard.tps_stats_by_server_id',
+            'dashboard.tps_stats_by_database_id',
+            'dashboard.ti_stats',
+            'dashboard.ti_stats_by_server_id',
+            'dashboard.ti_stats_by_database_id',
+            'dashboard.to_stats',
+            'dashboard.to_stats_by_server_id',
+            'dashboard.to_stats_by_database_id',
+            'dashboard.bio_stats',
+            'dashboard.bio_stats_by_server_id',
+            'dashboard.bio_stats_by_database_id',
+            'dashboard.activity',
+            'dashboard.get_activity_by_server_id',
+            'dashboard.get_activity_by_database_id',
+            'dashboard.locks',
+            'dashboard.get_locks_by_server_id',
+            'dashboard.get_locks_by_database_id',
+            'dashboard.prepared',
+            'dashboard.get_prepared_by_server_id',
+            'dashboard.get_prepared_by_database_id',
+            'dashboard.config',
+            'dashboard.get_config_by_server_id',
+        ]
 
 blueprint = DashboardModule(MODULE_NAME, __name__)
 
@@ -200,9 +235,9 @@ def script():
                     mimetype="application/javascript")
 
 
-@blueprint.route('/')
-@blueprint.route('/<int:sid>')
-@blueprint.route('/<int:sid>/<int:did>')
+@blueprint.route('/', endpoint='index')
+@blueprint.route('/<int:sid>', endpoint='get_by_sever_id')
+@blueprint.route('/<int:sid>/<int:did>', endpoint='get_by_database_id')
 @login_required
 def index(sid=None, did=None):
     """
@@ -286,9 +321,13 @@ def get_data(sid, did, template):
     )
 
 
-@blueprint.route('/session_stats/')
-@blueprint.route('/session_stats/<int:sid>')
-@blueprint.route('/session_stats/<int:sid>/<int:did>')
+@blueprint.route('/session_stats/', endpoint='session_stats')
+@blueprint.route(
+    '/session_stats/<int:sid>', endpoint='get_session_stats_by_sever_id')
+@blueprint.route(
+    '/session_stats/<int:sid>/<int:did>',
+    endpoint='get_session_stats_by_database_id'
+)
 @login_required
 @check_precondition
 def session_stats(sid=None, did=None):
@@ -300,9 +339,11 @@ def session_stats(sid=None, did=None):
     return get_data(sid, did, 'session_stats.sql')
 
 
-@blueprint.route('/tps_stats/')
-@blueprint.route('/tps_stats/<int:sid>')
-@blueprint.route('/tps_stats/<int:sid>/<int:did>')
+@blueprint.route('/tps_stats/', endpoint='tps_stats')
+@blueprint.route('/tps_stats/<int:sid>', endpoint='tps_stats_by_server_id')
+@blueprint.route(
+    '/tps_stats/<int:sid>/<int:did>', endpoint='tps_stats_by_database_id'
+)
 @login_required
 @check_precondition
 def tps_stats(sid=None, did=None):
@@ -314,9 +355,10 @@ def tps_stats(sid=None, did=None):
     return get_data(sid, did, 'tps_stats.sql')
 
 
-@blueprint.route('/ti_stats/')
-@blueprint.route('/ti_stats/<int:sid>')
-@blueprint.route('/ti_stats/<int:sid>/<int:did>')
+@blueprint.route('/ti_stats/', endpoint='ti_stats')
+@blueprint.route('/ti_stats/<int:sid>', endpoint='ti_stats_by_server_id')
+@blueprint.route(
+    '/ti_stats/<int:sid>/<int:did>', endpoint='ti_stats_by_database_id')
 @login_required
 @check_precondition
 def ti_stats(sid=None, did=None):
@@ -328,9 +370,10 @@ def ti_stats(sid=None, did=None):
     return get_data(sid, did, 'ti_stats.sql')
 
 
-@blueprint.route('/to_stats/')
-@blueprint.route('/to_stats/<int:sid>')
-@blueprint.route('/to_stats/<int:sid>/<int:did>')
+@blueprint.route('/to_stats/', endpoint='to_stats')
+@blueprint.route('/to_stats/<int:sid>', endpoint='to_stats_by_server_id')
+@blueprint.route(
+    '/to_stats/<int:sid>/<int:did>', endpoint='to_stats_by_database_id')
 @login_required
 @check_precondition
 def to_stats(sid=None, did=None):
@@ -342,9 +385,10 @@ def to_stats(sid=None, did=None):
     return get_data(sid, did, 'to_stats.sql')
 
 
-@blueprint.route('/bio_stats/')
-@blueprint.route('/bio_stats/<int:sid>')
-@blueprint.route('/bio_stats/<int:sid>/<int:did>')
+@blueprint.route('/bio_stats/', endpoint='bio_stats')
+@blueprint.route('/bio_stats/<int:sid>', endpoint='bio_stats_by_server_id')
+@blueprint.route(
+    '/bio_stats/<int:sid>/<int:did>', endpoint='bio_stats_by_database_id')
 @login_required
 @check_precondition
 def bio_stats(sid=None, did=None):
@@ -356,9 +400,10 @@ def bio_stats(sid=None, did=None):
     return get_data(sid, did, 'bio_stats.sql')
 
 
-@blueprint.route('/activity/')
-@blueprint.route('/activity/<int:sid>')
-@blueprint.route('/activity/<int:sid>/<int:did>')
+@blueprint.route('/activity/', endpoint='activity')
+@blueprint.route('/activity/<int:sid>', endpoint='get_activity_by_server_id')
+@blueprint.route(
+    '/activity/<int:sid>/<int:did>', endpoint='get_activity_by_database_id')
 @login_required
 @check_precondition
 def activity(sid=None, did=None):
@@ -370,9 +415,10 @@ def activity(sid=None, did=None):
     return get_data(sid, did, 'activity.sql')
 
 
-@blueprint.route('/locks/')
-@blueprint.route('/locks/<int:sid>')
-@blueprint.route('/locks/<int:sid>/<int:did>')
+@blueprint.route('/locks/', endpoint='locks')
+@blueprint.route('/locks/<int:sid>', endpoint='get_locks_by_server_id')
+@blueprint.route(
+    '/locks/<int:sid>/<int:did>', endpoint='get_locks_by_database_id')
 @login_required
 @check_precondition
 def locks(sid=None, did=None):
@@ -384,9 +430,10 @@ def locks(sid=None, did=None):
     return get_data(sid, did, 'locks.sql')
 
 
-@blueprint.route('/prepared/')
-@blueprint.route('/prepared/<int:sid>')
-@blueprint.route('/prepared/<int:sid>/<int:did>')
+@blueprint.route('/prepared/', endpoint='prepared')
+@blueprint.route('/prepared/<int:sid>', endpoint='get_prepared_by_server_id')
+@blueprint.route(
+    '/prepared/<int:sid>/<int:did>', endpoint='get_prepared_by_database_id')
 @login_required
 @check_precondition
 def prepared(sid=None, did=None):
@@ -398,8 +445,8 @@ def prepared(sid=None, did=None):
     return get_data(sid, did, 'prepared.sql')
 
 
-@blueprint.route('/config/')
-@blueprint.route('/config/<int:sid>')
+@blueprint.route('/config/', endpoint='config')
+@blueprint.route('/config/<int:sid>', endpoint='get_config_by_server_id')
 @login_required
 @check_precondition
 def config(sid=None):
diff --git a/web/pgadmin/dashboard/templates/dashboard/js/dashboard.js b/web/pgadmin/dashboard/templates/dashboard/js/dashboard.js
index 34a1ab79..fb1b2ea9 100644
--- a/web/pgadmin/dashboard/templates/dashboard/js/dashboard.js
+++ b/web/pgadmin/dashboard/templates/dashboard/js/dashboard.js
@@ -1,8 +1,9 @@
-define([
-    'require', 'jquery', 'pgadmin', 'underscore', 'backbone', 'sources/gettext', 'flotr2', 'wcdocker',
-    'pgadmin.browser', 'bootstrap'
+define('pgadmin.dashboard', [
+    'sources/url_for', 'sources/gettext', 'require', 'jquery', 'underscore',
+    'pgadmin', 'backbone', 'backgrid', 'flotr2', 'backgrid.filter',
+    'pgadmin.browser', 'bootstrap', 'wcdocker'
     ],
-function(r, $, pgAdmin, _, Backbone, gettext) {
+function(url_for, gettext, r, $, _, pgAdmin, Backbone, Backgrid, Flotr) {
 
   var wcDocker = window.wcDocker,
   pgBrowser = pgAdmin.Browser;
@@ -27,7 +28,7 @@ function(r, $, pgAdmin, _, Backbone, gettext) {
             pgBrowser.Events.on('pgadmin-browser:tree:selected', selected);
 
             // Load the default welcome dashboard
-            url = '{{ url_for('dashboard.index') }}';
+            var url = url_for('dashboard.index');
 
             var dashboardPanel = pgBrowser.panels['dashboard'].panel;
             if (dashboardPanel) {
@@ -59,7 +60,7 @@ function(r, $, pgAdmin, _, Backbone, gettext) {
         object_selected: function(item, itemData, node) {
             if (itemData && itemData._type && dashboardVisible) {
                 var treeHierarchy = node.getTreeNodeHierarchy(item),
-                    url = '{{ url_for('dashboard.index') }}',
+                    url = url_for('dashboard.index'),
                     sid = -1, did = -1, b = pgAdmin.Browser,
                     m = b && b.Nodes[itemData._type];
 
@@ -129,7 +130,7 @@ function(r, $, pgAdmin, _, Backbone, gettext) {
             if (!dashboardVisible)
               return;
 
-            y = 0;
+            var y = 0;
             if (dataset.length == 0) {
                 if (counter == true)
                 {
@@ -164,7 +165,7 @@ function(r, $, pgAdmin, _, Backbone, gettext) {
                     }
 
                     // Reset the time index to get a proper scrolling display
-                    for (z = 0; z < dataset[y]['data'].length; z++) {
+                    for (var z = 0; z < dataset[y]['data'].length; z++) {
                         dataset[y]['data'][z][0] = z;
                     }
 
@@ -194,11 +195,10 @@ function(r, $, pgAdmin, _, Backbone, gettext) {
 
             // Animate
             var setTimeoutFunc = function () {
-                path = url + sid;
+                var path = url + sid;
                 if (did != -1) {
                     path += '/' + did;
                 }
-
                 $.ajax({
                     url: path,
                     type: "GET",
@@ -210,7 +210,8 @@ function(r, $, pgAdmin, _, Backbone, gettext) {
                     },
                     error: function (xhr, status, msg) {
                         var err = $.parseJSON(xhr.responseText),
-                            msg = err.errormsg
+                            msg = err.errormsg,
+                            cls;
                         // If we get a 428, it means the server isn't connected
                         if (xhr.status == 428) {
                             if (_.isUndefined(msg) || _.isNull(msg)) {
@@ -266,7 +267,7 @@ function(r, $, pgAdmin, _, Backbone, gettext) {
         render_grid: function(container, sid, did, url, columns) {
             var Datum = Backbone.Model.extend({});
 
-            path = url + sid;
+            var path = url + sid;
             if (did != -1) {
                 path += '/' + did;
             }
@@ -309,9 +310,9 @@ function(r, $, pgAdmin, _, Backbone, gettext) {
 
         // Render the data in a grid
         render_grid_data: function(container) {
-            data = $(container).data('data');
-            grid = $(container).data('grid');
-            filter = $(container).data('filter');
+            var data = $(container).data('data'),
+              grid = $(container).data('grid'),
+              filter = $(container).data('filter');
 
             if(_.isUndefined(data)){
               return null;
@@ -332,7 +333,8 @@ function(r, $, pgAdmin, _, Backbone, gettext) {
                 },
                 error: function(model, xhr, options) {
                      var err = $.parseJSON(xhr.responseText),
-                         msg = err.errormsg
+                         msg = err.errormsg,
+                         cls;
                     // If we get a 428, it means the server isn't connected
                     if (xhr.status == 428) {
                         if (_.isUndefined(msg) || _.isNull(msg)) {
@@ -385,7 +387,7 @@ function(r, $, pgAdmin, _, Backbone, gettext) {
             var data_bio = [];
 
             // Fake DB ID
-            did = -1;
+            var did = -1;
 
             var options_line = {
                   parseFloat: false,
@@ -585,17 +587,17 @@ function(r, $, pgAdmin, _, Backbone, gettext) {
             }];
 
             // Render the graphs
-            pgAdmin.Dashboard.render_chart(div_sessions, data_sessions, dataset_sessions, sid, did, '{{ url_for('dashboard.session_stats') }}', options_line, false, session_stats_refresh);
-            pgAdmin.Dashboard.render_chart(div_tps, data_tps, dataset_tps, sid, did, '{{ url_for('dashboard.tps_stats') }}', options_line, true, tps_stats_refresh);
-            pgAdmin.Dashboard.render_chart(div_ti, data_ti, dataset_ti, sid, did, '{{ url_for('dashboard.ti_stats') }}', options_line, true, ti_stats_refresh);
-            pgAdmin.Dashboard.render_chart(div_to, data_to, dataset_to, sid, did, '{{ url_for('dashboard.to_stats') }}', options_line, true, to_stats_refresh);
-            pgAdmin.Dashboard.render_chart(div_bio, data_bio, dataset_bio, sid, did, '{{ url_for('dashboard.bio_stats') }}', options_line, true, bio_stats_refresh);
+            pgAdmin.Dashboard.render_chart(div_sessions, data_sessions, dataset_sessions, sid, did, url_for('dashboard.session_stats'), options_line, false, session_stats_refresh);
+            pgAdmin.Dashboard.render_chart(div_tps, data_tps, dataset_tps, sid, did, url_for('dashboard.tps_stats'), options_line, true, tps_stats_refresh);
+            pgAdmin.Dashboard.render_chart(div_ti, data_ti, dataset_ti, sid, did, url_for('dashboard.ti_stats'), options_line, true, ti_stats_refresh);
+            pgAdmin.Dashboard.render_chart(div_to, data_to, dataset_to, sid, did, url_for('dashboard.to_stats'), options_line, true, to_stats_refresh);
+            pgAdmin.Dashboard.render_chart(div_bio, data_bio, dataset_bio, sid, did, url_for('dashboard.bio_stats'), options_line, true, bio_stats_refresh);
 
             // Render the tabs, but only get data for the activity tab for now
-            pgAdmin.Dashboard.render_grid(div_server_activity, sid, did, '{{ url_for('dashboard.activity') }}', server_activity_columns);
-            pgAdmin.Dashboard.render_grid(div_server_locks, sid, did, '{{ url_for('dashboard.locks') }}', server_locks_columns);
-            pgAdmin.Dashboard.render_grid(div_server_prepared, sid, did, '{{ url_for('dashboard.prepared') }}', server_prepared_columns);
-            pgAdmin.Dashboard.render_grid(div_server_config, sid, did, '{{ url_for('dashboard.config') }}', server_config_columns);
+            pgAdmin.Dashboard.render_grid(div_server_activity, sid, did, url_for('dashboard.activity'), server_activity_columns);
+            pgAdmin.Dashboard.render_grid(div_server_locks, sid, did, url_for('dashboard.locks'), server_locks_columns);
+            pgAdmin.Dashboard.render_grid(div_server_prepared, sid, did, url_for('dashboard.prepared'), server_prepared_columns);
+            pgAdmin.Dashboard.render_grid(div_server_config, sid, did, url_for('dashboard.config'), server_config_columns);
 
             pgAdmin.Dashboard.render_grid_data(div_server_activity);
 
@@ -820,16 +822,16 @@ function(r, $, pgAdmin, _, Backbone, gettext) {
             }];
 
             // Render the graphs
-            pgAdmin.Dashboard.render_chart(div_sessions, data_sessions, dataset_sessions, sid, did, '{{ url_for('dashboard.session_stats') }}', options_line, false, session_stats_refresh);
-            pgAdmin.Dashboard.render_chart(div_tps, data_tps, dataset_tps, sid, did, '{{ url_for('dashboard.tps_stats') }}', options_line, true, tps_stats_refresh);
-            pgAdmin.Dashboard.render_chart(div_ti, data_ti, dataset_ti, sid, did, '{{ url_for('dashboard.ti_stats') }}', options_line, true, ti_stats_refresh);
-            pgAdmin.Dashboard.render_chart(div_to, data_to, dataset_to, sid, did, '{{ url_for('dashboard.to_stats') }}', options_line, true, to_stats_refresh);
-            pgAdmin.Dashboard.render_chart(div_bio, data_bio, dataset_bio, sid, did, '{{ url_for('dashboard.bio_stats') }}', options_line, true, bio_stats_refresh);
+            pgAdmin.Dashboard.render_chart(div_sessions, data_sessions, dataset_sessions, sid, did, url_for('dashboard.session_stats'), options_line, false, session_stats_refresh);
+            pgAdmin.Dashboard.render_chart(div_tps, data_tps, dataset_tps, sid, did, url_for('dashboard.tps_stats'), options_line, true, tps_stats_refresh);
+            pgAdmin.Dashboard.render_chart(div_ti, data_ti, dataset_ti, sid, did, url_for('dashboard.ti_stats'), options_line, true, ti_stats_refresh);
+            pgAdmin.Dashboard.render_chart(div_to, data_to, dataset_to, sid, did, url_for('dashboard.to_stats'), options_line, true, to_stats_refresh);
+            pgAdmin.Dashboard.render_chart(div_bio, data_bio, dataset_bio, sid, did, url_for('dashboard.bio_stats'), options_line, true, bio_stats_refresh);
 
             // Render the tabs, but only get data for the activity tab for now
-            pgAdmin.Dashboard.render_grid(div_database_activity, sid, did, '{{ url_for('dashboard.activity') }}', database_activity_columns);
-            pgAdmin.Dashboard.render_grid(div_database_locks, sid, did, '{{ url_for('dashboard.locks') }}', database_locks_columns);
-            pgAdmin.Dashboard.render_grid(div_database_prepared, sid, did, '{{ url_for('dashboard.prepared') }}', database_prepared_columns);
+            pgAdmin.Dashboard.render_grid(div_database_activity, sid, did, url_for('dashboard.activity'), database_activity_columns);
+            pgAdmin.Dashboard.render_grid(div_database_locks, sid, did, url_for('dashboard.locks'), database_locks_columns);
+            pgAdmin.Dashboard.render_grid(div_database_prepared, sid, did, url_for('dashboard.prepared'), database_prepared_columns);
 
             pgAdmin.Dashboard.render_grid_data(div_database_activity);
 
diff --git a/web/pgadmin/feature_tests/query_tool_tests.py b/web/pgadmin/feature_tests/query_tool_tests.py
index c0582875..56547cbd 100644
--- a/web/pgadmin/feature_tests/query_tool_tests.py
+++ b/web/pgadmin/feature_tests/query_tool_tests.py
@@ -183,6 +183,7 @@ SELECT generate_series(1, {}) as id""".format(
             config.ON_DEMAND_RECORD_COUNT * ON_DEMAND_CHUNKS)
 
         wait = WebDriverWait(self.page.driver, 10)
+        time.sleep(1)
         self.page.fill_codemirror_area_with(query)
 
         self.page.find_by_id("btn-flash").click()
@@ -194,16 +195,15 @@ SELECT generate_series(1, {}) as id""".format(
 
         # scroll to bottom to fetch next chunk of result set.
         self.driver.execute_script(
-            "$('.slick-viewport').scrollTop($('.grid-canvas').height());"
+            "pgAdmin.SqlEditor.jquery('.slick-viewport').scrollTop(pgAdmin.SqlEditor.jquery('.grid-canvas').height());"
         )
-
         # wait for ajax to complete.
         time.sleep(1)
 
         # again scroll to bottom to bring last row of next chunk in
         # viewport.
         self.driver.execute_script(
-            "$('.slick-viewport').scrollTop($('.grid-canvas').height());"
+            "pgAdmin.SqlEditor.jquery('.slick-viewport').scrollTop(pgAdmin.SqlEditor.jquery('.grid-canvas').height());"
         )
 
         row_id_to_find = config.ON_DEMAND_RECORD_COUNT * ON_DEMAND_CHUNKS
@@ -234,7 +234,7 @@ SELECT generate_series(1, {}) as id""".format(
         # scroll to bottom to bring last row of next chunk in
         # viewport.
         self.driver.execute_script(
-            "$('.slick-viewport').scrollTop($('.grid-canvas').height());"
+            "pgAdmin.SqlEditor.jquery('.slick-viewport').scrollTop(pgAdmin.SqlEditor.jquery('.grid-canvas').height());"
         )
 
         canvas = wait.until(EC.presence_of_element_located(
@@ -274,7 +274,7 @@ SELECT generate_series(1, {}) as id1, 'dummy' as id2""".format(
         # scroll to bottom to bring last row of next chunk in
         # viewport.
         self.driver.execute_script(
-            "$('.slick-viewport').scrollTop($('.grid-canvas').height());"
+            "pgAdmin.SqlEditor.jquery('.slick-viewport').scrollTop(pgAdmin.SqlEditor.jquery('.grid-canvas').height());"
         )
 
         canvas = wait.until(EC.presence_of_element_located(
diff --git a/web/pgadmin/feature_tests/xss_checks_panels_and_query_tool_test.py b/web/pgadmin/feature_tests/xss_checks_panels_and_query_tool_test.py
index ac50ea13..0f26917b 100644
--- a/web/pgadmin/feature_tests/xss_checks_panels_and_query_tool_test.py
+++ b/web/pgadmin/feature_tests/xss_checks_panels_and_query_tool_test.py
@@ -152,6 +152,7 @@ class CheckForXssFeatureTest(BaseFeatureTest):
     def _check_xss_in_query_tool(self):
         self.page.driver.find_element_by_link_text("Tools").click()
         self.page.find_by_partial_link_text("Query Tool").click()
+        self.page.click_tab('Query -')
         self.page.fill_codemirror_area_with("select '<img src=\"x\" onerror=\"console.log(1)\">'")
         time.sleep(1)
         self.page.find_by_id("btn-flash").click()
diff --git a/web/pgadmin/help/__init__.py b/web/pgadmin/help/__init__.py
index ca30303c..cab7a039 100644
--- a/web/pgadmin/help/__init__.py
+++ b/web/pgadmin/help/__init__.py
@@ -52,28 +52,28 @@ class HelpModule(PgAdminModule):
                 priority=100,
                 isPrivate=True,
                 title=gettext('Online Help'),
-                icon='fa fa-question'),
+                icon='fa fa-question').__dict__,
 
             Panel(
                 name='pnl_pgadmin_website',
                 priority=200,
                 title=gettext('pgAdmin Website'),
                 icon='fa fa-external-link',
-                content='https://www.pgadmin.org/'),
+                content='https://www.pgadmin.org/').__dict__,
 
             Panel(
                 name='pnl_postgresql_website',
                 priority=300,
                 title=gettext('PostgreSQL Website'),
                 icon='fa fa-external-link',
-                content='http://www.postgresql.org/'),
+                content='http://www.postgresql.org/').__dict__,
 
             Panel(
                 name='pnl_sql_help',
                 priority=400,
                 isPrivate=True,
                 icon='fa fa-info',
-                title=gettext('SQL Help'))]
+                title=gettext('SQL Help')).__dict__]
 
     def register_preferences(self):
         """
diff --git a/web/pgadmin/misc/__init__.py b/web/pgadmin/misc/__init__.py
index b343f613..027dfca0 100644
--- a/web/pgadmin/misc/__init__.py
+++ b/web/pgadmin/misc/__init__.py
@@ -66,7 +66,7 @@ class MiscModule(PgAdminModule):
         Returns:
             list: a list of url endpoints exposed to the client.
         """
-        return ['misc.ping']
+        return ['misc.ping', 'misc.index']
 
 
 # Initialise the module
@@ -76,7 +76,7 @@ blueprint = MiscModule(MODULE_NAME, __name__)
 ##########################################################################
 # A special URL used to "ping" the server
 ##########################################################################
-@blueprint.route("/")
+@blueprint.route("/", endpoint='index')
 def index():
     return ''
 
diff --git a/web/pgadmin/misc/bgprocess/static/js/bgprocess.js b/web/pgadmin/misc/bgprocess/static/js/bgprocess.js
index 92000a34..12271fbd 100644
--- a/web/pgadmin/misc/bgprocess/static/js/bgprocess.js
+++ b/web/pgadmin/misc/bgprocess/static/js/bgprocess.js
@@ -1,4 +1,4 @@
-define([
+define('misc.bgprocess', [
   'pgadmin', 'sources/gettext', 'sources/url_for', 'underscore',
   'underscore.string', 'jquery', 'pgadmin.browser', 'alertify',
   'pgadmin.browser.messages'
@@ -135,12 +135,14 @@ define([
           !self.details && !_.isNull(self.exit_code)
         );
 
-        var io = ie = 0, res = [],
-            escapeEl = document.createElement('textarea'),
-            escapeHTML = function(html) {
-              escapeEl.textContent = html;
-              return escapeEl.innerHTML;
-            };
+        var io = 0,
+          ie = 0,
+          res = [],
+          escapeEl = document.createElement('textarea'),
+          escapeHTML = function(html) {
+            escapeEl.textContent = html;
+            return escapeEl.innerHTML;
+          };
 
         while (io < out.length && ie < err.length) {
           if (pgAdmin.natural_sort(out[io][0], err[ie][0]) <= 0){
@@ -452,7 +454,7 @@ define([
             if (!res || !_.isArray(res)) {
               return;
             }
-            for (idx in res) {
+            for (var idx in res) {
               var process = res[idx];
               if ('id' in process) {
                 if (!(process.id in observer.bgprocesses)) {
diff --git a/web/pgadmin/misc/depends/static/js/depends.js b/web/pgadmin/misc/depends/static/js/depends.js
index b4319f11..2ba50c88 100644
--- a/web/pgadmin/misc/depends/static/js/depends.js
+++ b/web/pgadmin/misc/depends/static/js/depends.js
@@ -1,4 +1,4 @@
-define([
+define('misc.depends', [
   'sources/gettext', 'underscore', 'underscore.string', 'jquery', 'pgadmin.browser',
   'alertify', 'pgadmin.alertifyjs'
 ], function(gettext, _, S, $, pgBrowser, Alertify) {
@@ -6,6 +6,8 @@ define([
   if (pgBrowser.ShowNodeDepends)
     return pgBrowser.ShowNodeDepends;
 
+  var wcDocker = window.wcDocker;
+
   pgBrowser.ShowNodeDepends = pgBrowser.ShowNodeDepends || {};
 
   _.extend(pgBrowser.ShowNodeDepends, {
@@ -192,7 +194,7 @@ define([
       var msg = messages[0],
           $container = panel[0].layout().scene().find('.pg-panel-content'),
           $msgContainer = $container.find('.pg-panel-depends-message'),
-          $gridContainer = $container.find('.pg-panel-depends-container');
+          $gridContainer = $container.find('.pg-panel-depends-container'),
           treeHierarchy = node.getTreeNodeHierarchy(item),
           n_value = -1,
           n_type = type;
diff --git a/web/pgadmin/misc/file_manager/__init__.py b/web/pgadmin/misc/file_manager/__init__.py
index 0e39fa95..5a7f2015 100644
--- a/web/pgadmin/misc/file_manager/__init__.py
+++ b/web/pgadmin/misc/file_manager/__init__.py
@@ -144,6 +144,19 @@ class FileManagerModule(PgAdminModule):
             'file_items': []
         }
 
+    def get_exposed_url_endpoints(self):
+        """
+        Returns:
+            list: a list of url endpoints exposed to the client.
+        """
+        return [
+            'file_manager.filemanager',
+            'file_manager.index',
+            'file_manager.get_trans_id',
+            'file_manager.delete_trans_id',
+            'file_manager.save_last_dir'
+        ]
+
     def get_file_size_preference(self):
         return self.file_upload_size
 
@@ -165,7 +178,7 @@ class FileManagerModule(PgAdminModule):
 blueprint = FileManagerModule(MODULE_NAME, __name__)
 
 
-@blueprint.route("/")
+@blueprint.route("/", endpoint='index')
 @login_required
 def index():
     """Render the preferences dialog."""
@@ -226,7 +239,9 @@ def file_manager_config(trans_id):
         mimetype="application/json")
 
 
-@blueprint.route("/get_trans_id", methods=["GET", "POST"])
+@blueprint.route(
+    "/get_trans_id", methods=["GET", "POST"], endpoint='get_trans_id'
+)
 @login_required
 def get_trans_id():
     if len(req.data) != 0:
@@ -239,7 +254,10 @@ def get_trans_id():
     )
 
 
-@blueprint.route("/del_trans_id/<int:trans_id>", methods=["GET", "POST"])
+@blueprint.route(
+    "/del_trans_id/<int:trans_id>",
+    methods=["GET", "POST"], endpoint='delete_trans_id'
+)
 @login_required
 def delete_trans_id(trans_id):
     Filemanager.release_transaction(trans_id)
@@ -248,7 +266,9 @@ def delete_trans_id(trans_id):
     )
 
 
-@blueprint.route("/save_last_dir/<int:trans_id>", methods=["POST"])
+@blueprint.route(
+    "/save_last_dir/<int:trans_id>", methods=["POST"], endpoint='save_last_dir'
+)
 @login_required
 def save_last_directory_visited(trans_id):
     blueprint.last_directory_visited.set(req.json['path'])
@@ -1122,7 +1142,10 @@ class Filemanager(object):
         return res
 
 
-@blueprint.route("/filemanager/<int:trans_id>/", methods=["GET", "POST"])
+@blueprint.route(
+    "/filemanager/<int:trans_id>/",
+    methods=["GET", "POST"], endpoint='filemanager'
+)
 @login_required
 def file_manager(trans_id):
     """
diff --git a/web/pgadmin/misc/file_manager/static/css/file_manager.css b/web/pgadmin/misc/file_manager/static/css/file_manager.css
index 56d9c389..4c5f4f60 100755
--- a/web/pgadmin/misc/file_manager/static/css/file_manager.css
+++ b/web/pgadmin/misc/file_manager/static/css/file_manager.css
@@ -221,7 +221,7 @@ div.clip {
   background: -webkit-linear-gradient(top, rgba(44, 118, 180, 0.71) 0%,rgba(44, 118, 180, 0.98) 100%); /* Chrome10+,Safari5.1+ */
   background: -o-linear-gradient(top, rgba(44, 118, 180, 0.71) 0%,rgba(44, 118, 180, 0.98) 100%); /* Opera 11.10+ */
   background: -ms-linear-gradient(top, rgba(44, 118, 180, 0.71) 0%,rgba(44, 118, 180, 0.98) 100%); /* IE10+ */
-  background: linear-gradient(to bottom, rgba(44, 118, 180, 0.71) 0%,rgba(44, 118, 180, 0.98) 100%)
+  background: linear-gradient(to bottom, rgba(44, 118, 180, 0.71) 0%,rgba(44, 118, 180, 0.98) 100%);
   border-bottom: 1px solid #ccc;
   display: inline-block;
   width: 100%;
@@ -470,14 +470,18 @@ button.list span {
 }
 
 .file_manager .upload_file #multiple-uploads {
-  background: black;
-  color: white;
-  padding: 0px !important;
   height: calc(100% - 20px);
+  background: #000;
+  color: #fff;
+  padding: 0px !important;
   overflow: auto;
   width: 100%;
 }
 
+.file_manager .upload_file #multiple-uploads .dz-message {
+  text-align: center;
+}
+
 .fileinfo .prompt-info {
   text-align: center;
   color: #fff;
@@ -591,8 +595,9 @@ button.list span {
 }
 
 .file_upload_main .dz-progress {
+  float: left;
+  width: 100%;
   height: 21px !important;
-  top: 83px !important;
   border: 1px solid #8a6d3b;
   border-radius: 0 !important;
   -moz-border-radius: 0 !important;
@@ -606,6 +611,8 @@ button.list span {
 
 .file_upload_main .dz-progress .dz-upload.success {
   background: green !important;
+  float: left;
+  width: 100%;
 }
 
 a.dz-remove {
diff --git a/web/pgadmin/misc/file_manager/templates/file_manager/index.html b/web/pgadmin/misc/file_manager/templates/file_manager/index.html
index 31b1fc3f..d877d1e5 100755
--- a/web/pgadmin/misc/file_manager/templates/file_manager/index.html
+++ b/web/pgadmin/misc/file_manager/templates/file_manager/index.html
@@ -1,7 +1,6 @@
 ﻿<html>
 <head>
-    <script type="text/javascript" src="{{ url_for('static', filename='vendor/jquery.dropzone/dropzone.js') }}"></script>
-    <script type="text/javascript" src="{{ url_for('file_manager.index') }}utility.js"></script>
+    <link type="text/css" rel="stylesheet" href="{{ url_for('file_manager.static', filename='css/file_manager.css')}}"/>
 </head>
 <body>
 <div class="file_manager">
@@ -55,6 +54,11 @@
         </div>
 
     </div>
+    <script>
+	require(['sources/generated/file_utils'], function() {
+	    pgAdmin.FileUtils.init();
+    });
+    </script>
 </div>
 </body>
 </html>
diff --git a/web/pgadmin/misc/file_manager/templates/file_manager/js/file_manager.js b/web/pgadmin/misc/file_manager/templates/file_manager/js/file_manager.js
index 91de0eef..656c3b35 100644
--- a/web/pgadmin/misc/file_manager/templates/file_manager/js/file_manager.js
+++ b/web/pgadmin/misc/file_manager/templates/file_manager/js/file_manager.js
@@ -1,8 +1,7 @@
-// This defines File Manager dialog
-define([
-  'sources/gettext', 'jquery', 'underscore', 'alertify',
-  'sources/alerts/alertify_wrapper',
-], function(gettext, $, _, alertify, AlertifyWrapper) {
+define('misc.file_manager', [
+      'sources/gettext', 'sources/url_for', 'jquery', 'underscore', 'alertify',
+      'sources/alerts/alertify_wrapper'
+], function(gettext, url_for, $, _, alertify, AlertifyWrapper) {
     pgAdmin = pgAdmin || window.pgAdmin || {};
 
     /*
@@ -21,45 +20,43 @@ define([
 
         this.initialized = true;
 
-        var module_url = "{{ url_for('file_manager.index') }}",
-            fileConnector = module_url + "filemanager/";
-
-          // send a request to get transaction id
-          var getTransId = function(configs) {
-            return $.ajax({
-              data: configs,
-              type: "POST",
-              async: false,
-              url: module_url + "get_trans_id",
-              dataType: "json",
-              contentType: "application/json; charset=utf-8",
-            });
-          };
-
-          // Function to remove trans id from session
-          var removeTransId = function(trans_id) {
-            return $.ajax({
-              type: "GET",
-              async: false,
-              url: module_url + "del_trans_id/" + trans_id,
-              dataType: "json",
-              contentType: "application/json; charset=utf-8",
-            });
-          };
-
-          var set_last_traversed_dir = function(path, trans_id) {
-            return $.ajax({
-              url: "{{ url_for('file_manager.index') }}save_last_dir/" + trans_id,
-              type: 'POST',
-              data: JSON.stringify(path),
-              contentType: 'application/json'
-            });
-          };
+        // send a request to get transaction id
+        var getTransId = function(configs) {
+          return $.ajax({
+            data: configs,
+            type: "POST",
+            async: false,
+            url: url_for('file_manager.get_trans_id'),
+            dataType: "json",
+            contentType: "application/json; charset=utf-8",
+          });
+        };
+
+        // Function to remove trans id from session
+        var removeTransId = function(trans_id) {
+          return $.ajax({
+            type: "GET",
+            async: false,
+            url: url_for('file_manager.delete_trans_id', {'trans_id': trans_id}),
+            dataType: "json",
+            contentType: "application/json; charset=utf-8",
+          });
+        };
+
+        var set_last_traversed_dir = function(path, trans_id) {
+          return $.ajax({
+            url: url_for('file_manager.save_last_dir', {'trans_id': trans_id}),
+            type: 'POST',
+            data: JSON.stringify(path),
+            contentType: 'application/json'
+          });
+        };
         // Declare the Storage dialog
         alertify.dialog('storageManagerDlg', function() {
           var controls = [], // Keep tracking of all the backform controls
               // Dialog containter
-              $container = $("<div class='storage_dialog'></div>");
+              $container = $("<div class='storage_dialog'></div>"),
+              trans_id;
 
           /*
            * Function: renderStoragePanel
@@ -73,12 +70,11 @@ define([
              */
             var content = $container.find('.storage_content');
             content.empty();
-
-            $.get("{{ url_for('file_manager.index') }}", function(data) {
+            $.get(url_for('file_manager.index'), function(data) {
               content.append(data);
             });
 
-            transId = getTransId(params);
+            var transId = getTransId(params);
             var t_res;
             if (transId.readyState == 4) {
               t_res = JSON.parse(transId.responseText);
@@ -181,6 +177,7 @@ define([
           var controls = [], // Keep tracking of all the backform controls
               // Dialog containter
               $container = $("<div class='storage_dialog file_selection_dlg'></div>");
+          var trans_id;
 
           // send a request to get transaction id
           /*
@@ -196,11 +193,11 @@ define([
             var content = $container.find('.storage_content');
             content.empty();
 
-            $.get("{{ url_for('file_manager.index') }}", function(data) {
+            $.get(url_for('file_manager.index'), function(data) {
               content.append(data);
             });
 
-            transId = getTransId(configs);
+            var transId = getTransId(configs);
             var t_res;
             if (transId.readyState == 4) {
               t_res = JSON.parse(transId.responseText);
@@ -305,7 +302,8 @@ define([
         alertify.dialog('folderSelectionDlg', function() {
           var controls = [], // Keep tracking of all the backform controls
               // Dialog containter
-              $container = $("<div class='storage_dialog folder_selection_dlg'></div>");
+              $container = $("<div class='storage_dialog folder_selection_dlg'></div>"),
+              trans_id;
 
           // send a request to get transaction id
           /*
@@ -321,11 +319,11 @@ define([
             var content = $container.find('.storage_content');
             content.empty();
 
-            $.get("{{ url_for('file_manager.index') }}", function(data) {
+            $.get(url_for('file_manager.index'), function(data) {
               content.append(data);
             });
 
-            transId = getTransId(params);
+            var transId = getTransId(params);
             var t_res;
             if (transId.readyState == 4) {
               t_res = JSON.parse(transId.responseText);
@@ -428,7 +426,8 @@ define([
         alertify.dialog('createModeDlg', function() {
           var controls = [], // Keep tracking of all the backform controls
               // Dialog containter
-              $container = $("<div class='storage_dialog create_mode_dlg'></div>");
+              $container = $("<div class='storage_dialog create_mode_dlg'></div>"),
+              trans_id;
 
           /*
            * Function: renderStoragePanel
@@ -443,11 +442,11 @@ define([
             var content = $container.find('.storage_content');
             content.empty();
 
-            $.get("{{ url_for('file_manager.index') }}", function(data) {
+            $.get(url_for('file_manager.index'), function(data) {
               content.append(data);
             });
 
-            transId = getTransId(params);
+            var transId = getTransId(params);
             var t_res;
             if (transId.readyState == 4) {
               t_res = JSON.parse(transId.responseText);
@@ -561,12 +560,12 @@ define([
               $.ajax({
                 type: 'POST',
                 data: JSON.stringify(file_data),
-                url: fileConnector + trans_id+'/',
+                url: url_for('file_manager.filemanager', {'trans_id': trans_id}),
                 dataType: 'json',
                 contentType: "application/x-download; charset=utf-8",
                 async: false,
                 success: function(resp) {
-                  data = resp.data.result;
+                  var data = resp.data.result;
                   if(data['Code'] === 1) {
                     is_exist = true;
                   } else {
@@ -586,7 +585,7 @@ define([
               $.ajax({
                 type: 'POST',
                 data: JSON.stringify(post_data),
-                url: fileConnector + trans_id+'/',
+                url: url_for('file_manager.filemanager', {'trans_id': trans_id}),
                 dataType: 'json',
                 contentType: "application/json; charset=utf-8",
                 async: false,
diff --git a/web/pgadmin/misc/file_manager/templates/file_manager/js/utility.js b/web/pgadmin/misc/file_manager/templates/file_manager/js/utility.js
index d0eaf7a8..1a847016 100755
--- a/web/pgadmin/misc/file_manager/templates/file_manager/js/utility.js
+++ b/web/pgadmin/misc/file_manager/templates/file_manager/js/utility.js
@@ -9,14 +9,11 @@
  *  @copyright  Authors
  */
 
-(function($) {
-"use strict";
-
-// use alertify and underscore js
-var AlertifyWrapper = require('sources/alerts/alertify_wrapper'),
-    _ = require("underscore"),
-    S = require("underscore.string"),
-    gettext = require('sources/gettext');
+define(['jquery', 'underscore', 'underscore.string',
+  'sources/alerts/alertify_wrapper', 'sources/gettext',
+  'sources/url_for', 'dropzone'
+  ],
+function($, _, S, AlertifyWrapper, gettext, url_for, Dropzone) {
 
 /*---------------------------------------------------------
   Define functions used for various operations
@@ -97,6 +94,7 @@ var formatBytes = function(bytes) {
   var n = parseFloat(bytes),
       d = parseFloat(1024),
       c = 0,
+      lg = pgAdmin.FileUtils.lg,
       u = [lg.bytes,lg.kb,lg.mb,lg.gb];
 
   while(true) {
@@ -144,175 +142,6 @@ var getFilename = function(filename) {
   }
 };
 
-// helpful in show/hide toolbar button for Windows
-var hideButtons = function() {
-    return (
-      config.options.platform_type == 'win32' &&
-      $('.currentpath').val() === ''
-    );
-};
-
-/*
- * Sets the folder status, upload, and new folder functions
- * to the path specified. Called on initial page load and
- * whenever a new directory is selected.
- */
-var setUploader = function(path) {
-  $('.storage_dialog #uploader').find('a').remove();
-  $('.storage_dialog #uploader').find('b').remove();
-
-  if(config.options.platform_type === "win32") {
-    path = path.replace(/\//g, '\\')
-  } else {
-    path = path.replace(/\\/g, '/')
-  }
-
-  path = decodeURI(path);
-  if (config.options.platform_type === "win32") {
-    if (config.options.show_volumes && path == '\\') {
-      $('.storage_dialog #uploader .input-path').val('');
-    } else {
-        $('.storage_dialog #uploader .input-path').val(path);
-    }
-  } else if (!config.options.platform_type === "win32" &&
-        (path == '' || !S.startsWith(path, '/'))) {
-    path = '/' + path;
-    $('.storage_dialog #uploader .input-path').val(path);
-  } else {
-    $('.storage_dialog #uploader .input-path').val(path);
-  }
-
-  if( path.lastIndexOf('\\') == -1 && path.lastIndexOf('/') == -1) {
-    $('.currentpath').val(path);
-  } else if(path.lastIndexOf('/') > path.lastIndexOf('\\')) {
-    $('.currentpath').val(path.substr(0, path.lastIndexOf('/') + 1));
-  } else {
-    $('.currentpath').val(path.substr(0, path.lastIndexOf('\\') + 1));
-  }
-
-  enab_dis_level_up();
-  if ($('.storage_dialog #uploader h1 span').length === 0) {
-    $('<span>'+lg.current_folder+'</span>').appendTo($('.storage_dialog #uploader h1'));
-  }
-
-  $('.storage_dialog #uploader .input-path').attr('title', path);
-  $('.storage_dialog #uploader .input-path').attr('data-path', path);
-
-  // create new folder
-  $('.create').unbind().click(function() {
-    var foldername =  lg.new_folder;
-    var $file_element,
-        $file_element_list,
-        folder_div;
-
-
-    $('.file_manager button.create').attr('disabled', 'disabled');
-    if ($('.fileinfo').data('view') == 'grid') {
-
-      // template for creating new folder
-      folder_div =
-        "<li class='cap_download cap_delete cap_select_file cap_select_folder cap_rename cap_create cap_upload'>" +
-        "<div class='clip'><span data-alt='' class='fa fa-folder-open fm_folder'></span></div>" +
-        "<p><input type='text' class='fm_file_rename'><span title=''>New_Folder</span></p>" +
-        "<span class='meta size'></span><span class='meta created'></span><span class='meta modified'></span></li>";
-
-      path = $('.currentpath').val();
-      $file_element =  $(folder_div);
-      $('.fileinfo #contents.grid').append($file_element);
-      $file_element.find('p span').toggle();
-      $file_element.find('p input').toggle().val(lg.new_folder).select();
-
-      // rename folder/file on pressing enter key
-      $('.file_manager').bind().on('keyup', function(e) {
-        if (e.keyCode == 13) {
-          e.stopPropagation();
-          $file_element.find('p input').trigger('blur');
-        }
-      });
-
-      // rename folder/file on blur
-      $file_element.find('p input').on('blur', function(e) {
-        $('.file_manager button.create').removeAttr('disabled');
-        var text_value = $file_element.find('p input').val();
-
-        path = $('.currentpath').val();
-
-        $file_element.find('p input').toggle();
-        $file_element.find('p span').toggle().html(text_value);
-        if (text_value === undefined) {
-          text_value = lg.new_folder;
-        }
-        getFolderName(text_value);
-        getFolderInfo(path);
-      });
-
-    } else if ($('.fileinfo').data('view') == 'list') {
-      // template to create new folder in table view
-      folder_div = $(
-        "<tr class='cap_download cap_delete cap_select_file cap_select_folder cap_rename cap_create cap_upload'>" +
-        "<td title='' class='fa fa-folder-open tbl_folder'>" +
-        "<p><input type='text' class='fm_file_rename'><span>" +
-        lg.new_folder + "</span></p>" +
-        "</td><td><abbr title=''></abbr></td>" +
-        "<td></td>" +
-        "</tr>"
-      );
-
-      $file_element_list =  $(folder_div);
-      $('.fileinfo #contents.list').prepend($file_element_list);
-      $file_element_list.find('p span').toggle();
-      $file_element_list.find('p input').toggle().val(lg.new_folder).select();
-
-      // rename folder/file on pressing enter key
-      $('.file_manager').bind().on('keyup', function(e) {
-        if (e.keyCode == 13) {
-          e.stopPropagation();
-          $file_element_list.find('p input').trigger('blur');
-        }
-      });
-
-      // rename folder/file on blur
-      $file_element_list.find('p input').on('blur', function(e) {
-        $('.file_manager button.create').removeAttr('disabled');
-        var text_value = $file_element_list.find('p input').val();
-        path = $('.currentpath').val();
-        $file_element_list.find('p input').toggle();
-        $file_element_list.find('p span').toggle().html(text_value);
-        if (text_value === undefined) {
-          text_value = lg.new_folder;
-        }
-        getFolderName(text_value);
-        getFolderInfo(path);
-      });
-    }
-
-    // create a new folder
-    var getFolderName = function(value) {
-      var fname = value;
-
-      if (fname != '') {
-        foldername = fname;
-        var d = new Date(); // to prevent IE cache issues
-        $.getJSON(fileConnector + '?mode=addfolder&path=' + $('.currentpath').val() + '&name=' + foldername, function(resp) {
-          var result = resp.data.result;
-          if (result.Code === 1) {
-            var alertifyWrapper = new AlertifyWrapper();
-            alertifyWrapper.success(lg.successful_added_folder);
-            getFolderInfo(result.Parent);
-          } else {
-            var alertifyWrapper = new AlertifyWrapper();
-            alertifyWrapper.error(result.Error);
-          }
-        });
-      } else {
-        var alertifyWrapper = new AlertifyWrapper();
-        alertifyWrapper.error(lg.no_foldername);
-      }
-    };
-
-  });
-};
-
 /*
  * Binds specific actions to the toolbar based on capability.
  * and show/hide buttons
@@ -324,7 +153,7 @@ var bindToolbar = function(data) {
     _.each(data.Capabilities, function(cap) {
       var target_btn = 'button.' + cap,
           $target_el = $('.file_manager').find(target_btn);
-      if (!has_capability(data, cap) || hideButtons()) {
+      if (!has_capability(data, cap) || pgAdmin.FileUtils.hideButtons()) {
         $target_el.hide();
       } else {
         $target_el.show();
@@ -332,7 +161,7 @@ var bindToolbar = function(data) {
     });
   }
 
-  if (!has_capability(data, 'delete') || hideButtons()) {
+  if (!has_capability(data, 'delete') || pgAdmin.FileUtils.hideButtons()) {
     $('.file_manager').find('button.delete').hide();
   } else {
     $('.file_manager').find('button.delete').click(function() {
@@ -367,17 +196,17 @@ var bindToolbar = function(data) {
   }
 
   // Download file on download button click
-  if (!has_capability(data, 'download') || hideButtons()) {
+  if (!has_capability(data, 'download') || pgAdmin.FileUtils.hideButtons()) {
     $('.file_manager').find('button.download').hide();
   } else {
     $('.file_manager').find('button.download').unbind().click(function() {
       var path;
       if ($('.fileinfo').data('view') == 'grid') {
         path = $('.fileinfo li.selected').find('.clip span').attr('data-alt');
-        window.open(fileConnector + '?mode=download&path=' + path, '_blank');
+        window.open(pgAdmin.FileUtils.fileConnector + '?mode=download&path=' + path, '_blank');
       } else {
         path = $('.fileinfo').find('table#contents tbody tr.selected td:first-child').attr('title');
-        window.open(fileConnector + '?mode=download&path=' + path, '_blank');
+        window.open(pgAdmin.FileUtils.fileConnector + '?mode=download&path=' + path, '_blank');
       }
     });
   }
@@ -418,7 +247,8 @@ var enable_disable_btn = function() {
  */
 var renameItem = function(data) {
   var orig_name = getFilename(data.Filename),
-      finalName = '';
+      finalName = '',
+      lg = pgAdmin.FileUtils.lg;
 
   var getNewName = function(rname) {
     if (rname !== '') {
@@ -438,7 +268,7 @@ var renameItem = function(data) {
       $.ajax({
         type: 'POST',
         data: JSON.stringify(post_data),
-        url: fileConnector,
+        url: pgAdmin.FileUtils.fileConnector,
         dataType: 'json',
         contentType: "application/json; charset=utf-8",
         async: false,
@@ -492,6 +322,7 @@ var renameItem = function(data) {
  */
 var deleteItem = function(data) {
   var isDeleted = false,
+      lg = pgAdmin.FileUtils.lg,
       msg = lg.confirmation_delete;
 
   var doDelete = function(data) {
@@ -504,7 +335,7 @@ var deleteItem = function(data) {
     $.ajax({
       type: 'POST',
       data: JSON.stringify(post_data),
-      url: fileConnector,
+      url: pgAdmin.FileUtils.fileConnector,
       dataType: 'json',
       contentType: "application/json; charset=utf-8",
       async: false,
@@ -536,21 +367,6 @@ var deleteItem = function(data) {
 /*---------------------------------------------------------
   Functions to Retrieve File and Folder Details
 ---------------------------------------------------------*/
-
-/* Decides whether to retrieve file or folder info based on
- * the path provided.
- */
-var getDetailView = function(path) {
-  if (path.lastIndexOf('/') == path.length - 1 || path.lastIndexOf('\\') == path.length - 1) {
-    var allowed_types = config.options.allowed_file_types;
-    var set_type = allowed_types[0];
-    if (allowed_types[0] == "*") {
-      set_type = allowed_types[1];
-    }
-    getFolderInfo(path, set_type);
-  }
-};
-
 /*
  * Retrieves information about the specified file as a JSON
  * object and uses that data to populate a template for
@@ -560,20 +376,22 @@ var getDetailView = function(path) {
  */
 var getFileInfo = function(file) {
   // Update location for status, upload, & new folder functions.
-  setUploader(file);
+  pgAdmin.FileUtils.setUploader(file);
+  var capabilities = pgAdmin.FileUtils.data.capabilities;
 
   // Retrieve the data & populate the template.
   var d = new Date(), // to prevent IE cache issues
     is_file_valid =  false;
   var post_data = {
-        'path': file,
-        'mode': 'getinfo'
-      };
+    'path': file,
+    'mode': 'getinfo'
+  };
+  var lg = pgAdmin.FileUtils.lg;
 
   $.ajax({
     type: 'POST',
     data: JSON.stringify(post_data),
-    url: fileConnector,
+    url: pgAdmin.FileUtils.fileConnector,
     dataType: 'json',
     contentType: "application/json; charset=utf-8",
     async: false,
@@ -626,7 +444,7 @@ var checkPermission = function(path) {
   $.ajax({
     type: 'POST',
     data: JSON.stringify(post_data),
-    url: fileConnector,
+    url: pgAdmin.FileUtils.fileConnector,
     dataType: 'json',
     contentType: "application/json; charset=utf-8",
     async: false,
@@ -660,8 +478,9 @@ var getFolderInfo = function(path, file_type) {
   if (!file_type) {
     file_type = '';
   }
+  var capabilities = pgAdmin.FileUtils.data.Capabilities;
   // Update location for status, upload, & new folder functions.
-  setUploader(path);
+  pgAdmin.FileUtils.setUploader(path);
 
   // set default selected file type
   if (file_type === '') {
@@ -681,15 +500,16 @@ var getFolderInfo = function(path, file_type) {
   });
 
    // hide select file if we are listing drives in windows.
-   if (hideButtons()) {
+   if (pgAdmin.FileUtils.hideButtons()) {
      $(".allowed_file_types .change_file_types").hide();
    } else {
      $(".allowed_file_types .change_file_types").show();
    }
+   var img_url = url_for('browser.static') + 'vendor/aciTree/image/load-root.gif';
 
   // Display an activity indicator.
   $('.fileinfo').find('span.activity').html(
-    "<img src='{{ url_for('browser.static', filename='vendor/aciTree/image/load-root.gif') }}'>"
+    "<img src='" + img_url + ">"
   );
 
   var post_data = {
@@ -698,10 +518,11 @@ var getFolderInfo = function(path, file_type) {
     'file_type': file_type || "*"
   };
 
+  var lg = pgAdmin.FileUtils.lg;
   $.ajax({
     type: 'POST',
     data: JSON.stringify(post_data),
-    url: fileConnector,
+    url: pgAdmin.FileUtils.fileConnector,
     dataType: 'json',
     contentType: "application/json; charset=utf-8",
     async: false,
@@ -1187,7 +1008,7 @@ var getFolderInfo = function(path, file_type) {
         });
 
       }
-      input_object.set_cap(data_cap);
+      //input_object.set_cap(data_cap);
     },
     error: function() {
       $('.storage_dialog #uploader .input-path').prop('disabled', false);
@@ -1222,311 +1043,314 @@ var enab_dis_level_up = function() {
  * get transaction id to generate request url and
  * to generate config files on runtime
  */
-var fm_url = "{{ url_for('file_manager.index') }}get_trans_id",
-    transId = loadData(fm_url),
-    t_res,
-    t_id;
+pgAdmin.FileUtils = {
+  init: function() {
+    var fm_url = url_for('file_manager.get_trans_id'),
+        transId = loadData(fm_url),
+        t_res,
+        t_id;
+
+    if (transId.readyState == 4) {
+      t_res = JSON.parse(transId.responseText);
+    }
+    t_id = t_res.data.fileTransId;
+    var root_url = url_for("file_manager.index"),
+        file_manager_config_json = root_url+t_id+'/file_manager_config.json',
+        file_manager_config_js = root_url+'file_manager_config.js',
+        fileConnector = root_url+'filemanager/'+t_id+'/',
+        cfg = loadData(file_manager_config_json),
+        config;
+
+    this.fileConnector = fileConnector;
+    // load user configuration file
+    if (cfg.readyState == 4) {
+      this.config = config = JSON.parse(cfg.responseText);
+    }
 
-if (transId.readyState == 4) {
-  t_res = JSON.parse(transId.responseText);
-}
-t_id = t_res.data.fileTransId;
-var root_url = '{{ url_for("file_manager.index") }}',
-    file_manager_config_json = root_url+t_id+'/file_manager_config.json',
-    file_manager_config_js = root_url+'file_manager_config.js',
-    fileConnector = root_url+'filemanager/'+t_id+'/',
-    cfg = loadData(file_manager_config_json),
-    config;
-
-// load user configuration file
-if (cfg.readyState == 4) {
-  config = JSON.parse(cfg.responseText);
-}
+    // set main url to filemanager and its capabilites
+    var fileRoot = config.options.fileRoot,
+        capabilities = config.options.capabilities;
 
-// set main url to filemanager and its capabilites
-var fileRoot = config.options.fileRoot,
-    capabilities = config.options.capabilities;
+    /*
+     * Get localized messages from file
+     * through culture var or from URL
+     */
 
-/*
- * Get localized messages from file
- * through culture var or from URL
- */
+    var lg = [],
+        enjs = url_for("file_manager.index") + "en.js",
+        lgf = loadData(enjs);
 
-var lg = [],
-    enjs = '{{ url_for("file_manager.index") }}' + "en.js",
-    lgf = loadData(enjs);
+    if (lgf.readyState == 4) {
+      this.lg = lg = JSON.parse(lgf.responseText);
+    }
 
-if (lgf.readyState == 4) {
-  lg = JSON.parse(lgf.responseText);
-}
+    // create and enable user to create new file
+    if (
+      config.options.dialog_type == 'select_file' ||
+      config.options.dialog_type == 'create_file' ||
+      config.options.dialog_type == 'storage_dialog'
+    ) {
+      // Create file selection dropdown
+      var allowed_types = config.options.allowed_file_types,
+          types_len = allowed_types.length,
+          select_box = '',
+          file_type = '';
+
+      if (types_len > 0) {
+        var i = 0, j = 0, t,
+            selected = false,
+            have_all_types = false;
+
+        var select_box = "<div class='change_file_types'>" +
+          "<select name='type'>";
+
+        while(i < types_len) {
+          t = allowed_types[i];
+          if (!selected && (types_len == 1 || t != '*')) {
+            select_box += "<option value=" + t + " selected>" + t + "</option>";
+            selected = true;
+            have_all_types = (have_all_types || (t == '*'));
+          } else {
+            select_box += '<option value="' + t +'">' +
+              (t == '*' ? gettext('All Files') : t) + "</option>";
+            have_all_types = (have_all_types || (t == '*'));
+          }
+          i++;
+        }
 
-// create and enable user to create new file
-if (
-  config.options.dialog_type == 'select_file' ||
-  config.options.dialog_type == 'create_file' ||
-  config.options.dialog_type == 'storage_dialog'
-) {
-  // Create file selection dropdown
-  var allowed_types = config.options.allowed_file_types,
-      types_len = allowed_types.length,
-      select_box = '',
-      file_type = '';
-
-  if (types_len > 0) {
-    var i = 0, j = 0, t,
-        selected = false,
-        have_all_types = false;
-
-    select_box = "<div class='change_file_types'>" +
-      "<select name='type'>";
-
-    while(i < types_len) {
-      t = allowed_types[i];
-      if (!selected && (types_len == 1 || t != '*')) {
-        select_box += "<option value=" + t + " selected>" + t + "</option>";
-        selected = true;
-        have_all_types = (have_all_types || (t == '*'));
-      } else {
-        select_box += '<option value="' + t +'">' +
-          (t == '*' ? gettext('All Files') : t) + "</option>";
-        have_all_types = (have_all_types || (t == '*'));
+        if (!have_all_types) {
+          select_box += '<option value="*">' + gettext('All Files') + '</option>';
+        }
+        select_box += "</select><label>" + gettext('Format') + ": </label></div>";
       }
-      i++;
-    }
 
-    if (!have_all_types) {
-      select_box += '<option value="*">' + gettext('All Files') + '</option>';
+      $(".allowed_file_types").html(select_box);
+
+      $(".allowed_file_types select").on('change', function() {
+        var selected_val = $(this).val(),
+            curr_path = $('.currentpath').val();
+        getFolderInfo(curr_path, selected_val);
+      });
     }
-    select_box += "</select><label>" + gettext('Format') + ": </label></div>";
-  }
 
-  $(".allowed_file_types").html(select_box);
+    /*---------------------------------------------------------
+      Item Actions - Object events
+    ---------------------------------------------------------*/
 
-  $(".allowed_file_types select").on('change', function() {
-    var selected_val = $(this).val(),
-        curr_path = $('.currentpath').val();
-    getFolderInfo(curr_path, selected_val);
-  });
-}
+    // switch to folder view
+    $('.file_manager .fileinfo').on('click', function(e) {
+      $('.file_manager #uploader .input-path').val($('.currentpath').val())
+      enable_disable_btn();
+    });
 
-/*---------------------------------------------------------
-  Item Actions - Object events
----------------------------------------------------------*/
+    // refresh current directory
+    $('.file_manager .refresh').on('click', function(e) {
+      enable_disable_btn();
+      var curr_path = $('.currentpath').val();
+        $('.file_manager #uploader .input-path').val(curr_path);
+        if(curr_path.endsWith("/")) {
+            var path = curr_path.substring(0, curr_path.lastIndexOf("/")) + "/";
+        } else {
+            var path = curr_path.substring(0, curr_path.lastIndexOf("\\")) + "\\";
+        }
+      getFolderInfo(path);
+    });
 
-// switch to folder view
-$('.file_manager .fileinfo').on('click', function(e) {
-  $('.file_manager #uploader .input-path').val($('.currentpath').val())
-  enable_disable_btn();
-});
+    // hide message prompt and dimmer if clicked no
+    $('.delete_item button.btn_no').on('click', function() {
+      $('.delete_item, .fileinfo .fm_dimmer').hide();
+    });
 
-// refresh current directory
-$('.file_manager .refresh').on('click', function(e) {
-  enable_disable_btn();
-  var curr_path = $('.currentpath').val();
-    $('.file_manager #uploader .input-path').val(curr_path);
-    if(curr_path.endsWith("/")) {
-        var path = curr_path.substring(0, curr_path.lastIndexOf("/")) + "/";
-    } else {
-        var path = curr_path.substring(0, curr_path.lastIndexOf("\\")) + "\\";
-    }
-  getFolderInfo(path);
-});
+    // Disable home button on load
+    $('.file_manager').find('button.home').attr('disabled', 'disabled');
+    $('.file_manager').find('button.rename').attr('disabled', 'disabled');
 
-// hide message prompt and dimmer if clicked no
-$('.delete_item button.btn_no').on('click', function() {
-  $('.delete_item, .fileinfo .fm_dimmer').hide();
-});
+    // stop click event on dimmer click
+    $('.fileinfo .fm_dimmer').on('click', function(e) {
+      e.stopPropagation();
+    });
 
-// Disable home button on load
-$('.file_manager').find('button.home').attr('disabled', 'disabled');
-$('.file_manager').find('button.rename').attr('disabled', 'disabled');
+    $('.fileinfo .replace_file').not(
+      $(this).find('span.pull-right')
+    ).on(
+    'click', function(e) {
+      $('#uploader .filemanager-btn-group').unbind().on(
+        'click', function() {
+          $('.fileinfo .delete_item, .fileinfo .replace_file, .fileinfo .fm_dimmer').hide();
+        });
+      e.stopPropagation();
+    });
 
-// stop click event on dimmer click
-$('.fileinfo .fm_dimmer').on('click', function(e) {
-  e.stopPropagation();
-});
+    // Set initial view state.
+    $('.fileinfo').data('view', config.options.defaultViewMode);
+    setViewButtonsFor(config.options.defaultViewMode);
 
-$('.fileinfo .replace_file').not(
-  $(this).find('span.pull-right')
-).on(
-'click', function(e) {
-  $('#uploader .filemanager-btn-group').unbind().on(
-    'click', function() {
-      $('.fileinfo .delete_item, .fileinfo .replace_file, .fileinfo .fm_dimmer').hide();
+    // Upload click event
+    $('.file_manager .uploader').on('click', 'a', function(e) {
+      e.preventDefault();
+      var b = $('.currentpath').val();
+      var node_val = $(this).next().text();
+      parent = b.substring(0, b.slice(0, -1).lastIndexOf(node_val));
+      getFolderInfo(parent);
     });
-  e.stopPropagation();
-});
 
-// Set initial view state.
-$('.fileinfo').data('view', config.options.defaultViewMode);
-setViewButtonsFor(config.options.defaultViewMode);
-
-// Upload click event
-$('.file_manager .uploader').on('click', 'a', function(e) {
-  e.preventDefault();
-  var b = $('.currentpath').val();
-  var node_val = $(this).next().text();
-  parent = b.substring(0, b.slice(0, -1).lastIndexOf(node_val));
-  getFolderInfo(parent);
-});
+    // re-render the home view
+    $('.file_manager .home').click(function() {
+      var currentViewMode = $('.fileinfo').data('view');
+      $('.fileinfo').data('view', currentViewMode);
+      getFolderInfo('/');
+      enab_dis_level_up();
+    });
 
-// re-render the home view
-$('.file_manager .home').click(function() {
-  var currentViewMode = $('.fileinfo').data('view');
-  $('.fileinfo').data('view', currentViewMode);
-  getFolderInfo('/');
-  enab_dis_level_up();
-});
+    // Go one directory back
+    $(".file_manager .level-up").click(function() {
+      var b = $('.currentpath').val();
+      // Enable/Disable level up button
+      enab_dis_level_up();
 
-// Go one directory back
-$(".file_manager .level-up").click(function() {
-  var b = $('.currentpath').val();
-  // Enable/Disable level up button
-  enab_dis_level_up();
+      if (b.endsWith('\\') || b.endsWith('/')) {
+        b = b.substring(0, b.length - 1)
+      }
 
-  if (b.endsWith('\\') || b.endsWith('/')) {
-    b = b.substring(0, b.length - 1)
-  }
+      if (b != '/') {
+          if(b.lastIndexOf('/') > b.lastIndexOf('\\')) {
+            var parent = b.substring(0, b.slice(0, -1).lastIndexOf("/")) + "/";
+          } else {
+            var parent = b.substring(0, b.slice(0, -1).lastIndexOf("\\")) + "\\";
+          }
 
-  if (b != '/') {
-      if(b.lastIndexOf('/') > b.lastIndexOf('\\')) {
-        var parent = b.substring(0, b.slice(0, -1).lastIndexOf("/")) + "/";
-      } else {
-        var parent = b.substring(0, b.slice(0, -1).lastIndexOf("\\")) + "\\";
+          var d = $(".fileinfo").data("view");
+          $(".fileinfo").data("view", d);
+          getFolderInfo(parent);
       }
+    });
 
-      var d = $(".fileinfo").data("view");
-      $(".fileinfo").data("view", d);
-      getFolderInfo(parent);
-  }
-});
+    // set buttons to switch between grid and list views.
+    $('.file_manager .grid').click(function() {
+      setViewButtonsFor('grid');
+      $('.fileinfo').data('view', 'grid');
+      enable_disable_btn();
+      getFolderInfo($('.currentpath').val());
+    });
 
-// set buttons to switch between grid and list views.
-$('.file_manager .grid').click(function() {
-  setViewButtonsFor('grid');
-  $('.fileinfo').data('view', 'grid');
-  enable_disable_btn();
-  getFolderInfo($('.currentpath').val());
-});
+    // Show list mode
+    $('.file_manager .list').click(function() {
+      setViewButtonsFor('list');
+      $('.fileinfo').data('view', 'list');
+      enable_disable_btn();
+      getFolderInfo($('.currentpath').val());
+    });
 
-// Show list mode
-$('.file_manager .list').click(function() {
-  setViewButtonsFor('list');
-  $('.fileinfo').data('view', 'list');
-  enable_disable_btn();
-  getFolderInfo($('.currentpath').val());
-});
+    // Provide initial values for upload form, status, etc.
+    pgAdmin.FileUtils.setUploader(fileRoot);
 
-// Provide initial values for upload form, status, etc.
-setUploader(fileRoot);
+    var data;
+    this.data = data = {
+      'Capabilities': capabilities
+    };
 
-var data = {
-  'Capabilities': capabilities
-};
+    function InputObject() {
+      this.init= function(cap) {
+        var self = this,
+            check_obj = function(path, check) {
+
+              var path = decodeURI(path);
+
+              if (path.lastIndexOf('/') == path.length - 1 || path.lastIndexOf('\\') == path.length - 1) {
+                if (
+                  has_capability(self.data_cap, 'select_folder')
+                ) {
+                  $('.file_manager_ok').removeClass('disabled');
+                  $('.file_manager button.delete, .file_manager button.rename').removeAttr(
+                    'disabled', 'disabled'
+                  );
+                  $('.file_manager button.download').attr(
+                    'disabled', 'disabled'
+                  );
+                  // set selected folder name in breadcrums
+                  $('.file_manager #uploader .input-path').hide();
+                  $('.file_manager #uploader .show_selected_file').remove();
+                  $('<span class="show_selected_file">'+path+'</span>').appendTo(
+                    '.file_manager #uploader .filemanager-path-group'
+                  );
+                } else {
+                  $('.file_manager_ok').addClass('disabled');
+                  if(check) {
+                    // Enable/Disable level up button
+                    enab_dis_level_up();
+
+                    $('.file_manager button.delete, .file_manager button.rename').attr('disabled', 'disabled');
+                    $('.file_manager button.download').attr('disabled', 'disabled');
+                    getFolderInfo(path);
+                  }
+                }
+              } else {
+                if (
+                  has_capability(self.data_cap, 'select_file')
+                ) {
+                  $('.file_manager_ok').removeClass('disabled');
+                  $('.file_manager button.delete, .file_manager button.download, .file_manager button.rename').removeAttr(
+                    'disabled'
+                  );
+                  // set selected folder name in breadcrums
+                  $('.file_manager #uploader .show_selected_file').remove();
+                }
 
-function InputObject() {
-  this.init= function(cap) {
-    var self = this,
-        check_obj = function(path, check) {
+                if(check) {
+                  if (config.options.dialog_type == 'create_file') {
+                    var status = checkPermission(path)
+                    if (status) {
+                      $('.file_manager').trigger('enter-key');
+                    }
+                  } else if(config.options.dialog_type == 'select_file') {
+                    var file_status = getFileInfo(path);
+                    if (file_status) {
+                      $('.file_manager').trigger('enter-key');
+                    }
+                  }
+                }
+              }
+            };
 
-          var path = decodeURI(path);
+        self.data_cap = cap;
 
-          if (path.lastIndexOf('/') == path.length - 1 || path.lastIndexOf('\\') == path.length - 1) {
-            if (
-              has_capability(self.data_cap, 'select_folder')
-            ) {
-              $('.file_manager_ok').removeClass('disabled');
-              $('.file_manager button.delete, .file_manager button.rename').removeAttr(
-                'disabled', 'disabled'
-              );
-              $('.file_manager button.download').attr(
-                'disabled', 'disabled'
-              );
-              // set selected folder name in breadcrums
-              $('.file_manager #uploader .input-path').hide();
-              $('.file_manager #uploader .show_selected_file').remove();
-              $('<span class="show_selected_file">'+path+'</span>').appendTo(
-                '.file_manager #uploader .filemanager-path-group'
-              );
-            } else {
-              $('.file_manager_ok').addClass('disabled');
-              if(check) {
-                // Enable/Disable level up button
-                enab_dis_level_up();
-
-                $('.file_manager button.delete, .file_manager button.rename').attr('disabled', 'disabled');
-                $('.file_manager button.download').attr('disabled', 'disabled');
-                getFolderInfo(path);
-              }
-            }
-          } else {
-            if (
-              has_capability(self.data_cap, 'select_file')
-            ) {
-              $('.file_manager_ok').removeClass('disabled');
-              $('.file_manager button.delete, .file_manager button.download, .file_manager button.rename').removeAttr(
-                'disabled'
-              );
-              // set selected folder name in breadcrums
-              $('.file_manager #uploader .show_selected_file').remove();
+        $('.storage_dialog #uploader .input-path').keyup(function(e) {
+          if(e.keyCode == 13) {
+            e.stopPropagation();
+            var path = $(this).val();
+            if(path == '') {
+              path = '/';
             }
 
-            if(check) {
-              if (config.options.dialog_type == 'create_file') {
-                var status = checkPermission(path)
-                if (status) {
-                  $('.file_manager').trigger('enter-key');
-                }
-              } else if(config.options.dialog_type == 'select_file') {
-                var file_status = getFileInfo(path);
-                if (file_status) {
-                  $('.file_manager').trigger('enter-key');
-                }
+            if(config.options.platform_type === "win32") {
+              path = path.replace(/\//g, '\\')
+            } else {
+              path = path.replace(/\\/g, '/')
+              if (!S.startsWith(path, '/')) {
+                path = '/' + path;
               }
             }
-          }
-        };
 
-    self.data_cap = cap;
-
-    $('.storage_dialog #uploader .input-path').keyup(function(e) {
-      if(e.keyCode == 13) {
-        e.stopPropagation();
-        var path = $(this).val();
-        if(path == '') {
-          path = '/';
-        }
+            $(this).val(path);
+            setTimeout(function() {
+              check_obj(path, true);
+            });
 
-        if(config.options.platform_type === "win32") {
-          path = path.replace(/\//g, '\\')
-        } else {
-          path = path.replace(/\\/g, '/')
-          if (!S.startsWith(path, '/')) {
-            path = '/' + path;
+            return;
           }
-        }
-
-        $(this).val(path);
-        setTimeout(function() {
-          check_obj(path, true);
+          check_obj($(this).val(), false);
         });
-
-        return;
       }
-      check_obj($(this).val(), false);
-    });
-  }
-  this.set_cap = function(cap) {
-    this.data_cap = cap;
-  }
-}
-
-var input_object = new InputObject()
-input_object.init(data);
+      this.set_cap = function(cap) {
+        this.data_cap = cap;
+      }
+    }
+    var input_object = new InputObject();
+    input_object.init(data);
 
-// Upload file
-if (has_capability(data, 'upload')) {
-  Dropzone.autoDiscover = false;
+    // Upload file
+    if (has_capability(data, 'upload')) {
+      Dropzone.autoDiscover = false;
   // we remove simple file upload element
   $('.file-input-container').remove();
   $('.upload').remove();
@@ -1573,7 +1397,7 @@ if (has_capability(data, 'upload')) {
 
     $("div#multiple-uploads").dropzone({
       paramName: "newfile",
-      url: fileConnector,
+      url: pgAdmin.FileUtils.fileConnector,
       maxFilesize: fileSize,
       maxFiles: config.upload.number,
       addRemoveLinks: true,
@@ -1632,6 +1456,190 @@ if (has_capability(data, 'upload')) {
     });
   });
 }
-getDetailView(fileRoot);
-})(jQuery);
+
+    this.getDetailView(fileRoot);
+  },
+   /*
+   * Sets the folder status, upload, and new folder functions
+   * to the path specified. Called on initial page load and
+   * whenever a new directory is selected.
+   */
+  setUploader: function(path) {
+    var config = this.config;
+    var lg = this.lg;
+    $('.storage_dialog #uploader').find('a').remove();
+    $('.storage_dialog #uploader').find('b').remove();
+
+    if(config.options.platform_type === "win32") {
+      path = path.replace(/\//g, '\\')
+    } else {
+      path = path.replace(/\\/g, '/')
+    }
+
+    path = decodeURI(path);
+    if (config.options.platform_type === "win32") {
+      if (config.options.show_volumes && path == '\\') {
+        $('.storage_dialog #uploader .input-path').val('');
+      } else {
+          $('.storage_dialog #uploader .input-path').val(path);
+      }
+    } else if (!config.options.platform_type === "win32" &&
+          (path == '' || !S.startsWith(path, '/'))) {
+      path = '/' + path;
+      $('.storage_dialog #uploader .input-path').val(path);
+    } else {
+      $('.storage_dialog #uploader .input-path').val(path);
+    }
+
+    if( path.lastIndexOf('\\') == -1 && path.lastIndexOf('/') == -1) {
+      $('.currentpath').val(path);
+    } else if(path.lastIndexOf('/') > path.lastIndexOf('\\')) {
+      $('.currentpath').val(path.substr(0, path.lastIndexOf('/') + 1));
+    } else {
+      $('.currentpath').val(path.substr(0, path.lastIndexOf('\\') + 1));
+    }
+
+    enab_dis_level_up();
+    if ($('.storage_dialog #uploader h1 span').length === 0) {
+      $('<span>'+lg.current_folder+'</span>').appendTo($('.storage_dialog #uploader h1'));
+    }
+
+    $('.storage_dialog #uploader .input-path').attr('title', path);
+    $('.storage_dialog #uploader .input-path').attr('data-path', path);
+
+    // create new folder
+    $('.create').unbind().click(function() {
+      var foldername =  lg.new_folder;
+      var $file_element,
+          $file_element_list,
+          folder_div;
+
+
+      $('.file_manager button.create').attr('disabled', 'disabled');
+      if ($('.fileinfo').data('view') == 'grid') {
+
+        // template for creating new folder
+        folder_div =
+          "<li class='cap_download cap_delete cap_select_file cap_select_folder cap_rename cap_create cap_upload'>" +
+          "<div class='clip'><span data-alt='' class='fa fa-folder-open fm_folder'></span></div>" +
+          "<p><input type='text' class='fm_file_rename'><span title=''>New_Folder</span></p>" +
+          "<span class='meta size'></span><span class='meta created'></span><span class='meta modified'></span></li>";
+
+        path = $('.currentpath').val();
+        $file_element =  $(folder_div);
+        $('.fileinfo #contents.grid').append($file_element);
+        $file_element.find('p span').toggle();
+        $file_element.find('p input').toggle().val(lg.new_folder).select();
+
+        // rename folder/file on pressing enter key
+        $('.file_manager').bind().on('keyup', function(e) {
+          if (e.keyCode == 13) {
+            e.stopPropagation();
+            $file_element.find('p input').trigger('blur');
+          }
+        });
+
+        // rename folder/file on blur
+        $file_element.find('p input').on('blur', function(e) {
+          $('.file_manager button.create').removeAttr('disabled');
+          var text_value = $file_element.find('p input').val();
+
+          path = $('.currentpath').val();
+
+          $file_element.find('p input').toggle();
+          $file_element.find('p span').toggle().html(text_value);
+          if (text_value === undefined) {
+            text_value = lg.new_folder;
+          }
+          getFolderName(text_value);
+          getFolderInfo(path);
+        });
+
+      } else if ($('.fileinfo').data('view') == 'list') {
+        // template to create new folder in table view
+        folder_div = $(
+          "<tr class='cap_download cap_delete cap_select_file cap_select_folder cap_rename cap_create cap_upload'>" +
+          "<td title='' class='fa fa-folder-open tbl_folder'>" +
+          "<p><input type='text' class='fm_file_rename'><span>" +
+          lg.new_folder + "</span></p>" +
+          "</td><td><abbr title=''></abbr></td>" +
+          "<td></td>" +
+          "</tr>"
+        );
+
+        $file_element_list =  $(folder_div);
+        $('.fileinfo #contents.list').prepend($file_element_list);
+        $file_element_list.find('p span').toggle();
+        $file_element_list.find('p input').toggle().val(lg.new_folder).select();
+
+        // rename folder/file on pressing enter key
+        $('.file_manager').bind().on('keyup', function(e) {
+          if (e.keyCode == 13) {
+            e.stopPropagation();
+            $file_element_list.find('p input').trigger('blur');
+          }
+        });
+
+        // rename folder/file on blur
+        $file_element_list.find('p input').on('blur', function(e) {
+          $('.file_manager button.create').removeAttr('disabled');
+          var text_value = $file_element_list.find('p input').val();
+          path = $('.currentpath').val();
+          $file_element_list.find('p input').toggle();
+          $file_element_list.find('p span').toggle().html(text_value);
+          if (text_value === undefined) {
+            text_value = lg.new_folder;
+          }
+          getFolderName(text_value);
+          getFolderInfo(path);
+        });
+      }
+
+      // create a new folder
+      var getFolderName = function(value) {
+        var fname = value;
+
+        if (fname != '') {
+          foldername = fname;
+          var d = new Date(); // to prevent IE cache issues
+          $.getJSON(pgAdmin.FileUtils.fileConnector + '?mode=addfolder&path=' + $('.currentpath').val() + '&name=' + foldername, function(resp) {
+            var result = resp.data.result;
+            if (result.Code === 1) {
+              alertify.success(lg.successful_added_folder);
+              getFolderInfo(result.Parent);
+            } else {
+              alertify.error(result.Error);
+            }
+          });
+        } else {
+          alertify.error(lg.no_foldername);
+        }
+      };
+
+    });
+  },
+  /* Decides whether to retrieve file or folder info based on
+   * the path provided.
+   */
+  getDetailView: function(path) {
+    if (path.lastIndexOf('/') == path.length - 1 || path.lastIndexOf('\\') == path.length - 1) {
+      var allowed_types = this.config.options.allowed_file_types;
+      var set_type = allowed_types[0];
+      if (allowed_types[0] == "*") {
+        set_type = allowed_types[1];
+      }
+      getFolderInfo(path, set_type);
+    }
+  },
+  // helpful in show/hide toolbar button for Windows
+  hideButtons: function() {
+      return (
+        this.config.options.platform_type == 'win32' &&
+        $('.currentpath').val() === ''
+      );
+  },
+
+};
+return pgAdmin.FileUtils;
+});
 //@ sourceURL=utility.js
diff --git a/web/pgadmin/misc/sql/static/js/sql.js b/web/pgadmin/misc/sql/static/js/sql.js
index 8402fa21..1caf048b 100644
--- a/web/pgadmin/misc/sql/static/js/sql.js
+++ b/web/pgadmin/misc/sql/static/js/sql.js
@@ -1,4 +1,4 @@
-define([
+define('misc.sql', [
   'sources/gettext', 'underscore', 'underscore.string', 'jquery', 'pgadmin.browser',
   'alertify', 'pgadmin.alertifyjs'
 ], function(gettext, _, S, $, pgBrowser, Alertify) {
@@ -8,6 +8,7 @@ define([
   if (pgBrowser.ShowNodeSQL.initialized) {
     return pgBrowser.ShowNodeSQL;
   }
+  var wcDocker = window.wcDocker;
 
   _.extend(pgBrowser.ShowNodeSQL, {
     init: function() {
@@ -17,6 +18,7 @@ define([
       this.initialized = true;
       _.bindAll(this, 'showSQL', 'sqlPanelVisibilityChanged');
 
+      var sqlPanels;
       this.sqlPanels = sqlPanels = pgBrowser.docker.findPanels('sql');
 
       // We will listend to the visibility change of the SQL panel
@@ -64,6 +66,7 @@ define([
        **/
       this.timeout && clearTimeout(this.timeout);
 
+      var that = this;
       this.timeout =  setTimeout(
         function() {
           var sql = '';
@@ -75,11 +78,11 @@ define([
                 treeHierarchy = node.getTreeNodeHierarchy(item);
 
             // Avoid unnecessary reloads
-            if (_.isEqual($(this.sqlPanels[0]).data('node-prop'), treeHierarchy)) {
+            if (_.isEqual($(that.sqlPanels[0]).data('node-prop'), treeHierarchy)) {
               return;
             }
             // Cache the current IDs for next time
-            $(this.sqlPanels[0]).data('node-prop', treeHierarchy);
+            $(that.sqlPanels[0]).data('node-prop', treeHierarchy);
 
             if (node.hasSQL) {
 
diff --git a/web/pgadmin/misc/statistics/static/js/statistics.js b/web/pgadmin/misc/statistics/static/js/statistics.js
index 1377c1eb..4b7c117f 100644
--- a/web/pgadmin/misc/statistics/static/js/statistics.js
+++ b/web/pgadmin/misc/statistics/static/js/statistics.js
@@ -1,5 +1,6 @@
-define([
-  'sources/gettext', 'underscore', 'underscore.string', 'jquery', 'pgadmin.browser', 'backgrid',
+define('misc.statistics', [
+  'sources/gettext', 'underscore', 'underscore.string', 'jquery',
+  'pgadmin.browser', 'backgrid',
   'alertify', 'sources/size_prettify'
 ], function(gettext, _, S, $, pgBrowser, Backgrid, Alertify, sizePrettify) {
 
@@ -341,7 +342,7 @@ define([
 
     __createSingleLineStatistics: function(data, prettifyFields) {
       var row = data['rows'][0],
-          columns = data['columns']
+          columns = data['columns'],
           res = [];
 
       this.columns = this.statistic_columns;
diff --git a/web/pgadmin/misc/templates/explain/js/explain.js b/web/pgadmin/misc/templates/explain/js/explain.js
index 3c4c6d95..76acb8bd 100644
--- a/web/pgadmin/misc/templates/explain/js/explain.js
+++ b/web/pgadmin/misc/templates/explain/js/explain.js
@@ -1,7 +1,7 @@
 define (
   'pgadmin.misc.explain',
-  ['jquery', 'underscore', 'underscore.string', 'pgadmin', 'backbone', 'snap.svg'],
-  function($, _, S, pgAdmin, Backbone, Snap) {
+  ['sources/url_for', 'jquery', 'underscore', 'underscore.string', 'pgadmin', 'backbone', 'snapsvg'],
+  function(url_for, $, _, S, pgAdmin, Backbone, Snap) {
 
 pgAdmin = pgAdmin || window.pgAdmin || {};
 var pgExplain = pgAdmin.Explain;
@@ -86,7 +86,7 @@ if (pgAdmin.Explain)
 
 var pgExplain = pgAdmin.Explain = {
    // Prefix path where images are stored
-   prefix: '{{ url_for('misc.static', filename='explain/img') }}/'
+   prefix: url_for('misc.index') + 'static/explain/img/'
 };
 
 /*
@@ -198,8 +198,10 @@ var imageMapper = {
 }
 
 // Some predefined constants used to calculate image location and its border
-var pWIDTH = pHEIGHT = 100.
-    IMAGE_WIDTH = IMAGE_HEIGHT = 50;
+var pWIDTH =100.;
+var pHEIGHT = 100.;
+var IMAGE_WIDTH =50;
+var IMAGE_HEIGHT = 50;
 var offsetX = 200,
     offsetY = 60;
 var ARROW_WIDTH = 10,
@@ -214,7 +216,7 @@ var xMargin = 25,
 var MIN_ZOOM_FACTOR = 0.01,
     MAX_ZOOM_FACTOR = 2,
     INIT_ZOOM_FACTOR = 1;
-    ZOOM_RATIO = 0.05;
+var ZOOM_RATIO = 0.05;
 
 
 // Backbone model for each plan property of input JSON object
@@ -589,7 +591,7 @@ _.extend(
                 }).appendTo(zoomArea).append(
                   $('<i></i>',{
                     class: 'fa fa-arrows-alt'
-                  }))
+                  })),
               zoomOutBtn = $('<button></button>', {
                 class: 'btn pg-explain-zoom-btn badge',
                 title: 'Zoom out'
diff --git a/web/pgadmin/preferences/templates/preferences/preferences.js b/web/pgadmin/preferences/templates/preferences/preferences.js
index 8fc3cd8e..c785fbb5 100644
--- a/web/pgadmin/preferences/templates/preferences/preferences.js
+++ b/web/pgadmin/preferences/templates/preferences/preferences.js
@@ -1,4 +1,4 @@
-define([
+define('pgadmin.preferences', [
   'sources/gettext', 'sources/url_for', 'jquery', 'underscore', 'alertify',
   'pgadmin', 'backform', 'pgadmin.browser', 'pgadmin.backform'
 ], function(gettext, url_for, $, _, alertify, pgAdmin, Backform, pgBrowser) {
diff --git a/web/pgadmin/settings/templates/settings/settings.js b/web/pgadmin/settings/templates/settings/settings.js
index f87dfadc..989de7f8 100644
--- a/web/pgadmin/settings/templates/settings/settings.js
+++ b/web/pgadmin/settings/templates/settings/settings.js
@@ -1,4 +1,4 @@
-define(
+define('pgadmin.settings',
   [
     'jquery', 'alertify', 'pgadmin', 'underscore', 'backform',
     'sources/gettext', 'sources/url_for', 'pgadmin.backform'
diff --git a/web/pgadmin/static/bundle/app.js b/web/pgadmin/static/bundle/app.js
new file mode 100644
index 00000000..e4d6c421
--- /dev/null
+++ b/web/pgadmin/static/bundle/app.js
@@ -0,0 +1,23 @@
+define('app', [
+  'babel-polyfill','pgadmin', 'browser_node', 'tools.datagrid'
+  ], function() {
+    var initializeModules = function(Object) {
+      for (var key in Object) {
+        var module = Object[key];
+        if (module.init && typeof module.init == 'function') {
+          module.init();
+        }
+        else if (module.Init && typeof module.Init == 'function') {
+          module.Init();
+        }
+      }
+    }
+
+    // Initialize modules registered to pgAdmin, pgAdmin.Browser and Tools object.
+    initializeModules(pgAdmin);
+    initializeModules(pgAdmin.Browser);
+    initializeModules(pgAdmin.Tools);
+
+    // create menus after all modules are initialized.
+    pgAdmin.Browser.create_menus();
+});
\ No newline at end of file
diff --git a/web/pgadmin/static/bundle/browser.js b/web/pgadmin/static/bundle/browser.js
new file mode 100644
index 00000000..cf3a9089
--- /dev/null
+++ b/web/pgadmin/static/bundle/browser.js
@@ -0,0 +1,5 @@
+define('browser_node',[
+ 'pgadmin.browser'
+], function(pgBrowser) {
+  pgBrowser.init();
+});
\ No newline at end of file
diff --git a/web/pgadmin/static/bundle/codemirror.js b/web/pgadmin/static/bundle/codemirror.js
new file mode 100644
index 00000000..6c3525b1
--- /dev/null
+++ b/web/pgadmin/static/bundle/codemirror.js
@@ -0,0 +1,18 @@
+import CodeMirror from 'codemirror/lib/codemirror';
+import 'codemirror/mode/sql/sql';
+import 'codemirror/addon/selection/mark-selection';
+import 'codemirror/addon/selection/active-line';
+import 'codemirror/addon/fold/foldcode';
+import 'codemirror/addon/fold/foldgutter';
+import 'codemirror/addon/hint/show-hint';
+import 'codemirror/addon/hint/sql-hint';
+import 'codemirror/addon/scroll/simplescrollbars';
+import 'codemirror/addon/dialog/dialog';
+import 'codemirror/addon/search/search';
+import 'codemirror/addon/search/searchcursor';
+import 'codemirror/addon/search/jump-to-line';
+import 'codemirror/addon/edit/matchbrackets';
+import 'codemirror/addon/edit/closebrackets';
+import 'pgadmin.sqlfoldcode';
+
+export default CodeMirror;
\ No newline at end of file
diff --git a/web/pgadmin/static/bundle/components.js b/web/pgadmin/static/bundle/components.js
deleted file mode 100644
index 221beff1..00000000
--- a/web/pgadmin/static/bundle/components.js
+++ /dev/null
@@ -1,9 +0,0 @@
-import React from 'react';
-import {render} from 'react-dom';
-import QueryHistory from '../jsx/history/query_history';
-
-export {
-  render,
-  React,
-  QueryHistory,
-};
\ No newline at end of file
diff --git a/web/pgadmin/static/bundle/slickgrid.js b/web/pgadmin/static/bundle/slickgrid.js
index dd7f8708..60b0ee92 100644
--- a/web/pgadmin/static/bundle/slickgrid.js
+++ b/web/pgadmin/static/bundle/slickgrid.js
@@ -1,6 +1,4 @@
-import 'slickgrid/slick.grid.css';
-import 'slickgrid/slick-default-theme.css';
-import 'slickgrid/css/smoothness/jquery-ui-1.11.3.custom.css';
+import 'slickgrid/lib/jquery.event.drag-2.3.0';
 import 'slickgrid/slick.core';
 import 'slickgrid/slick.grid';
 import 'slickgrid/slick.dataview';
@@ -9,6 +7,5 @@ import 'slickgrid/slick.formatters';
 import 'slickgrid/plugins/slick.autotooltips';
 import 'slickgrid/plugins/slick.cellrangedecorator';
 import 'slickgrid/plugins/slick.cellrangeselector';
-import 'slickgrid/lib/jquery.event.drag-2.3.0';
 
 export default window.Slick;
\ No newline at end of file
diff --git a/web/pgadmin/static/css/bootstrap.overrides.css b/web/pgadmin/static/css/bootstrap.overrides.css
index 0e1ad0ad..a590aa76 100755
--- a/web/pgadmin/static/css/bootstrap.overrides.css
+++ b/web/pgadmin/static/css/bootstrap.overrides.css
@@ -1321,3 +1321,17 @@ body {
 .pg-panel-depends-container table {
     font-size: 12px !important;
 }
+
+.backgrid tr th button {
+  background: none;
+  border: none;
+  color: #fff;
+  padding: 0;
+}
+
+/* Latest backgrid adds column name like `label` to td element, override color*/
+.backgrid td.label {
+  color: #333;
+  font-size: 14px;
+  font-weight: normal;
+}
\ No newline at end of file
diff --git a/web/pgadmin/static/css/codemirror.overrides.css b/web/pgadmin/static/css/codemirror.overrides.css
index c3eb8751..8bc081b6 100644
--- a/web/pgadmin/static/css/codemirror.overrides.css
+++ b/web/pgadmin/static/css/codemirror.overrides.css
@@ -68,4 +68,8 @@
   width: 100%;
   padding-left: 5px;
   position: absolute;
+}
+
+.CodeMirror-gutters {
+  z-index: 2;
 }
\ No newline at end of file
diff --git a/web/pgadmin/static/css/lib.css b/web/pgadmin/static/css/lib.css
new file mode 100644
index 00000000..7d651925
--- /dev/null
+++ b/web/pgadmin/static/css/lib.css
@@ -0,0 +1,37 @@
+@import '~bootstrap/dist/css/bootstrap.css';
+@import '~alertifyjs/build/css/alertify.css';
+@import '~alertifyjs/build/css/themes/bootstrap.css';
+@import '~bootstrap/dist/css/bootstrap-theme.css';
+@import '~font-awesome/css/font-awesome.css';
+@import '~font-mfizz/font/font-mfizz.css';
+@import '~bootstrap-datepicker/dist/css/bootstrap-datepicker3.css';
+@import '~bootstrap-datetime-picker/css/bootstrap-datetimepicker.css';
+@import '~bootstrap-switch/dist/css/bootstrap3/bootstrap-switch.css';
+@import '~backgrid-select-all/backgrid-select-all.css';
+@import '~backgrid-filter/backgrid-filter.css';
+@import '~backgrid-sizeable-columns/backgrid-sizeable-columns.css';
+@import '~slickgrid/css/select2.css';
+@import '~jquery-contextmenu/dist/jquery.contextMenu.css';
+@import '~webcabin-docker/Build/wcDocker.css';
+@import '~acitree/css/aciTree.css';
+
+@import '~codemirror/lib/codemirror.css';
+@import '~codemirror/addon/dialog/dialog.css';
+@import '~codemirror/addon/scroll/simplescrollbars.css';
+
+@import '~slickgrid/slick.grid.css';
+@import '~slickgrid/slick-default-theme.css';
+@import '~slickgrid/css/smoothness/jquery-ui-1.11.3.custom.css';
+
+@import '../../preferences/static/css/preferences.css';
+@import '../../browser/static/css/browser.css';
+@import '../../dashboard/static/css/dashboard.css';
+@import '../../browser/static/css/wizard.css';
+@import '../../tools/debugger/static/css/debugger.css';
+
+@import '../../tools/grant_wizard/static/css/grant_wizard.css';
+@import '../../tools/maintenance/static/css/maintenance.css';
+@import '../../tools/sqleditor/static/css/sqleditor.css';
+@import '../../misc/static/explain/css/explain.css';
+@import '../../misc/bgprocess/static/css/bgprocess.css';
+@import '../../misc/static/explain/css/explain.css';
\ No newline at end of file
diff --git a/web/pgadmin/static/css/webcabin.overrides.css b/web/pgadmin/static/css/webcabin.overrides.css
index f51592ad..cfad4eb5 100644
--- a/web/pgadmin/static/css/webcabin.overrides.css
+++ b/web/pgadmin/static/css/webcabin.overrides.css
@@ -95,16 +95,16 @@
 }
 
 .wcFrameEdgeH {
-  height: 4px;
+  height: 6px;
 }
 
 .wcFrameEdgeV {
-  width: 4px;
+  width: 6px;
 }
 .wcFrameCornerNW,
 .wcFrameCornerNE {
-  height: 4px;
-  width: 4px;
+  height: 6px;
+  width: 6px;
 }
 
 .wcSplitterBar {
@@ -336,6 +336,7 @@ ul.dropdown-menu > li.menu-item > a > i.wcTabIcon {
 
 span.fa.fa-arrow-left, .fa-arrow-right {
   margin-top: 4px;
+  width: 14px;
 }
 
 .wcMenuSubMenu {
@@ -382,3 +383,7 @@ i.wcTabIcon {
   width: auto !important;
   max-width: 100%;
 }
+
+.wcFrameTitleBar.wcTabTop .wcFrameButtonBar {
+  right: 30px !important;
+}
\ No newline at end of file
diff --git a/web/pgadmin/static/js/alertify.pgadmin.defaults.js b/web/pgadmin/static/js/alertify.pgadmin.defaults.js
index 04cee3b0..d44a82ff 100644
--- a/web/pgadmin/static/js/alertify.pgadmin.defaults.js
+++ b/web/pgadmin/static/js/alertify.pgadmin.defaults.js
@@ -96,7 +96,7 @@ function(gettext, alertify, S) {
       if (contentType) {
         try {
           if (contentType.indexOf('application/json') == 0) {
-            resp = $.parseJSON(msg);
+            var resp = $.parseJSON(msg);
 
             if (resp.result != null && (!resp.errormsg || resp.errormsg == '') &&
                 onJSONResult && typeof(onJSONResult) == 'function') {
@@ -116,7 +116,8 @@ function(gettext, alertify, S) {
               });
               return;
           }
-        } catch (exc) {
+        } catch (e) {
+          alertify.alert().show().set('message', e.message).set('title', "Error");
         }
       }
       alertify.alert().show().set(
diff --git a/web/pgadmin/static/js/backform.pgadmin.js b/web/pgadmin/static/js/backform.pgadmin.js
index f6e63d86..dec01855 100644
--- a/web/pgadmin/static/js/backform.pgadmin.js
+++ b/web/pgadmin/static/js/backform.pgadmin.js
@@ -5,8 +5,7 @@
     define([
       'sources/gettext', 'underscore', 'underscore.string', 'jquery',
       'backbone', 'backform', 'backgrid', 'codemirror', 'pgadmin.backgrid',
-      'codemirror/mode/sql/sql', 'select2', 'codemirror/addon/edit/matchbrackets',
-      'codemirror/addon/edit/closebrackets'
+      'select2'
       ],
      function(gettext, _, S, $, Backbone, Backform, Backgrid, CodeMirror) {
       // Export global even in AMD case in case this script is loaded with
@@ -20,13 +19,11 @@
       $ = root.jQuery || root.$ || root.Zepto || root.ender,
       Backbone = require('backbone') || root.Backbone,
       Backform = require('backform') || root.Backform,
-      Backgrid = require('backgrid') || root.Backgrid;
-      CodeMirror = require('codemirror') || root.CodeMirror;
-      pgAdminBackgrid = require('pgadmin.backgrid');
+      Backgrid = require('backgrid') || root.Backgrid,
+      CodeMirror = require('codemirror') || root.CodeMirror,
       S = require('underscore.string'),
       gettext = require('sources/gettext');
     factory(root, gettext, _, S, $, Backbone, Backform, Backgrid, CodeMirror);
-
   // Finally, as a browser global.
   } else {
     factory(root, root.gettext, root._, root.s, (root.jQuery || root.Zepto || root.ender || root.$), root.Backbone, root.Backform, root.Backgrid, root.CodeMirror);
@@ -125,8 +122,8 @@
 
       if (deps && _.isArray(deps)) {
         _.each(deps, function(d) {
-          attrArr = d.split('.');
-          name = attrArr.shift();
+          var attrArr = d.split('.');
+          var name = attrArr.shift();
           self.listenTo(self.model, "change:" + name, self.render);
         });
       }
@@ -143,8 +140,8 @@
       if (deps && _.isArray(deps)) {
         _.each(deps, function(d) {
 
-          attrArr = d.split('.');
-          name = attrArr.shift();
+          var attrArr = d.split('.');
+          var name = attrArr.shift();
 
           self.stopListening(self.model, "change:" + name, self.render);
         });
@@ -807,7 +804,7 @@
 
         // Check if unique columns provided are also in model attributes.
         if (uniqueCol.length > _.intersection(columns, uniqueCol).length) {
-            errorMsg = "Developer: Unique columns [ "+_.difference(uniqueCol, columns)+" ] not found in collection model [ " + columns +" ]."
+            var errorMsg = "Developer: Unique columns [ "+_.difference(uniqueCol, columns)+" ] not found in collection model [ " + columns +" ]."
             alert (errorMsg);
         }
 
@@ -873,7 +870,7 @@
         if (newModel != model) {
           var duplicateAttrValues = []
           _.each(uniqueCol, function(attr) {
-            attrValue = newModel.get(attr);
+            var attrValue = newModel.get(attr);
             if (!_.isUndefined(attrValue) && attrValue == model.get(attr)) {
               duplicateAttrValues.push(attrValue)
             }
@@ -961,7 +958,7 @@
       this.control_data = _.clone(data);
 
       // Show Backgrid Control
-      grid = this.showGridControl(data);
+      var grid = this.showGridControl(data);
 
       this.$el.html(grid).addClass(field.name);
       this.updateInvalid();
@@ -1054,7 +1051,7 @@
       });
 
       // Render subNode grid
-      subNodeGrid = self.grid.render().$el;
+      var subNodeGrid = self.grid.render().$el;
 
       // Combine Edit and Delete Cell
       if (data.canDelete && data.canEdit) {
@@ -1062,7 +1059,7 @@
         $(subNodeGrid).find("th.pg-backform-edit").attr("colspan", "2");
       }
 
-      $dialog =  gridBody.append(subNodeGrid);
+      var $dialog =  gridBody.append(subNodeGrid);
 
       // Add button callback
       if (!(data.disabled || data.canAdd == false)) {
@@ -1179,7 +1176,7 @@
         canDelete: evalF(data.canDelete, data, this.model)
       });
       // Show Backgrid Control
-      grid = (data.subnode == undefined) ? "" : this.showGridControl(data);
+      var grid = (data.subnode == undefined) ? "" : this.showGridControl(data);
 
       // Clean up first
       this.$el.removeClass(Backform.hiddenClassname);
@@ -1229,7 +1226,7 @@
           gridHeader = ["<div class='subnode-header'>",
           "  <label class='control-label pg-el-sm-10'>" + data.label + "</label>" ,
           "  <button class='btn-sm btn-default add fa fa-plus'></button>",
-          "</div>"].join("\n");
+          "</div>"].join("\n"),
         gridBody = $("<div class='pgadmin-control-group backgrid form-group pg-el-xs-12 object subnode'></div>").append(gridHeader);
 
       var subnode = data.subnode.schema ? data.subnode : data.subnode.prototype,
@@ -1318,7 +1315,7 @@
       });
 
       // Render subNode grid
-      subNodeGrid = grid.render().$el;
+      var subNodeGrid = grid.render().$el;
 
       // Combine Edit and Delete Cell
       if (data.canDelete && data.canEdit) {
@@ -1326,7 +1323,7 @@
         $(subNodeGrid).find("th.pg-backform-edit").attr("colspan", "2");
       }
 
-      $dialog =  gridBody.append(subNodeGrid);
+      var $dialog =  gridBody.append(subNodeGrid);
 
       // Add button callback
       $dialog.find('button.add').click(function(e) {
@@ -1859,8 +1856,8 @@
 
       if (deps && _.isArray(deps)) {
         _.each(deps, function(d) {
-          attrArr = d.split('.');
-          name = attrArr.shift();
+          var attrArr = d.split('.'),
+            name = attrArr.shift();
           self.listenTo(self.model, "change:" + name, self.render);
         });
       }
@@ -2160,7 +2157,7 @@
       });
     },
     onSelect: function(ev) {
-      var dialog_type = this.field.get('dialog_type');
+      var dialog_type = this.field.get('dialog_type'),
           supp_types = this.field.get('supp_types'),
           btn_primary = this.field.get('btn_primary'),
           dialog_title = this.field.get('dialog_title'),
diff --git a/web/pgadmin/static/js/backgrid.pgadmin.js b/web/pgadmin/static/js/backgrid.pgadmin.js
index 39e44e6d..48ee98cd 100644
--- a/web/pgadmin/static/js/backgrid.pgadmin.js
+++ b/web/pgadmin/static/js/backgrid.pgadmin.js
@@ -3,36 +3,38 @@
   if (typeof define === 'function' && define.amd) {
     define([
       'sources/gettext', 'underscore', 'jquery', 'backbone', 'backform', 'backgrid', 'alertify',
-      'moment', 'bignumber', 'bootstrap.datetimepicker'
+      'moment', 'bignumber', 'bootstrap.datetimepicker', 'bootstrap.switch'
     ],
      function(gettext, _, $, Backbone, Backform, Backgrid, Alertify, moment, BigNumber) {
       // Export global even in AMD case in case this script is loaded with
       // others that may still expect a global Backform.
-      return factory(root, gettext, _, $, Backbone, Backform, Alertify, moment, BigNumber);
+      return factory(root, gettext, _, $, Backbone, Backform, Backgrid, Alertify, moment, BigNumber);
     });
 
   // Next for Node.js or CommonJS. jQuery may not be needed as a module.
   } else if (typeof exports !== 'undefined') {
-    var _ = require('underscore') || root._,
+    var gettext = require('sources/gettext'),
+      _ = require('underscore') || root._,
       $ = root.jQuery || root.$ || root.Zepto || root.ender,
       Backbone = require('backbone') || root.Backbone,
-      Backform = require('backform') || root.Backform;
-      Alertify = require('alertify') || root.Alertify;
+      Backform = require('backform') || root.Backform,
+      Backgrid = require('backgrid') || root.Backgrid,
+      Alertify = require('alertify') || root.Alertify,
       moment = require('moment') || root.moment;
-    factory(root, gettext, _, $, Backbone, Backform, Alertify, moment);
+    factory(root, gettext, _, $, Backbone, Backform, Backgrid, Alertify, moment);
 
   // Finally, as a browser global.
   } else {
-    factory(root, root.gettext, root._, (root.jQuery || root.Zepto || root.ender || root.$), root.Backbone, root.Backform);
+    factory(root, root.gettext, root._, (root.jQuery || root.Zepto || root.ender || root.$), root.Backbone, root.Backform, root.Alertify, root.moment);
   }
-} (this, function(root, gettext, _, $, Backbone, Backform, Alertify, moment, BigNumber) {
+} (this, function(root, gettext, _, $, Backbone, Backform, Backgrid, Alertify, moment, BigNumber) {
   /*
      * Add mechanism in backgrid to render different types of cells in
      * same column;
    */
 
   // Add new property cellFunction in Backgrid.Column.
-  _.extend(Backgrid.Column.prototype.defaults, { cellFunction: undefined });
+  _.extend(Backgrid.Column.prototype.defaults, {cellFunction: undefined});
 
   // Add tooltip to cell if cell content is larger than
   // cell width
@@ -213,7 +215,7 @@
     },
     postRender: function(model, column) {
       var editor = this,
-          el = this.el;
+          el = this.el,
           columns_length = this.columns_length;
 
       if (column != null && column.get("name") != this.column.get("name"))
@@ -229,7 +231,7 @@
       $dialog.find('div.subnode-body').append($form);
 
       // Call Backform to prepare dialog
-      back_el = $dialog.find('form.form-dialog');
+      var back_el = $dialog.find('form.form-dialog');
 
       this.objectView = new Backform.Dialog({
         el: back_el, model: this.model, schema: this.schema,
@@ -279,7 +281,7 @@
     // It's possible to render an option group or use a
     // function to provide option values too.
     optionValues: function() {
-      var res = [];
+      var res = [],
           opts = _.result(this.column.attributes, 'options');
       _.each(opts, function(o) {
         res.push([o.label, o.value]);
@@ -391,7 +393,7 @@
       },
       deleteRow: function (e) {
         e.preventDefault();
-        that = this;
+        var that = this;
         // We will check if row is deletable or not
         var canDeleteRow = (!_.isUndefined(this.column.get('canDeleteRow')) &&
                             _.isFunction(this.column.get('canDeleteRow')) ) ?
@@ -445,6 +447,7 @@
   /**
     SwitchCell renders a Bootstrap Switch in backgrid cell
   */
+  $.fn.bootstrapSwitch = jQuery.fn.bootstrapSwitch;
   var SwitchCell = Backgrid.Extension.SwitchCell = Backgrid.BooleanCell.extend({
     defaults: {
       options: _.defaults({
@@ -643,7 +646,7 @@
             ),
           selectTpl = _.template('<select <%=multiple ? "multiple" : "" %>></select>');
 
-      $select = self.$select = $(selectTpl({
+      var $select = self.$select = $(selectTpl({
         multiple: select2_opts.multiple
       })).appendTo(self.$el);
 
@@ -766,7 +769,7 @@
         "click": "addHeaderIcon"
       },
       addHeaderIcon: function (e) {
-        self = this;
+        var self = this,
         m = new (this.collection.model);
         this.collection.add(m)
         e.preventDefault();
@@ -873,7 +876,7 @@
           }, 10);
 
 
-        }},10);
+        } },10);
       return;
     }
   });
@@ -1006,7 +1009,7 @@
 
         if (deps && _.isArray(deps)) {
           _.each(deps, function(d) {
-            attrArr = d.split('.');
+            var attrArr = d.split('.'),
             name = attrArr.shift();
             self.listenTo(self.model, "change:" + name, self.dependentChanged);
           });
@@ -1019,8 +1022,8 @@
 
         if (deps && _.isArray(deps)) {
           _.each(deps, function(d) {
-            attrArr = d.split('.');
-            name = attrArr.shift();
+            var attrArr = d.split('.'),
+              name = attrArr.shift();
 
             self.stopListening(self.model, "change:" + name, self.dependentChanged);
           });
@@ -1357,9 +1360,9 @@
     },
     closeIt: function(ev) {
       var formatter = this.formatter,
-          model = this.model;
-          column = this.column;
-          val = this.$el.val();
+          model = this.model,
+          column = this.column,
+          val = this.$el.val(),
           newValue = formatter.toRaw(val, model);
 
       if (this.is_closing)
@@ -1397,7 +1400,7 @@
 
         this.render();
 
-        is_editable = _.isFunction(editable) ? !!editable.apply(column, [model]) : !!editable;
+        var is_editable = _.isFunction(editable) ? !!editable.apply(column, [model]) : !!editable;
         setTimeout(function() {
           self.$el.removeClass("editor");
           if (is_editable){ self.$el.addClass("editable"); }
diff --git a/web/pgadmin/static/js/check_node_visibility.js b/web/pgadmin/static/js/check_node_visibility.js
index ddd19906..18b6655c 100644
--- a/web/pgadmin/static/js/check_node_visibility.js
+++ b/web/pgadmin/static/js/check_node_visibility.js
@@ -30,7 +30,7 @@ define(['jquery', 'underscore', 'underscore.string'],
         return true;
       }
 
-      preference = pgBrowser.get_preference("browser", 'show_node_'+node_type);
+      var preference = pgBrowser.get_preference("browser", 'show_node_'+node_type);
 
       if (preference) {
         return preference.value
diff --git a/web/pgadmin/static/js/selection/clipboard.js b/web/pgadmin/static/js/selection/clipboard.js
index ac0dee50..ad84fdef 100644
--- a/web/pgadmin/static/js/selection/clipboard.js
+++ b/web/pgadmin/static/js/selection/clipboard.js
@@ -50,7 +50,6 @@ define(['sources/gettext', 'alertify'], function (gettext, alertify) {
          * called for each copy operation performed on any input/textarea from
          * this document.
          */
-        document.removeEventListener('copy', arguments.callee);
 
         var clipboardData = e.clipboardData || window.clipboardData;
 
diff --git a/web/pgadmin/static/js/selection/copy_data.js b/web/pgadmin/static/js/selection/copy_data.js
index 35259666..2f30dd70 100644
--- a/web/pgadmin/static/js/selection/copy_data.js
+++ b/web/pgadmin/static/js/selection/copy_data.js
@@ -7,7 +7,7 @@ define([
 ],
 function ($, _, clipboard, RangeSelectionHelper, rangeBoundaryNavigator) {
   var copyData = function () {
-    var self = this;
+    var self = this || window;
 
     var grid = self.slickgrid;
     var columnDefinitions = grid.getColumns();
diff --git a/web/pgadmin/static/js/slickgrid/event_handlers/handle_query_output_keyboard_event.js b/web/pgadmin/static/js/slickgrid/event_handlers/handle_query_output_keyboard_event.js
index 2a319407..50ebd471 100644
--- a/web/pgadmin/static/js/slickgrid/event_handlers/handle_query_output_keyboard_event.js
+++ b/web/pgadmin/static/js/slickgrid/event_handlers/handle_query_output_keyboard_event.js
@@ -8,14 +8,15 @@ function (copyData, RangeSelectionHelper) {
     var KEY_A = 65;
     var modifiedKey = event.keyCode;
     var isModifierDown = event.ctrlKey || event.metaKey;
-    this.slickgrid = args.grid;
+    var self = this || window;
+    self.slickgrid = args.grid;
 
     if (isModifierDown && modifiedKey == KEY_C) {
-      copyData.apply(this);
+      copyData.apply(self);
     }
 
     if (isModifierDown && modifiedKey == KEY_A) {
-      RangeSelectionHelper.selectAll(this.slickgrid);
+      RangeSelectionHelper.selectAll(self.slickgrid);
     }
   }
 });
\ No newline at end of file
diff --git a/web/pgadmin/static/js/slickgrid/slick.pgadmin.editors.js b/web/pgadmin/static/js/slickgrid/slick.pgadmin.editors.js
index 15b5fe9b..f3a28ddd 100644
--- a/web/pgadmin/static/js/slickgrid/slick.pgadmin.editors.js
+++ b/web/pgadmin/static/js/slickgrid/slick.pgadmin.editors.js
@@ -35,7 +35,7 @@
   // Generate and return editor buttons
   function getButtons(editable) {
     var $buttons = $("<div class='pg_buttons' />"),
-      label = editable ? 'Cancel': 'OK';
+      label = editable ? 'Cancel': 'OK',
       button_type = editable ? 'btn-danger' : 'btn-primary';
 
     if (editable) {
@@ -43,7 +43,7 @@
           .appendTo($buttons);
     }
 
-    $cancel_button = $("<button class='btn " + button_type + " fa fa-lg fa-times long_text_editor pg-alertify-button'>"+ label +"</button>")
+    var $cancel_button = $("<button class='btn " + button_type + " fa fa-lg fa-times long_text_editor pg-alertify-button'>"+ label +"</button>")
         .appendTo($buttons);
     return $buttons;
   }
@@ -119,7 +119,7 @@
 
   // Text data type editor
   function pgTextEditor(args) {
-    var $input, $wrapper;
+    var $input, $wrapper, $buttons;
     var defaultValue;
     var scope = this;
 
@@ -256,7 +256,7 @@
 
   // JSON data type editor
   function JsonTextEditor(args) {
-    var $input, $wrapper;
+    var $input, $wrapper, $buttons;
     var defaultValue;
     var scope = this;
 
@@ -379,7 +379,7 @@
 
   // Text data type editor
   function ReadOnlypgTextEditor(args) {
-    var $input, $wrapper;
+    var $input, $wrapper, $buttons;
     var defaultValue;
     var scope = this;
 
@@ -584,7 +584,7 @@
 
   // JSON data type editor
   function ReadOnlyJsonTextEditor(args) {
-    var $input, $wrapper;
+    var $input, $wrapper, $buttons;
     var defaultValue;
     var scope = this;
 
diff --git a/web/pgadmin/static/jsx/history/detail/code_mirror.jsx b/web/pgadmin/static/jsx/history/detail/code_mirror.jsx
index a2c3cae2..6f07e38c 100644
--- a/web/pgadmin/static/jsx/history/detail/code_mirror.jsx
+++ b/web/pgadmin/static/jsx/history/detail/code_mirror.jsx
@@ -8,8 +8,8 @@
 //////////////////////////////////////////////////////////////////////////
 
 import React from 'react';
-import $ from '../../../vendor/jquery/jquery-1.11.2';
-import code_mirror from '../../../vendor/codemirror/lib/codemirror';
+import $ from 'jquery';
+import code_mirror from 'sources/../bundle/codemirror';
 
 export default class CodeMirror extends React.Component {
 
diff --git a/web/pgadmin/static/jsx/history/detail/history_detail_query.jsx b/web/pgadmin/static/jsx/history/detail/history_detail_query.jsx
index 0ef63a0a..b3eab01f 100644
--- a/web/pgadmin/static/jsx/history/detail/history_detail_query.jsx
+++ b/web/pgadmin/static/jsx/history/detail/history_detail_query.jsx
@@ -8,7 +8,7 @@
 //////////////////////////////////////////////////////////////////////////
 
 import React from 'react';
-import '../../../vendor/codemirror/mode/sql/sql';
+import 'codemirror/mode/sql/sql';
 
 import CodeMirror from './code_mirror';
 import Shapes from '../../react_shapes';
diff --git a/web/pgadmin/static/jsx/history/query_history.jsx b/web/pgadmin/static/jsx/history/query_history.jsx
index 270dbf19..52806a63 100644
--- a/web/pgadmin/static/jsx/history/query_history.jsx
+++ b/web/pgadmin/static/jsx/history/query_history.jsx
@@ -102,4 +102,8 @@ export default class QueryHistory extends React.Component {
 
 QueryHistory.propTypes = {
   historyCollection: Shapes.historyCollectionClass.isRequired,
+};
+
+export {
+  QueryHistory,
 };
\ No newline at end of file
diff --git a/web/pgadmin/static/scss/pgadmin.scss b/web/pgadmin/static/scss/pgadmin.scss
index ff465a87..1595405a 100644
--- a/web/pgadmin/static/scss/pgadmin.scss
+++ b/web/pgadmin/static/scss/pgadmin.scss
@@ -1,4 +1,11 @@
 $enable-flex: true;
+@import '../css/webcabin.overrides.css';
+@import '../css/bootstrap.overrides.css';
+@import '../css/aci_tree.overrides.css';
+@import '../css/select2.overrides.css';
+@import '../css/pgadmin.css';
+@import '../css/pgadmin.style.css';
+@import '../css/codemirror.overrides.css';
 
 @import 'primaryblue';
 @import 'colorsgrey';
diff --git a/web/pgadmin/templates/base.html b/web/pgadmin/templates/base.html
index faf03fd4..1d24b819 100755
--- a/web/pgadmin/templates/base.html
+++ b/web/pgadmin/templates/base.html
@@ -19,47 +19,12 @@
     <link rel="shortcut icon" href="{{ url_for('redirects.favicon') }}"/>
 
     <!-- Base template stylesheets -->
-    <link type="text/css" rel="stylesheet"
-          href="{{ url_for('static', filename='vendor/bootstrap/css/bootstrap.css' if config.DEBUG else 'vendor/bootstrap/css/bootstrap.min.css')}}"/>
-    <link type="text/css" rel="stylesheet"
-          href="{{ url_for('static', filename='vendor/alertifyjs/alertify.css' if config.DEBUG else 'vendor/alertifyjs/alertify.min.css') }}"/>
-    <link type="text/css" rel="stylesheet"
-          href="{{ url_for('static', filename='vendor/alertifyjs/themes/bootstrap.css' if config.DEBUG else 'vendor/alertifyjs/themes/bootstrap.min.css') }}"/>
-    <link type="text/css" rel="stylesheet"
-          href="{{ url_for('static', filename='vendor/bootstrap/css/bootstrap-theme.css' if config.DEBUG else 'vendor/bootstrap/css/bootstrap-theme.min.css') }}"/>
-    <link type="text/css" rel="stylesheet"
-          href="{{ url_for('static', filename='vendor/font-awesome/css/font-awesome.css' if config.DEBUG else 'vendor/font-awesome/css/font-awesome.min.css') }}"/>
-    <link type="text/css" rel="stylesheet" href="{{ url_for('static', filename='vendor/font-mfizz/font-mfizz.css') }}"/>
-    <link type="text/css" rel="stylesheet" href="{{ url_for('static', filename='vendor/bootstrap/bootstrap-datepicker3.css') }}"/>
-    <link type="text/css" rel="stylesheet" href="{{ url_for('static', filename='vendor/bootstrap/bootstrap-datetimepicker.min.css')}}"/>
-    <link type="text/css" rel="stylesheet" href="{{ url_for('static', filename='vendor/bootstrap/bootstrap-switch.css')}}"/>
     <link type="text/css" rel="stylesheet" href="{{ url_for('static', filename='vendor/backgrid/backgrid.css')}}"/>
-    <link type="text/css" rel="stylesheet"
-          href="{{ url_for('static', filename='vendor/backgrid/backgrid-select-all.css' if config.DEBUG else 'vendor/backgrid/backgrid-select-all.min.css')}}"/>
-    <link type="text/css" rel="stylesheet"
-          href="{{ url_for('static', filename='vendor/backgrid/backgrid-paginator.css' if config.DEBUG else 'vendor/backgrid/backgrid-paginator.min.css')}}"/>
-    <link type="text/css" rel="stylesheet"
-          href="{{ url_for('static', filename='vendor/backgrid/backgrid-filter.css' if config.DEBUG else 'vendor/backgrid/backgrid-filter.min.css')}}"/>
-    <link type="text/css" rel="stylesheet"
-          href="{{ url_for('static', filename='vendor/backgrid/backgrid-sizeable-columns.css')}}"/>
-    <link type="text/css" rel="stylesheet"
-          href="{{ url_for('static', filename='vendor/select2/select2.css' if config.DEBUG else 'vendor/select2/select2.min.css')}}"/>
+    <link type="text/css" rel="stylesheet" href="{{ url_for('browser.browser_css')}}"/>
+    <link type="text/css" rel="stylesheet" href="{{ url_for('static', filename='js/generated/style.css')}}"/>
+    <link type="text/css" rel="stylesheet" href="{{ url_for('static', filename='js/generated/pgadmin.css')}}"/>
 
-    <link type="text/css" rel="stylesheet"
-          href="{{ url_for('static', filename='vendor/codemirror/addon/scroll/simplescrollbars.css')}}"/>
-
-    <!-- View specified stylesheets -->
-    {% for stylesheet in current_app.stylesheets %}
-    <link type="text/css" rel="stylesheet" href="{{ stylesheet }}">
-    {% endfor %}
-
-    <link type="text/css" rel="stylesheet" href="{{ url_for('static', filename='css/bootstrap.overrides.css') }}"/>
-    <link type="text/css" rel="stylesheet" href="{{ url_for('static', filename='css/aci_tree.overrides.css') }}"/>
-    <link type="text/css" rel="stylesheet" href="{{ url_for('static', filename='css/select2.overrides.css') }}"/>
-    <link type="text/css" rel="stylesheet" href="{{ url_for('static', filename='css/pgadmin.css') }}"/>
-    <link type="text/css" rel="stylesheet" href="{{ url_for('static', filename='css/pgadmin.style.css') }}"/>
-    <link type="text/css" rel="stylesheet" href="{{ url_for('static', filename='css/codemirror.overrides.css') }}"/>
-    <link type="text/css" rel="stylesheet" href="{{ url_for('static', filename='js/generated/pgadmincss.css') }}"/>
+     <!--View specified stylesheets-->
     {% block css_link %}{% endblock %}
 
     <!-- Base template scripts -->
@@ -69,124 +34,30 @@
             require.config({
                 baseUrl: '',
                 waitSeconds: 0,
-                packages: [{
-                  name: 'codemirror',
-                  location: '{{ url_for('static', filename='vendor/codemirror')}}',
-                  main: 'lib/codemirror'
-                }],
-                shim: {
-                    "backbone": {
-                        "deps": ['underscore', 'jquery'],
-                        "exports": 'Backbone'
-                    },
-                    "backbone.paginator": {
-                        "deps": ['underscore', 'jquery', 'backbone']
-                    },
-                    "bootstrap": {
-                        "deps": ['jquery'],
-                    },
-                    "backgrid": {
-                        "deps": ['backform'],
-                        "exports": 'Backgrid',
-                    },
-                    "backgrid.select.all": {
-                        "deps": ['backgrid']
-                    },
-                    "backgrid.paginator": {
-                        "deps": ['backgrid', 'backbone.paginator']
-                    },
-                    "backgrid.filter": {
-                        "deps": ['backgrid']
-                    },
-                    "backgrid.sizeable.columns": {
-                        "deps": ['backgrid']
-                    },
-                    "bootstrap.switch": {
-                        "deps": ['jquery', 'bootstrap'],
-                        "exports": 'jQuery.fn.bootstrapSwitch'
-                    },
-                    "select2": {
-                        "deps": ['jquery'],
-                        "exports": 'jQuery.fn.select2'
-                    },
-                    "bootstrap.datepicker": {
-                        "deps": ['jquery', 'bootstrap'],
-                        "exports": 'jQuery.fn.datepicker'
-                    },
-                    "bootstrap.datetimepicker": {
-                        "deps": ['jquery', 'bootstrap', 'moment'],
-                        "exports": 'jQuery.fn.datetimepicker'
-                    },
-                    "pgadmin.backgrid": {
-                        "deps": ["backgrid", "bootstrap.datetimepicker", "bootstrap.switch"],
-                    },
-                    "pgadmin.backform": {
-                        "deps": ['backform', "pgadmin.backgrid", "select2"],
-                    },
-                    "jquery.event.drag": {
-                        "deps": ['jquery'], "exports": 'jQuery.fn.drag'
-                    },
-                    "jquery.ui": {"deps": ['jquery']},
-                    "slick.pgadmin.formatters": {"deps": ['slickgrid']},
-                    "slick.pgadmin.editors": {"deps": ['slickgrid']},
-                    "slickgrid": {
-                        "deps": [
-                            'jquery', "jquery.ui", "jquery.event.drag"
-                        ],
-                        "exports": 'Slick'
-                    },
-                    "flotr2": {
-                        deps: ['bean'],
-                        exports: function(bean) {
-                            Flotr.bean = bean;
-                            return this.Flotr;
-                        }
-                    }{% for script in current_app.javascripts %}{% if 'deps' in script or 'exports' in script %},
-                    '{{ script.name }}': {
-                    {% if 'deps' in script %}"deps": [{% for dep in script['deps'] %} {% if loop.index != 1 %}, {% endif %} '{{ dep }}'{% endfor %}],{% endif %}
-                        {% if 'exports' in script %}"exports": "{{ script['exports'] }}"{% endif %}
-                    }{% endif %}{% endfor %}
-                },
+                shim: {},
                 paths: {
                     pgadmin: "{{ url_for('static', filename='js/pgadmin') }}",
                     sources: "{{ url_for('static', filename='js') }}",
-                    'pgadmin.alertifyjs': "{{ url_for('static', filename='js/alertify.pgadmin.defaults') }}",
-                    "pgadmin.backgrid": "{{ url_for('static', filename='js/backgrid.pgadmin') }}",
-                    'pgadmin.backform': "{{ url_for('static', filename='js/backform.pgadmin') }}",
-                    modernizr: "{{ url_for('static', filename='vendor/modernizr/modernizr-2.6.2-respond-1.1.0.min') }}",
-                    jquery: "{{ url_for('static', filename='vendor/jquery/jquery-1.11.2' + ('' if config.DEBUG else '.min')) }}",
-                    select2: "{{ url_for('static', filename='vendor/select2/select2.full'+ ('' if config.DEBUG else '.min')) }}",
-                    moment: "{{ url_for('static', filename='vendor/moment/moment-with-locales' + ('' if config.DEBUG else '.min')) }}",
-                    underscore: "{{ url_for('static', filename='vendor/underscore/underscore'+ ('' if config.DEBUG else '-min')) }}",
-                    "underscore.string": "{{ url_for('static', filename='vendor/underscore/underscore.string' + ('' if config.DEBUG else '.min')) }}",
-                    bootstrap: "{{ url_for('static', filename='vendor/bootstrap/js/bootstrap' + ('' if config.DEBUG else '.min')) }}",
-                    alertifyjs: "{{ url_for('static', filename='vendor/alertifyjs/alertify' + ('' if config.DEBUG else '.min')) }}",
-                    backbone: "{{ url_for('static', filename='vendor/backbone/backbone' + ('' if config.DEBUG else '-min')) }}",
-                    "backbone.paginator": "{{ url_for('static', filename='vendor/backbone/backbone.paginator' + ('' if config.DEBUG else '.min')) }}",
-                    "bootstrap.datepicker": "{{ url_for('static', filename='vendor/bootstrap/bootstrap-datepicker' + ('' if config.DEBUG else '.min')) }}",
-                    "bootstrap.datetimepicker": "{{ url_for('static', filename='vendor/bootstrap/bootstrap-datetimepicker' + ('' if config.DEBUG else '.min')) }}",
-                    "bootstrap.switch": "{{ url_for('static', filename='vendor/bootstrap/bootstrap-switch' + ('' if config.DEBUG else '.min')) }}",
-                    backform: "{{ url_for('static', filename='vendor/backform/backform') }}",
-                    backgrid: "{{ url_for('static', filename='vendor/backgrid/backgrid' + ('' if config.DEBUG else '.min')) }}",
-                    "backgrid.select.all": "{{ url_for('static', filename='vendor/backgrid/backgrid-select-all' + ('' if config.DEBUG else '.min')) }}",
-                    "backgrid.paginator": "{{ url_for('static', filename='vendor/backgrid/backgrid-paginator' + ('' if config.DEBUG else '.min')) }}",
-                    "backgrid.filter": "{{ url_for('static', filename='vendor/backgrid/backgrid-filter' + ('' if config.DEBUG else '.min')) }}",
-                    "backgrid.sizeable.columns": "{{ url_for('static', filename='vendor/backgrid/backgrid-sizeable-columns') }}",
-                    "backbone.undo": "{{ url_for('static', filename='vendor/backbone/backbone.undo' + ('' if config.DEBUG else '.min')) }}",
-                    "jquery.event.drag": "{{ url_for('static', filename='vendor/jquery-ui/jquery.event.drag-2.2') }}",
-                    "jquery.ui": "{{ url_for('static', filename='vendor/jquery-ui/jquery-ui-1.11.3' + ('' if config.DEBUG else '.min')) }}",
-                    "bignumber": "{{ url_for('static', filename='vendor/bignumber/bignumber' if config.DEBUG else 'vendor/bignumber/bignumber.min') }}",
-                    bean :"{{ url_for('static', filename='vendor/flotr2/bean' + ('' if config.DEBUG else '-min')) }}",
-                    flotr2 :"{{ url_for('static', filename='vendor/flotr2/flotr2.amd') }}",
-                    slickgrid: "{{ url_for('static', filename='js/generated/slickgrid') }}"
-                    {% for script in current_app.javascripts %}
-                        ,'{{ script.name }}': "{{ script.path }}"
-                    {% endfor %}
+                    slickgrid: "{{ url_for('static', filename='js/generated/slickgrid') }}",
+                    codemirror: "{{ url_for('static', filename='js/generated/codemirror') }}",
+                    datagrid: "{{ url_for('static', filename='js/generated/datagrid') }}",
+                    sqleditor: "{{ url_for('static', filename='js/generated/sqleditor') }}"
+                    ,'browser_node': "{{ url_for('static', filename='js/generated/browser_node') }}"
+                    ,'misc': "{{ url_for('static', filename='js/generated/misc') }}"
+                    ,'pgadmin.browser.utils': "/browser/js/utils"
+                    ,'pgadmin.browser.endpoints': "/browser/js/endpoints"
+                    ,'pgadmin.browser.messages': "/browser/js/messages"
+                    ,'pgadmin.server.supported_servers': "/browser/server/supported_servers"
+                    ,'pgadmin.user_management.current_user': "/user_management/current_user"
+                    ,'translations': "/tools/translations"
                 }
             });
 
     </script>
     <!-- View specified scripts -->
+    <script type="text/javascript" src="{{ url_for('static', filename='js/generated/vendor.js') }}" ></script>
+    <script type="text/javascript" src="{{ url_for('static', filename='js/generated/pgadmin_commons.js') }}" ></script>
+
 
 </head>
 <body>
diff --git a/web/pgadmin/tools/backup/templates/backup/js/backup.js b/web/pgadmin/tools/backup/templates/backup/js/backup.js
index 3b584559..361926da 100644
--- a/web/pgadmin/tools/backup/templates/backup/js/backup.js
+++ b/web/pgadmin/tools/backup/templates/backup/js/backup.js
@@ -2,7 +2,7 @@
 define([
   'sources/gettext', 'sources/url_for', 'jquery', 'underscore', 'underscore.string', 'alertify',
   'pgadmin.browser', 'backbone', 'backgrid', 'backform', 'pgadmin.browser.node',
-  'sources/alerts/alertify_wrapper',
+  'sources/alerts/alertify_wrapper'
 ], function(gettext, url_for, $, _, S, alertify, pgBrowser, Backbone, Backgrid, Backform, pgNode, AlertifyWrapper) {
 
   // if module is already initialized, refer to that.
@@ -280,7 +280,7 @@ TODO LIST FOR BACKUP:
           menu will be enabled otherwise disabled.
           Also, hide it for system view in catalogs
         */
-        menu_enabled = function(itemData, item, data) {
+        var menu_enabled = function(itemData, item, data) {
           var t = pgBrowser.tree, i = item, d = itemData;
           var parent_item = t.hasParent(i) ? t.parent(i): null,
               parent_data = parent_item ? t.itemData(parent_item) : null;
@@ -301,7 +301,7 @@ TODO LIST FOR BACKUP:
               return false;
         };
 
-        menu_enabled_server = function(itemData, item, data) {
+        var menu_enabled_server = function(itemData, item, data) {
           var t = pgBrowser.tree, i = item, d = itemData;
           var parent_item = t.hasParent(i) ? t.parent(i): null,
               parent_data = parent_item ? t.itemData(parent_item) : null;
@@ -628,7 +628,7 @@ TODO LIST FOR BACKUP:
           return;
         }
 
-        var title = S('{{ 'Backup (%s: %s)' }}'),
+        var title = S(gettext('Backup (%s: %s)')),
             tree = pgBrowser.tree,
             item = treeItem || tree.selected(),
             data = item && item.length == 1 && tree.itemData(item),
diff --git a/web/pgadmin/tools/datagrid/templates/datagrid/index.html b/web/pgadmin/tools/datagrid/templates/datagrid/index.html
index 4bb38c47..24ea7420 100644
--- a/web/pgadmin/tools/datagrid/templates/datagrid/index.html
+++ b/web/pgadmin/tools/datagrid/templates/datagrid/index.html
@@ -257,13 +257,13 @@
 </div>
 {% endblock %}
 
-{% block init_script %}require(
-  ['jquery', 'pgadmin', 'require', 'underscore.string'],
-function($, pgAdmin, R, S) {
-	R(['pgadmin.sqleditor'], function() {
-    var editorPanel = $('.sql-editor'),
-    loadingDiv = $('#fetching_data'),
-    msgDiv = loadingDiv.find('.sql-editor-busy-text');
+{% block init_script %}
+	require(['sources/generated/sqleditor'], function(ctx) {
+    var $ = pgAdmin.SqlEditor.jquery,
+        S = pgAdmin.SqlEditor.S,
+        editorPanel = $('.sql-editor'),
+        loadingDiv = $('#fetching_data'),
+        msgDiv = loadingDiv.find('.sql-editor-busy-text');
 
     // Register unload event on window close.
     window.onbeforeunload = function(ev) {
@@ -272,6 +272,7 @@ function($, pgAdmin, R, S) {
         method: 'GET'
       });
     };
+
     // Get the controller object from pgAdmin.SqlEditor
     var sqlEditorController = pgAdmin.SqlEditor.create(editorPanel);
 
@@ -319,6 +320,5 @@ function($, pgAdmin, R, S) {
     // Start the query tool.
     sqlEditorController.start({{ is_query_tool }}, "{{ editor_title }}",
                     script_sql, {{ is_new_browser_tab }});
-  });
 });
 {% endblock %}
diff --git a/web/pgadmin/tools/datagrid/templates/datagrid/js/datagrid.js b/web/pgadmin/tools/datagrid/templates/datagrid/js/datagrid.js
index cda5c530..ce952f0f 100644
--- a/web/pgadmin/tools/datagrid/templates/datagrid/js/datagrid.js
+++ b/web/pgadmin/tools/datagrid/templates/datagrid/js/datagrid.js
@@ -1,9 +1,8 @@
-define([
-  'sources/gettext', 'sources/url_for', 'jquery','alertify', 'pgadmin','codemirror',
-  'sources/sqleditor_utils', 'pgadmin.browser', 'wcdocker',
-  'codemirror/addon/edit/matchbrackets', 'codemirror/addon/edit/closebrackets'
-
-], function(gettext, url_for, $, alertify, pgAdmin, codemirror, sqlEditorUtils) {
+define('tools.datagrid', [
+  'sources/gettext', 'sources/url_for', 'jquery', 'underscore', 'alertify', 'pgadmin',
+  'bundled_codemirror',
+  'sources/sqleditor_utils', 'wcdocker'
+], function(gettext, url_for, $, _, alertify, pgAdmin, CodeMirror, sqlEditorUtils) {
     // Some scripts do export their object in the window only.
     // Generally the one, which do no have AMD support.
     var wcDocker = window.wcDocker,
@@ -42,14 +41,7 @@ define([
             return (_.indexOf(supported_nodes, obj._type) !== -1 ? true: false);
           else
             return false;
-        };
-
-        // Define list of nodes on which Query tool option doesn't appears
-        var unsupported_nodes = pgAdmin.unsupported_nodes = [
-           'server-group', 'server', 'coll-tablespace', 'tablespace',
-           'coll-role', 'role', 'coll-resource_group', 'resource_group',
-           'coll-database'
-        ],
+        },
 
         /* Enable/disable Query tool menu in tools based
          * on node selected. if selected node is present
@@ -58,7 +50,7 @@ define([
          */
         query_tool_menu_enabled = function(obj) {
           if(!_.isUndefined(obj) && !_.isNull(obj)) {
-            if(_.indexOf(unsupported_nodes, obj._type) == -1) {
+            if(_.indexOf(pgAdmin.unsupported_nodes, obj._type) == -1) {
               if (obj._type == 'database' && obj.allowConn)
                 return true;
               else if(obj._type != 'database')
@@ -427,7 +419,7 @@ define([
       show_query_tool: function(url, i, panel_title) {
         var self = this,
           sURL = url || '',
-          panel_title = panel_title || '';
+          panel_title = panel_title || '',
           d = pgAdmin.Browser.tree.itemData(i);
         if (d === undefined) {
           alertify.alert(
diff --git a/web/pgadmin/tools/debugger/__init__.py b/web/pgadmin/tools/debugger/__init__.py
index 35a0378c..46c6fd81 100644
--- a/web/pgadmin/tools/debugger/__init__.py
+++ b/web/pgadmin/tools/debugger/__init__.py
@@ -69,10 +69,29 @@ class DebuggerModule(PgAdminModule):
                              'will be opened in a new browser tab.')
         )
 
+
+    def get_exposed_url_endpoints(self):
+        """
+        Returns the list of URLs exposed to the client.
+        """
+        return ['debugger.index','debugger.init_for_function',
+                'debugger.init_for_trigger',
+                'debugger.direct', 'debugger.initialize_target_for_function',
+                'debugger.initialize_target_for_trigger', 'debugger.close',
+                'debugger.restart',
+                'debugger.start_listener', 'debugger.execute_query',
+                'debugger.messages',
+                'debugger.start_execution', 'debugger.set_breakpoint',
+                'debugger.clear_all_breakpoint', 'debugger.deposit_value',
+                'debugger.select_frame', 'debugger.get_arguments',
+                'debugger.set_arguments',
+                'debugger.poll_end_execution_result', 'debugger.poll_result'
+            ]
+
 blueprint = DebuggerModule(MODULE_NAME, __name__)
 
 
-@blueprint.route("/")
+@blueprint.route("/", endpoint='index')
 @login_required
 def index():
     return bad_request(errormsg=gettext("This URL cannot be called directly!"))
@@ -120,8 +139,14 @@ def update_session_function_transaction(trans_id, data):
     session['functionData'] = function_data
 
 
-@blueprint.route('/init/<node_type>/<int:sid>/<int:did>/<int:scid>/<int:fid>', methods=['GET'])
-@blueprint.route('/init/<node_type>/<int:sid>/<int:did>/<int:scid>/<int:fid>/<int:trid>', methods=['GET'])
+@blueprint.route(
+    '/init/<node_type>/<int:sid>/<int:did>/<int:scid>/<int:fid>',
+    methods=['GET'], endpoint='init_for_function'
+)
+@blueprint.route(
+    '/init/<node_type>/<int:sid>/<int:did>/<int:scid>/<int:fid>/<int:trid>',
+    methods=['GET'], endpoint='init_for_trigger'
+)
 @login_required
 def init_function(node_type, sid, did, scid, fid, trid=None):
     """
@@ -291,7 +316,7 @@ def init_function(node_type, sid, did, scid, fid, trid=None):
     )
 
 
-@blueprint.route('/direct/<int:trans_id>', methods=['GET'])
+@blueprint.route('/direct/<int:trans_id>', methods=['GET'], endpoint='direct')
 @login_required
 def direct_new(trans_id):
     debugger_data = session['debuggerData']
@@ -333,10 +358,16 @@ def direct_new(trans_id):
     )
 
 
-@blueprint.route('/initialize_target/<debug_type>/<int:sid>/<int:did>/<int:scid>/<int:func_id>',
-                 methods=['GET', 'POST'])
-@blueprint.route('/initialize_target/<debug_type>/<int:sid>/<int:did>/<int:scid>/<int:func_id>/<int:tri_id>',
-                 methods=['GET', 'POST'])
+@blueprint.route(
+    '/initialize_target/<debug_type>/<int:sid>/<int:did>/<int:scid>/<int:func_id>',
+    methods=['GET', 'POST'],
+    endpoint='initialize_target_for_function'
+)
+@blueprint.route(
+    '/initialize_target/<debug_type>/<int:sid>/<int:did>/<int:scid>/<int:func_id>/<int:tri_id>',
+    methods=['GET', 'POST'],
+    endpoint='initialize_target_for_trigger'
+)
 @login_required
 def initialize_target(debug_type, sid, did, scid, func_id, tri_id=None):
     """
@@ -524,7 +555,7 @@ def initialize_target(debug_type, sid, did, scid, func_id, tri_id=None):
                                     'newBrowserTab': new_browser_tab})
 
 
-@blueprint.route('/close/<int:trans_id>', methods=["DELETE"])
+@blueprint.route('/close/<int:trans_id>', methods=["DELETE"], endpoint='close')
 def close(trans_id):
     """
     close(trans_id)
@@ -564,7 +595,7 @@ def close(trans_id):
         return internal_server_error(errormsg=str(e))
 
 
-@blueprint.route('/restart/<int:trans_id>', methods=['GET'])
+@blueprint.route('/restart/<int:trans_id>', methods=['GET'], endpoint='restart')
 @login_required
 def restart_debugging(trans_id):
     """
@@ -623,7 +654,10 @@ def restart_debugging(trans_id):
     return make_json_response(data={'status': status})
 
 
-@blueprint.route('/start_listener/<int:trans_id>', methods=['GET', 'POST'])
+@blueprint.route(
+    '/start_listener/<int:trans_id>', methods=['GET', 'POST'],
+    endpoint='start_listener'
+)
 @login_required
 def start_debugger_listener(trans_id):
     """
@@ -810,8 +844,10 @@ def start_debugger_listener(trans_id):
 
     return make_json_response(data={'status': status, 'result': result})
 
-
-@blueprint.route('/execute_query/<int:trans_id>/<query_type>', methods=['GET'])
+@blueprint.route(
+    '/execute_query/<int:trans_id>/<query_type>', methods=['GET'],
+    endpoint='execute_query'
+)
 @login_required
 def execute_debugger_query(trans_id, query_type):
     """
@@ -892,7 +928,7 @@ def execute_debugger_query(trans_id, query_type):
     )
 
 
-@blueprint.route('/messages/<int:trans_id>/', methods=["GET"])
+@blueprint.route('/messages/<int:trans_id>/', methods=["GET"],endpoint='messages')
 @login_required
 def messages(trans_id):
     """
@@ -957,9 +993,10 @@ def messages(trans_id):
         return internal_server_error(errormsg=str(result))
 
 
-
-
-@blueprint.route('/start_execution/<int:trans_id>/<int:port_num>', methods=['GET'])
+@blueprint.route(
+    '/start_execution/<int:trans_id>/<int:port_num>', methods=['GET'],
+    endpoint='start_execution'
+)
 @login_required
 def start_execution(trans_id, port_num):
     """
@@ -1027,7 +1064,10 @@ def start_execution(trans_id, port_num):
     return make_json_response(data={'status': 'Success', 'result': res_port['rows'][0]['pldbg_attach_to_port']})
 
 
-@blueprint.route('/set_breakpoint/<int:trans_id>/<int:line_no>/<int:set_type>', methods=['GET'])
+@blueprint.route(
+    '/set_breakpoint/<int:trans_id>/<int:line_no>/<int:set_type>',
+    methods=['GET'], endpoint='set_breakpoint'
+)
 @login_required
 def set_clear_breakpoint(trans_id, line_no, set_type):
     """
@@ -1096,7 +1136,10 @@ def set_clear_breakpoint(trans_id, line_no, set_type):
     return make_json_response(data={'status': status, 'result': result['rows']})
 
 
-@blueprint.route('/clear_all_breakpoint/<int:trans_id>', methods=['POST'])
+@blueprint.route(
+    '/clear_all_breakpoint/<int:trans_id>', methods=['POST'],
+    endpoint='clear_all_breakpoint'
+)
 @login_required
 def clear_all_breakpoint(trans_id):
     """
@@ -1148,7 +1191,9 @@ def clear_all_breakpoint(trans_id):
     return make_json_response(data={'status': status, 'result': result['rows']})
 
 
-@blueprint.route('/deposit_value/<int:trans_id>', methods=['POST'])
+@blueprint.route(
+    '/deposit_value/<int:trans_id>', methods=['POST'], endpoint='deposit_value'
+)
 @login_required
 def deposit_parameter_value(trans_id):
     """
@@ -1206,7 +1251,10 @@ def deposit_parameter_value(trans_id):
     return make_json_response(data={'status': status, 'result': result})
 
 
-@blueprint.route('/select_frame/<int:trans_id>/<int:frame_id>', methods=['GET'])
+@blueprint.route(
+    '/select_frame/<int:trans_id>/<int:frame_id>', methods=['GET'],
+    endpoint='select_frame'
+)
 @login_required
 def select_frame(trans_id, frame_id):
     """
@@ -1256,7 +1304,10 @@ def select_frame(trans_id, frame_id):
     return make_json_response(data={'status': status, 'result': result['rows']})
 
 
-@blueprint.route('/get_arguments/<int:sid>/<int:did>/<int:scid>/<int:func_id>', methods=['GET'])
+@blueprint.route(
+    '/get_arguments/<int:sid>/<int:did>/<int:scid>/<int:func_id>',
+    methods=['GET'], endpoint='get_arguments'
+)
 @login_required
 def get_arguments_sqlite(sid, did, scid, func_id):
     """
@@ -1305,7 +1356,10 @@ def get_arguments_sqlite(sid, did, scid, func_id):
         return make_json_response(data={'result': 'result', 'args_count': DbgFuncArgsCount})
 
 
-@blueprint.route('/set_arguments/<int:sid>/<int:did>/<int:scid>/<int:func_id>', methods=['POST'])
+@blueprint.route(
+    '/set_arguments/<int:sid>/<int:did>/<int:scid>/<int:func_id>',
+    methods=['POST'], endpoint='set_arguments'
+)
 @login_required
 def set_arguments_sqlite(sid, did, scid, func_id):
     """
@@ -1382,6 +1436,7 @@ def set_arguments_sqlite(sid, did, scid, func_id):
 
     return make_json_response(data={'status': True, 'result': 'Success'})
 
+
 def convert_data_to_dict(conn, result):
     """
     This function helps us to convert result set into dict
@@ -1422,7 +1477,10 @@ def convert_data_to_dict(conn, result):
     return columns, result
 
 
-@blueprint.route('/poll_end_execution_result/<int:trans_id>/', methods=["GET"])
+@blueprint.route(
+    '/poll_end_execution_result/<int:trans_id>/',
+    methods=["GET"], endpoint='poll_end_execution_result'
+)
 @login_required
 def poll_end_execution_result(trans_id):
     """
@@ -1518,7 +1576,9 @@ def poll_end_execution_result(trans_id):
     return make_json_response(data={'status': status, 'result': result})
 
 
-@blueprint.route('/poll_result/<int:trans_id>/', methods=["GET"])
+@blueprint.route(
+    '/poll_result/<int:trans_id>/', methods=["GET"], endpoint='poll_result'
+)
 @login_required
 def poll_result(trans_id):
     """
diff --git a/web/pgadmin/tools/debugger/templates/debugger/direct.html b/web/pgadmin/tools/debugger/templates/debugger/direct.html
index 0e968179..e16d6024 100644
--- a/web/pgadmin/tools/debugger/templates/debugger/direct.html
+++ b/web/pgadmin/tools/debugger/templates/debugger/direct.html
@@ -4,10 +4,12 @@
 
 try {
   require(
-    ['pgadmin', 'pgadmin.tools.debugger.direct'],
-    function(pgAdmin, pgDirectDebug) {
-      pgDirectDebug.init({{ uniqueId }}, {{ debug_type }});
+    ['sources/generated/debugger_direct'],
+    function(pgDirectDebug) {
+      var pgDirectDebug = pgDirectDebug || pgAdmin.Tools.DirectDebug;
+      var $ = pgDirectDebug.jquery;
 
+      pgDirectDebug.init({{ uniqueId }}, {{ debug_type }});
       window.onbeforeunload = function(ev) {
         $.ajax({
           url: "{{ url_for('debugger.index') }}close/{{ uniqueId }}",
diff --git a/web/pgadmin/tools/debugger/templates/debugger/js/debugger.js b/web/pgadmin/tools/debugger/templates/debugger/js/debugger.js
index d77eec6d..acf37408 100644
--- a/web/pgadmin/tools/debugger/templates/debugger/js/debugger.js
+++ b/web/pgadmin/tools/debugger/templates/debugger/js/debugger.js
@@ -1,9 +1,9 @@
 define([
-  'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'alertify',
+  'sources/gettext', 'sources/url_for', 'jquery', 'underscore', 'underscore.string', 'alertify',
   'pgadmin', 'pgadmin.browser', 'backbone', 'backgrid', 'codemirror',
-  'backform', 'pgadmin.tools.debugger.ui', 'wcdocker', 'pgadmin.backform',
+  'backform', 'tools.debugger.ui', 'wcdocker', 'pgadmin.backform',
   'pgadmin.backgrid', 'pgadmin.browser.frame'
-], function(gettext, $, _, S, Alertify, pgAdmin, pgBrowser, Backbone, Backgrid, CodeMirror, Backform, get_function_arguments) {
+], function(gettext, url_for, $, _, S, Alertify, pgAdmin, pgBrowser, Backbone, Backgrid, CodeMirror, Backform, get_function_arguments) {
 
   pgAdmin = pgAdmin || window.pgAdmin || {};
 
@@ -173,7 +173,7 @@ define([
 
         var args = {
           'URL': _url,
-          'BASEURL': '{{ url_for('debugger.index')}}',
+          'BASEURL': url_for('debugger.index'),
           'REF': ref,
           'OBJTYPE': encodeURI(node.type)
         };
@@ -229,33 +229,68 @@ define([
         var treeInfo = node.getTreeNodeHierarchy.apply(node, [i]);
 
         if (d._type == "function") {
-          var baseUrl = "{{ url_for('debugger.index') }}" + "initialize_target/" + "indirect/" + treeInfo.server._id +
-                                "/" + treeInfo.database._id + "/" + treeInfo.schema._id + "/" + treeInfo.function._id;
+          var baseUrl = url_for(
+                          'debugger.initialize_target_for_function', {
+                            'debug_type': 'indirect',
+                            'sid': treeInfo.server._id,
+                            'did': treeInfo.database._id,
+                            'scid': treeInfo.schema._id,
+                            'func_id': treeInfo.function._id
+                          }
+                        );
         }
         else if (d._type == "procedure") {
-          var baseUrl = "{{ url_for('debugger.index') }}" + "initialize_target/" + "indirect/" + treeInfo.server._id +
-                                "/" + treeInfo.database._id + "/" + treeInfo.schema._id + "/" + treeInfo.procedure._id;
+          var baseUrl = url_for(
+                          'debugger.initialize_target_for_function', {
+                            'debug_type': 'indirect',
+                            'sid': treeInfo.server._id,
+                            'did': treeInfo.database._id,
+                            'scid': treeInfo.schema._id,
+                            'func_id': treeInfo.procedure._id
+                          }
+                        );
         }
         else if (d._type == "trigger_function") {
-          var baseUrl = "{{ url_for('debugger.index') }}" + "initialize_target/" + "indirect/" + treeInfo.server._id +
-                                "/" + treeInfo.database._id + "/" + treeInfo.schema._id + "/" + treeInfo.trigger_function._id;
+          var baseUrl = url_for(
+                          'debugger.initialize_target_for_function', {
+                            'debug_type': 'indirect',
+                            'sid': treeInfo.server._id,
+                            'did': treeInfo.database._id,
+                            'scid': treeInfo.schema._id,
+                            'func_id': treeInfo.trigger_function._id
+                          }
+                        );
         }
         else if (d._type == "trigger" && "table" in treeInfo) {
-          var baseUrl = "{{ url_for('debugger.index') }}" + "initialize_target/" + "indirect/" + treeInfo.server._id +
-                                "/" + treeInfo.database._id + "/" + treeInfo.schema._id + "/" + treeInfo.table._id +
-                                "/" + treeInfo.trigger._id;
+          var baseUrl = url_for(
+                          'debugger.initialize_target_for_trigger', {
+                            'debug_type': 'indirect',
+                            'sid': treeInfo.server._id,
+                            'did': treeInfo.database._id,
+                            'scid': treeInfo.schema._id,
+                            'func_id': treeInfo.table._id,
+                            'tri_id': treeInfo.trigger._id
+                          }
+                        );
         }
         else if (d._type == "trigger" && "view" in treeInfo) {
-          var baseUrl = "{{ url_for('debugger.index') }}" + "initialize_target/" + "indirect/" + treeInfo.server._id +
-                                "/" + treeInfo.database._id + "/" + treeInfo.schema._id + "/" + treeInfo.view._id +
-                                "/" + treeInfo.trigger._id;
+          var baseUrl = url_for(
+                          'debugger.initialize_target_for_trigger', {
+                            'debug_type': 'indirect',
+                            'sid': treeInfo.server._id,
+                            'did': treeInfo.database._id,
+                            'scid': treeInfo.schema._id,
+                            'func_id': treeInfo.view._id,
+                            'tri_id': treeInfo.trigger._id
+                          }
+                        );
         }
 
         $.ajax({
           url: baseUrl,
           method: 'GET',
           success: function(res) {
-            var url = "{{ url_for('debugger.index') }}" + "direct/" + res.data.debuggerTransId;
+            var url = url_for('debugger.direct', {'trans_id': res.data.debuggerTransId});
 
             if (res.data.newBrowserTab) {
               window.open(url, '_blank');
@@ -277,7 +312,7 @@ define([
 
               // Panel Closed event
               panel.on(wcDocker.EVENT.CLOSED, function() {
-                var closeUrl = "{{ url_for('debugger.index') }}" + "close/" + res.data.debuggerTransId;
+                var closeUrl = url_for('debugger.close', {'trans_id': res.data.debuggerTransId});
                 $.ajax({
                   url: closeUrl,
                   method: 'DELETE'
@@ -339,12 +374,26 @@ define([
               var treeInfo = node.getTreeNodeHierarchy.apply(node, [i]);
 
               if (d._type == "function") {
-                var baseUrl = "{{ url_for('debugger.index') }}" + "initialize_target/" + "direct/" + treeInfo.server._id +
-                                "/" + treeInfo.database._id + "/" + treeInfo.schema._id + "/" + treeInfo.function._id;
+                var baseUrl = url_for(
+                                'debugger.initialize_target_for_function', {
+                                  'debug_type': 'direct',
+                                  'sid': treeInfo.server._id,
+                                  'did': treeInfo.database._id,
+                                  'scid': treeInfo.schema._id,
+                                  'func_id': treeInfo.function._id
+                                }
+                              );
               }
               else {
-                var baseUrl = "{{ url_for('debugger.index') }}" + "initialize_target/" + "direct/" + treeInfo.server._id +
-                                "/" + treeInfo.database._id + "/" + treeInfo.schema._id + "/" + treeInfo.procedure._id;
+                var baseUrl = url_for(
+                                'debugger.initialize_target_for_function', {
+                                  'debug_type': 'direct',
+                                  'sid': treeInfo.server._id,
+                                  'did': treeInfo.database._id,
+                                  'scid': treeInfo.schema._id,
+                                  'func_id': treeInfo.procedure._id
+                                }
+                              );
               }
 
               $.ajax({
@@ -352,7 +401,7 @@ define([
                 method: 'GET',
                 success: function(res) {
 
-                  var url = "{{ url_for('debugger.index') }}" + "direct/" + res.data.debuggerTransId;
+                  var url = url_for('debugger.direct', {'trans_id': res.data.debuggerTransId});
 
                   if (res.data.newBrowserTab) {
                     window.open(url, '_blank');
@@ -374,7 +423,7 @@ define([
 
                     // Register Panel Closed event
                     panel.on(wcDocker.EVENT.CLOSED, function() {
-                      var closeUrl = "{{ url_for('debugger.index') }}" + "close/" + res.data.debuggerTransId;
+                      var closeUrl = url_for('debugger.close', {'trans_id': res.data.debuggerTransId});
                       $.ajax({
                         url: closeUrl,
                         method: 'DELETE'
diff --git a/web/pgadmin/tools/debugger/templates/debugger/js/debugger_ui.js b/web/pgadmin/tools/debugger/templates/debugger/js/debugger_ui.js
index a692ae8d..8c7076c5 100644
--- a/web/pgadmin/tools/debugger/templates/debugger/js/debugger_ui.js
+++ b/web/pgadmin/tools/debugger/templates/debugger/js/debugger_ui.js
@@ -1,9 +1,9 @@
 define([
-  'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'alertify',
+  'sources/gettext', 'sources/url_for', 'jquery', 'underscore', 'underscore.string', 'alertify',
   'pgadmin', 'pgadmin.browser', 'backbone', 'backgrid', 'codemirror',
   'backform', 'wcdocker', 'pgadmin.backform', 'pgadmin.backgrid',
   'pgadmin.browser.panel'
-], function(gettext, $, _, S, Alertify, pgAdmin, pgBrowser, Backbone, Backgrid, CodeMirror, Backform ) {
+], function(gettext, url_for, $, _, S, Alertify, pgAdmin, pgBrowser, Backbone, Backgrid, CodeMirror, Backform ) {
 
   /*
    * Function used to return the respective Backgrid control based on the data type
@@ -147,31 +147,50 @@ define([
 
               if (d._type == "function") {
                 // Get the existing function parameters available from sqlite database
-                var _Url = "{{ url_for('debugger.index') }}" + "get_arguments/" + treeInfo.server._id +
-                              "/" + treeInfo.database._id + "/" + treeInfo.schema._id + "/" + treeInfo.function._id;
+                var _Url = url_for('debugger.get_arguments', {
+                            'sid': treeInfo.server._id,
+                            'did': treeInfo.database._id,
+                            'scid': treeInfo.schema._id,
+                            'func_id': treeInfo.function._id
+                           });
               }
               else if (d._type == "procedure") {
                 // Get the existing function parameters available from sqlite database
-                var _Url = "{{ url_for('debugger.index') }}" + "get_arguments/" + treeInfo.server._id +
-                              "/" + treeInfo.database._id + "/" + treeInfo.schema._id + "/" + treeInfo.procedure._id;
+                var _Url = url_for('debugger.get_arguments', {
+                            'sid': treeInfo.server._id,
+                            'did': treeInfo.database._id,
+                            'scid': treeInfo.schema._id,
+                            'func_id': treeInfo.procedure._id
+                           });
               }
               else if (d._type == "edbfunc") {
                 // Get the existing function parameters available from sqlite database
-                var _Url = "{{ url_for('debugger.index') }}" + "get_arguments/" + treeInfo.server._id +
-                              "/" + treeInfo.database._id + "/" + treeInfo.schema._id + "/" + treeInfo.edbfunc._id;
+                var _Url = url_for('debugger.get_arguments', {
+                            'sid': treeInfo.server._id,
+                            'did': treeInfo.database._id,
+                            'scid': treeInfo.schema._id,
+                            'func_id': treeInfo.edbfunc._id
+                           });
               }
               else if (d._type == "edbproc") {
                 // Get the existing function parameters available from sqlite database
-                var _Url = "{{ url_for('debugger.index') }}" + "get_arguments/" + treeInfo.server._id +
-                              "/" + treeInfo.database._id + "/" + treeInfo.schema._id + "/" + treeInfo.edbproc._id;
+                var _Url = url_for('debugger.get_arguments', {
+                            'sid': treeInfo.server._id,
+                            'did': treeInfo.database._id,
+                            'scid': treeInfo.schema._id,
+                            'func_id': treeInfo.edbproc._id
+                           });
               }
             }
             else {
               // Get the existing function parameters available from sqlite database
-              var _Url = "{{ url_for('debugger.index') }}" + "get_arguments/" + this.data.server_id +
-                              "/" + this.data.database_id + "/" + this.data.schema_id + "/" + this.data.function_id;
+              var _Url = url_for('debugger.get_arguments', {
+                          'sid': this.data.server_id,
+                          'did': this.data.database_id,
+                          'scid': this.data.schema_id,
+                          'func_id': this.data.function_id
+                         });
             }
-
             $.ajax({
               url: _Url,
               method: 'GET',
@@ -221,16 +240,16 @@ define([
             // Below will calculate the input argument id required to store in sqlite database
             var input_arg_id = this.input_arg_id = [];
             if (this.data['proargmodes'] != null) {
-              argmode_1 = this.data['proargmodes'].split(",");
-              for (k = 0; k < argmode_1.length; k++) {
+              var argmode_1 = this.data['proargmodes'].split(",");
+              for (var k = 0; k < argmode_1.length; k++) {
                 if (argmode_1[k] == 'i' || argmode_1[k] == 'b') {
                   input_arg_id.push(k)
                 }
               }
             }
             else {
-              argtype_1 = this.data['proargtypenames'].split(",");
-              for (k = 0; k < argtype_1.length; k++) {
+              var argtype_1 = this.data['proargtypenames'].split(",");
+              for (var k = 0; k < argtype_1.length; k++) {
                   input_arg_id.push(k)
               }
             }
@@ -251,7 +270,7 @@ define([
               argname = this.data['proargnames'].split(",");
 
               // It will assign default values to "Default value" column
-              for (j = (argname.length - 1);j >= 0; j--) {
+              for (var j = (argname.length - 1); j >= 0; j--) {
                 if (this.data['proargmodes'] != null) {
                   if (arg_cnt && (argmode[j] == 'i' || argmode[j] == 'b')) {
                     arg_cnt = arg_cnt - 1;
@@ -340,7 +359,7 @@ define([
               else {
                 // If there is default arguments
                 //Below logic will assign default values to "Default value" column
-                for (j = (myargname.length - 1);j >= 0; j--) {
+                for (var j = (myargname.length - 1);j >= 0; j--) {
                   if (this.data['proargmodes'] == null) {
                     if (arg_cnt) {
                       arg_cnt = arg_cnt - 1;
@@ -528,21 +547,42 @@ define([
 
               // If debugging is not started again then we should initialize the target otherwise not
               if (self.restart_debug == 0) {
+                var baseUrl;
                 if (d._type == "function") {
-                  var baseUrl = "{{ url_for('debugger.index') }}" + "initialize_target/" + "direct/" + treeInfo.server._id +
-                                "/" + treeInfo.database._id + "/" + treeInfo.schema._id + "/" + treeInfo.function._id;
+                  baseUrl = url_for('debugger.initialize_target_for_function', {
+                                  'debug_type': 'direct',
+                                  'sid': treeInfo.server._id,
+                                  'did': treeInfo.database._id,
+                                  'scid': treeInfo.schema._id,
+                                  'func_id': treeInfo.function._id
+                                });
                 }
                 else if (d._type == "procedure") {
-                  var baseUrl = "{{ url_for('debugger.index') }}" + "initialize_target/" + "direct/" + treeInfo.server._id +
-                                "/" + treeInfo.database._id + "/" + treeInfo.schema._id + "/" + treeInfo.procedure._id;
+                  baseUrl = url_for('debugger.initialize_target_for_function', {
+                                  'debug_type': 'direct',
+                                  'sid': treeInfo.server._id,
+                                  'did': treeInfo.database._id,
+                                  'scid': treeInfo.schema._id,
+                                  'func_id': treeInfo.procedure._id
+                                });
                 }
                 else if (d._type == "edbfunc") {
-                  var baseUrl = "{{ url_for('debugger.index') }}" + "initialize_target/" + "direct/" + treeInfo.server._id +
-                                "/" + treeInfo.database._id + "/" + treeInfo.schema._id + "/" + treeInfo.edbfunc._id;
+                  baseUrl = url_for('debugger.initialize_target_for_function', {
+                                  'debug_type': 'direct',
+                                  'sid': treeInfo.server._id,
+                                  'did': treeInfo.database._id,
+                                  'scid': treeInfo.schema._id,
+                                  'func_id': treeInfo.edbfunc._id
+                                });
                 }
                 else if (d._type == "edbproc") {
-                  var baseUrl = "{{ url_for('debugger.index') }}" + "initialize_target/" + "direct/" + treeInfo.server._id +
-                                "/" + treeInfo.database._id + "/" + treeInfo.schema._id + "/" + treeInfo.edbproc._id;
+                  baseUrl = url_for('debugger.initialize_target_for_function', {
+                                  'debug_type': 'direct',
+                                  'sid': treeInfo.server._id,
+                                  'did': treeInfo.database._id,
+                                  'scid': treeInfo.schema._id,
+                                  'func_id': treeInfo.edbproc._id
+                                });
                 }
 
                 $.ajax({
@@ -551,7 +591,7 @@ define([
                   data:{'data':JSON.stringify(args_value_list)},
                   success: function(res) {
 
-                    var url = "{{ url_for('debugger.index') }}" + "direct/" + res.data.debuggerTransId;
+                    var url = url_for('debugger.direct', {'trans_id': res.data.debuggerTransId});
 
                     if (res.data.newBrowserTab) {
                       window.open(url, '_blank');
@@ -571,31 +611,47 @@ define([
 
                       // Panel Closed event
                       panel.on(wcDocker.EVENT.CLOSED, function() {
-                        var closeUrl = "{{ url_for('debugger.index') }}" + "close/" + res.data.debuggerTransId;
+                        var closeUrl = url_for('debugger.close', {'trans_id': res.data.debuggerTransId});
                         $.ajax({
                           url: closeUrl,
-                          method: 'GET'
+                          method: 'DELETE'
                         });
                       });
                     }
 
                     if (d._type == "function") {
-                      var _Url = "{{ url_for('debugger.index') }}" + "set_arguments/" + treeInfo.server._id +
-                                  "/" + treeInfo.database._id + "/" + treeInfo.schema._id + "/" + treeInfo.function._id;
+                      var _Url = url_for('debugger.set_arguments', {
+                                  'sid': treeInfo.server._id,
+                                  'did': treeInfo.database._id,
+                                  'scid': treeInfo.schema._id,
+                                  'func_id': treeInfo.function._id,
+                                 });
                     }
                     else if (d._type == "procedure") {
-                      var _Url = "{{ url_for('debugger.index') }}" + "set_arguments/" + treeInfo.server._id +
-                                  "/" + treeInfo.database._id + "/" + treeInfo.schema._id + "/" + treeInfo.procedure._id;
+                      var _Url = url_for('debugger.set_arguments', {
+                                  'sid': treeInfo.server._id,
+                                  'did': treeInfo.database._id,
+                                  'scid': treeInfo.schema._id,
+                                  'func_id': treeInfo.procedure._id,
+                                 });
                     }
                     else if (d._type == "edbfunc") {
                       // Get the existing function parameters available from sqlite database
-                      var _Url = "{{ url_for('debugger.index') }}" + "set_arguments/" + treeInfo.server._id +
-                              "/" + treeInfo.database._id + "/" + treeInfo.schema._id + "/" + treeInfo.edbfunc._id;
+                      var _Url = url_for('debugger.set_arguments', {
+                                  'sid': treeInfo.server._id,
+                                  'did': treeInfo.database._id,
+                                  'scid': treeInfo.schema._id,
+                                  'func_id': treeInfo.edbfunc._id,
+                                 });
                     }
                     else if (d._type == "edbproc") {
                       // Get the existing function parameters available from sqlite database
-                      var _Url = "{{ url_for('debugger.index') }}" + "set_arguments/" + treeInfo.server._id +
-                              "/" + treeInfo.database._id + "/" + treeInfo.schema._id + "/" + treeInfo.edbproc._id;
+                      var _Url = url_for('debugger.set_arguments', {
+                                  'sid': treeInfo.server._id,
+                                  'did': treeInfo.database._id,
+                                  'scid': treeInfo.schema._id,
+                                  'func_id': treeInfo.edbproc._id,
+                                 });
                     }
 
                     $.ajax({
@@ -621,7 +677,7 @@ define([
               }
               else {
                 // If the debugging is started again then we should only set the arguments and start the listener again
-                var baseUrl = "{{ url_for('debugger.index') }}" + "start_listener/" + self.data.trans_id;
+                var baseUrl = url_for('debugger.start_listener', {'trans_id': self.data.trans_id});
 
                 $.ajax({
                   url: baseUrl,
@@ -638,9 +694,12 @@ define([
                 });
 
                 // Set the new input arguments given by the user during debugging
-                var _Url = "{{ url_for('debugger.index') }}" + "set_arguments/" + self.data.server_id +
-                              "/" + self.data.database_id + "/" + self.data.schema_id + "/" + self.data.function_id;
-
+                var _Url = url_for('debugger.set_arguments', {
+                            'sid': self.data.server_id,
+                            'did': self.data.database_id,
+                            'scid': self.data.schema_id,
+                            'func_id': self.data.function_id
+                           });
                 $.ajax({
                   url: _Url,
                   method: 'POST',
@@ -690,7 +749,7 @@ define([
                   var self = this;
                   var enable_btn = false;
 
-                  for (i = 0; i < this.collection.length; i++ ) {
+                  for (var    i = 0; i < this.collection.length; i++ ) {
 
                     // TODO: Need to check the "NULL" and "Expression" column value to enable/disable the "Debug" button
                     if (this.collection.models[i].get('value') == "" ||
diff --git a/web/pgadmin/tools/debugger/templates/debugger/js/direct.js b/web/pgadmin/tools/debugger/templates/debugger/js/direct.js
index cbc3055a..92b97a14 100644
--- a/web/pgadmin/tools/debugger/templates/debugger/js/direct.js
+++ b/web/pgadmin/tools/debugger/templates/debugger/js/direct.js
@@ -1,20 +1,18 @@
 define([
-  'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'alertify',
-  'pgadmin','pgadmin.browser', 'backbone', 'backgrid', 'codemirror', 'backform',
-  'pgadmin.tools.debugger.ui',
+  'sources/gettext', 'sources/url_for' ,'jquery', 'underscore', 'underscore.string', 'alertify',
+  'pgadmin','pgadmin.browser', 'backbone', 'backgrid', 'sources/../bundle/codemirror', 'backform',
+  'tools.debugger.ui',
   'sources/alerts/alertify_wrapper',
 
   'wcdocker', 'pgadmin.backform',
-  'pgadmin.backgrid', 'codemirror/addon/selection/active-line',
-  'codemirror/addon/fold/foldgutter', 'codemirror/addon/fold/foldcode',
-  'pgadmin-sqlfoldcode', 'codemirror/addon/edit/matchbrackets',
-  'codemirror/addon/edit/closebrackets',
+  'pgadmin.backgrid'
 
 ], function(
-  gettext, $, _, S, Alertify, pgAdmin, pgBrowser, Backbone, Backgrid,
-  CodeMirror, Backform, debug_function_again, AlertifyWrapper
+  gettext, url_for, $, _, S, Alertify, pgAdmin, pgBrowser, Backbone, Backgrid,
+  codemirror, Backform, debug_function_again, AlertifyWrapper
 ) {
 
+  var CodeMirror = codemirror.default;
   if (pgAdmin.Browser.tree != null) {
     pgAdmin = pgAdmin || window.pgAdmin || {};
   }
@@ -41,8 +39,11 @@ define([
         var self = this;
 
         // Make ajax call to set/clear the break point by user
-        var baseUrl = "{{ url_for('debugger.index') }}" + "set_breakpoint/" + trans_id + "/" + line_no + "/" + set_type;
-
+        var baseUrl = url_for('debugger.set_breakpoint', {
+                        'trans_id': trans_id,
+                        'line_no': line_no,
+                        'set_type': set_type
+                      });
         $.ajax({
           url: baseUrl,
           method: 'GET',
@@ -72,13 +73,13 @@ define([
 
         var breakpoint_list = new Array();
 
-        for (i = 0; i < br_list.length; i++) {
+        for (var i = 0; i < br_list.length; i++) {
           if (br_list[i].linenumber != -1) {
             breakpoint_list.push(br_list[i].linenumber)
           }
         }
 
-        for (i = 0;i< breakpoint_list.length;i++) {
+        for (var i = 0;i< breakpoint_list.length;i++) {
           var info = pgTools.DirectDebug.editor.lineInfo((breakpoint_list[i] - 1));
 
           if (info.gutterMarkers != undefined) {
@@ -101,8 +102,10 @@ define([
         var result = '';
 
         // Make ajax call to listen the database message
-        var baseUrl = "{{ url_for('debugger.index') }}" + "execute_query/" + trans_id + "/" + "get_breakpoints";
-
+        var baseUrl = url_for('debugger.execute_query', {
+                        'trans_id': trans_id,
+                        'query_type': 'get_breakpoints'
+                      });
         $.ajax({
           url: baseUrl,
           method: 'GET',
@@ -133,8 +136,11 @@ define([
       start_execution: function(trans_id, port_num) {
         var self = this;
         // Make ajax call to listen the database message
-        var baseUrl = "{{ url_for('debugger.index') }}" + "start_execution/" + trans_id + "/" + port_num;
-
+        var baseUrl = url_for(
+                        'debugger.start_execution', {
+                          'trans_id': trans_id,
+                          'port_num': port_num
+                      });
         $.ajax({
           url: baseUrl,
           method: 'GET',
@@ -163,8 +169,11 @@ define([
       execute_query: function(trans_id) {
         var self = this;
         // Make ajax call to listen the database message
-        var baseUrl = "{{ url_for('debugger.index') }}" + "execute_query/" + trans_id + "/" + "wait_for_breakpoint";
-
+        var baseUrl = url_for(
+                        'debugger.execute_query', {
+                          'trans_id': trans_id,
+                          'query_type': 'wait_for_breakpoint'
+                      });
         $.ajax({
           url: baseUrl,
           method: 'GET',
@@ -173,7 +182,7 @@ define([
               // set the return code to the code editor text area
               if (res.data.result[0].src != null && res.data.result[0].linenumber != null) {
                 pgTools.DirectDebug.editor.setValue(res.data.result[0].src);
-                active_line_no = self.active_line_no = (res.data.result[0].linenumber - 2);
+                var active_line_no = self.active_line_no = (res.data.result[0].linenumber - 2);
                 pgTools.DirectDebug.editor.addLineClass((res.data.result[0].linenumber - 2), 'wrap', 'CodeMirror-activeline-background');
               }
 
@@ -204,8 +213,11 @@ define([
         var self = this;
 
         // Make ajax call to listen the database message
-        var baseUrl = "{{ url_for('debugger.index') }}" + "execute_query/" + trans_id + "/" + "get_variables";
-
+        var baseUrl = url_for(
+                        'debugger.execute_query', {
+                          'trans_id': trans_id,
+                          'query_type': 'get_variables'
+                      });
         $.ajax({
           url: baseUrl,
           method: 'GET',
@@ -243,8 +255,11 @@ define([
         var self = this;
 
         // Make ajax call to listen the database message
-        var baseUrl = "{{ url_for('debugger.index') }}" + "execute_query/" + trans_id + "/" + "get_stack_info";
-
+        var baseUrl = url_for(
+                        'debugger.execute_query', {
+                          'trans_id': trans_id,
+                          'query_type': 'get_stack_info'
+                      });
         $.ajax({
           url: baseUrl,
           method: 'GET',
@@ -283,7 +298,7 @@ define([
       }
 
       // Make ajax call to listen the database message
-      var baseUrl = "{{ url_for('debugger.index') }}" + "poll_result/" + trans_id;
+      var baseUrl = url_for('debugger.poll_result', {'trans_id': trans_id});
 
       /*
         During the execution we should poll the result in minimum seconds but once the execution is completed
@@ -434,7 +449,7 @@ define([
       }
 
       // Make ajax call to listen the database message
-      var baseUrl = "{{ url_for('debugger.index') }}" + "poll_end_execution_result/" + trans_id;
+      var baseUrl = url_for('debugger.poll_end_execution_result', {'trans_id': trans_id});
 
       /*
         During the execution we should poll the result in minimum seconds but once the execution is completed
@@ -592,7 +607,7 @@ define([
     Restart: function(trans_id) {
 
       var self = this,
-        baseUrl = "{{ url_for('debugger.index') }}" + "restart/" + trans_id;
+        baseUrl = url_for('debugger.restart', {'trans_id': trans_id});
       self.enable('stop', false);
       self.enable('step_over', false);
       self.enable('step_into', false);
@@ -629,7 +644,7 @@ define([
           }
           else {
             // Debugging of void function is started again so we need to start the listener again
-            var baseUrl = "{{ url_for('debugger.index') }}" + "start_listener/" + trans_id;
+            var baseUrl = url_for('debugger.start_listener', {'trans_id': trans_id});
 
             $.ajax({
               url: baseUrl,
@@ -676,8 +691,10 @@ define([
       }
       else {
         // Make ajax call to listen the database message
-        var baseUrl = "{{ url_for('debugger.index') }}" + "execute_query/" + trans_id + "/" + "continue";
-
+        var baseUrl = url_for('debugger.execute_query', {
+                        'trans_id': trans_id,
+                        'query_type': 'continue'
+                      });
         $.ajax({
           url: baseUrl,
           method: 'GET',
@@ -712,8 +729,10 @@ define([
         self.enable('continue', false);
 
         // Make ajax call to listen the database message
-        var baseUrl = "{{ url_for('debugger.index') }}" + "execute_query/" + trans_id + "/" + "step_over";
-
+        var baseUrl = url_for('debugger.execute_query', {
+                        'trans_id': trans_id,
+                        'query_type': 'step_over'
+                      });
         $.ajax({
           url: baseUrl,
           method: 'GET',
@@ -747,8 +766,10 @@ define([
         self.enable('continue', false);
 
         // Make ajax call to listen the database message
-        var baseUrl = "{{ url_for('debugger.index') }}" + "execute_query/" + trans_id + "/" + "step_into";
-
+        var baseUrl = url_for('debugger.execute_query', {
+                        'trans_id': trans_id,
+                        'query_type': 'step_into'
+                      });
         $.ajax({
           url: baseUrl,
           method: 'GET',
@@ -782,8 +803,11 @@ define([
         self.enable('continue', false);
 
         // Make ajax call to listen the database message
-        var baseUrl = "{{ url_for('debugger.index') }}" + "execute_query/" + trans_id + "/" + "abort_target";
-
+        var baseUrl = url_for(
+                        'debugger.execute_query', {
+                          'trans_id': trans_id,
+                          'query_type': 'abort_target'
+                      });
         $.ajax({
           url: baseUrl,
           method: 'GET',
@@ -838,10 +862,18 @@ define([
         // If gutterMarker is undefined that means there is no marker defined previously
         // So we need to set the breakpoint command here...
         if (info.gutterMarkers == undefined) {
-            baseUrl = "{{ url_for('debugger.index') }}" + "set_breakpoint/" + trans_id + "/" + (self.active_line_no + 1) + "/" + "1";
+            baseUrl = url_for('debugger.set_breakpoint', {
+                        'trans_id': trans_id,
+                        'line_no': self.active_line_no + 1,
+                        'set_type': '1'
+                      });
         }
         else {
-            baseUrl = "{{ url_for('debugger.index') }}" + "set_breakpoint/" + trans_id + "/" + (self.active_line_no + 1) + "/" + "0";
+            baseUrl = url_for('debugger.set_breakpoint', {
+                        'trans_id': trans_id,
+                        'line_no': self.active_line_no + 1,
+                        'set_type': '0'
+                      });
         }
 
         $.ajax({
@@ -903,14 +935,14 @@ define([
 
         var breakpoint_list = new Array();
 
-        for (i = 0; i < br_list.length; i++) {
+        for (var i = 0; i < br_list.length; i++) {
           if (br_list[i].linenumber != -1) {
             breakpoint_list.push(br_list[i].linenumber)
           }
         }
 
         // Make ajax call to listen the database message
-        var baseUrl = "{{ url_for('debugger.index') }}" + "clear_all_breakpoint/" + trans_id;
+        var baseUrl = url_for('debugger.clear_all_breakpoint', {'trans_id': trans_id});
 
         $.ajax({
           url: baseUrl,
@@ -918,7 +950,7 @@ define([
           data: { 'breakpoint_list': breakpoint_list.join() },
           success: function(res) {
             if (res.data.status) {
-              for (i = 0;i< breakpoint_list.length;i++) {
+              for (var i = 0; i < breakpoint_list.length; i++) {
                 var info = pgTools.DirectDebug.editor.lineInfo((breakpoint_list[i] - 1));
 
                 if (info) {
@@ -966,7 +998,7 @@ define([
           model: DebuggerStackModel
         });
 
-        stackGridCols = [
+        var stackGridCols = [
           {name: 'name', label:'Name', type:'text', editable: false, cell:'string'},
           {name: 'value', label:'Value', type:'text', editable: false, cell:'string'},
           {name: 'line_no', label:'Line No.', type:'text', editable: false, cell:'string'}
@@ -975,7 +1007,7 @@ define([
         var my_obj = [];
         if (result.length != 0)
         {
-          for (i = 0; i < result.length; i++) {
+          for (var i = 0; i < result.length; i++) {
             my_obj.push({ "name": result[i].targetname, "value": result[i].args, "line_no": result[i].linenumber });
           }
         }
@@ -994,7 +1026,7 @@ define([
             },
             rowClick: function(e) {
               //Find which row is selected and depending on that send the frame id
-              for (i = 0; i < this.model.collection.length; i++) {
+              for (var i = 0; i < this.model.collection.length; i++) {
                 if (this.model.collection.models[i].get('name') == this.model.get('name')) {
                   self.frame_id_ = i;
                   break;
@@ -1085,7 +1117,7 @@ define([
           model: DebuggerVariablesModel
         });
 
-        gridCols = [
+        var gridCols = [
           {name: 'name', label:'Name', type:'text', editable: false, cell:'string'},
           {name: 'type', label:'Type', type: 'text', editable: false, cell:'string'},
           {name: 'value', label:'Value', type: 'text', cell: 'string'}
@@ -1094,7 +1126,7 @@ define([
         var my_obj = [];
         if (result.length != 0)
         {
-          for (i = 0; i < result.length; i++) {
+          for (var i = 0; i < result.length; i++) {
             if (result[i].varclass == 'L') {
               my_obj.push({ "name": result[i].name, "type": result[i].dtype, "value": result[i].value});
             }
@@ -1139,7 +1171,7 @@ define([
 
         self.ParametersCollection.prototype.on('change', self.deposit_parameter_value, self);
 
-        paramGridCols = [
+        var paramGridCols = [
           {name: 'name', label:'Name', type:'text', editable: false, cell:'string'},
           {name: 'type', label:'Type', type: 'text', editable: false, cell:'string'},
           {name: 'value', label:'Value', type: 'text', cell: 'string'}
@@ -1148,7 +1180,7 @@ define([
         var param_obj = [];
         if (result.length != 0)
         {
-          for (i = 0; i < result.length; i++) {
+          for (var i = 0; i < result.length; i++) {
             if (result[i].varclass == 'A') {
               param_obj.push({ "name": result[i].name, "type": result[i].dtype, "value": result[i].value});
             }
@@ -1177,8 +1209,9 @@ define([
         name_value_list.push({ 'name': model.get('name'),'type': model.get('type'), 'value': model.get('value')});
 
         // Make ajax call to listen the database message
-        var baseUrl = "{{ url_for('debugger.index') }}" + "deposit_value/" + pgTools.DirectDebug.trans_id;
-
+        var baseUrl = url_for('debugger.deposit_value', {
+                        'trans_id': pgTools.DirectDebug.trans_id
+                      });
         $.ajax({
           url: baseUrl,
           method: 'POST',
@@ -1209,8 +1242,10 @@ define([
         var self = this;
 
         // Make ajax call to listen the database message
-        var baseUrl = "{{ url_for('debugger.index') }}" + "select_frame/" + pgTools.DirectDebug.trans_id + "/" + self.frame_id_;
-
+        var baseUrl = url_for('debugger.select_frame', {
+                        'trans_id': pgTools.DirectDebug.trans_id,
+                        'frame_id': self.frame_id_
+                      });
         $.ajax({
           url: baseUrl,
           method: 'GET',
@@ -1376,7 +1411,7 @@ define([
           '#container', {
           allowContextMenu: false,
           allowCollapse: false,
-          themePath: '{{ url_for("static", filename="css") }}',
+          themePath: url_for('static', {'filename': 'css'}),
           theme: 'webcabin.overrides.css'
         });
 
@@ -1386,7 +1421,7 @@ define([
       // indirect debugging - 0  and for direct debugging - 1
       if (trans_id != undefined && !debug_type) {
         // Make ajax call to execute the and start the target for execution
-        var baseUrl = "{{ url_for('debugger.index') }}" + "start_listener/" + trans_id;
+        var baseUrl = url_for('debugger.start_listener', {'trans_id': trans_id });
 
         $.ajax({
           url: baseUrl,
@@ -1408,7 +1443,7 @@ define([
       else if (trans_id != undefined && debug_type)
       {
         // Make ajax call to execute the and start the target for execution
-        var baseUrl = "{{ url_for('debugger.index') }}" + "start_listener/" + trans_id;
+        var baseUrl = url_for('debugger.start_listener', {'trans_id': trans_id });
 
         $.ajax({
           url: baseUrl,
@@ -1434,7 +1469,7 @@ define([
     messages: function(trans_id) {
       var self = this;
       // Make ajax call to listen the database message
-      var baseUrl = "{{ url_for('debugger.index') }}" + "messages/" + trans_id;
+      var baseUrl = url_for('debugger.messages', {'trans_id': trans_id });
 
       $.ajax({
         url: baseUrl,
@@ -1658,6 +1693,7 @@ define([
   });
 
   pgTools.DirectDebug = new DirectDebug();
+  pgTools.DirectDebug['jquery'] = $;
 
   return pgTools.DirectDebug;
 });
diff --git a/web/pgadmin/tools/grant_wizard/templates/grant_wizard/js/grant_wizard.js b/web/pgadmin/tools/grant_wizard/templates/grant_wizard/js/grant_wizard.js
index ebba51b2..ee618b32 100644
--- a/web/pgadmin/tools/grant_wizard/templates/grant_wizard/js/grant_wizard.js
+++ b/web/pgadmin/tools/grant_wizard/templates/grant_wizard/js/grant_wizard.js
@@ -493,7 +493,7 @@ define([
                 }
 
                 coll.sort();
-                dbObjectFilter = this.dbObjectFilter = this.DbObjectFilter(coll);
+                var dbObjectFilter = this.dbObjectFilter = this.DbObjectFilter(coll);
 
                 /**
                   privArray holds objects selected which further helps
diff --git a/web/pgadmin/tools/import_export/templates/import_export/js/import_export.js b/web/pgadmin/tools/import_export/templates/import_export/js/import_export.js
index 7d3ef3fd..429b5ed7 100644
--- a/web/pgadmin/tools/import_export/templates/import_export/js/import_export.js
+++ b/web/pgadmin/tools/import_export/templates/import_export/js/import_export.js
@@ -81,7 +81,7 @@ define([
             if (_.isFunction(options)) {
               try {
                 var all_cols = options.apply(self);
-                for(idx in all_cols) {
+                for(var idx in all_cols) {
                   op_vals.push((all_cols[idx])['value']);
                 }
               } catch(e) {
@@ -276,7 +276,7 @@ define([
          Enable/disable import menu in tools based on node selected
          Import menu will be enabled only when user select table node.
         */
-        menu_enabled = function(itemData, item, data) {
+        var menu_enabled = function(itemData, item, data) {
          var t = pgBrowser.tree, i = item, d = itemData;
          var parent_item = t.hasParent(i) ? t.parent(i): null,
              parent_data = parent_item ? t.itemData(parent_item) : null;
diff --git a/web/pgadmin/tools/maintenance/templates/maintenance/js/maintenance.js b/web/pgadmin/tools/maintenance/templates/maintenance/js/maintenance.js
index 0e51fd9a..9b5dc29a 100644
--- a/web/pgadmin/tools/maintenance/templates/maintenance/js/maintenance.js
+++ b/web/pgadmin/tools/maintenance/templates/maintenance/js/maintenance.js
@@ -86,18 +86,18 @@ define([
       {
         type: 'nested', control: 'fieldset', label: gettext('Vacuum'), group: gettext('Options'),
         schema:[{
-          id: 'vacuum_full', disabled: false, group: gettext('Vacuum'), disabled: 'isDisabled',
+          id: 'vacuum_full', group: gettext('Vacuum'), disabled: 'isDisabled',
           control: Backform.CustomSwitchControl, label: gettext('FULL'), deps: ['op']
         },{
-          id: 'vacuum_freeze', disabled: false, deps: ['op'], disabled: 'isDisabled',
+          id: 'vacuum_freeze', deps: ['op'], disabled: 'isDisabled',
           control: Backform.CustomSwitchControl, label: gettext('FREEZE'), group: gettext('Vacuum')
         },{
-          id: 'vacuum_analyze', disabled: false, deps: ['op'], disabled: 'isDisabled',
+          id: 'vacuum_analyze', deps: ['op'], disabled: 'isDisabled',
           control: Backform.CustomSwitchControl, label: gettext('ANALYZE'), group: gettext('Vacuum')
         }]
       },
       {
-        id: 'verbose', disabled: false, group: gettext('Options'), deps: ['op'],
+        id: 'verbose', group: gettext('Options'), deps: ['op'],
         control: Backform.CustomSwitchControl, label: gettext('Verbose Messages'), disabled: 'isDisabled'
       }
     ],
@@ -157,7 +157,7 @@ define([
          Enable/disable Maintenance menu in tools based on node selected.
          Maintenance menu will be enabled only when user select table and database node.
         */
-        menu_enabled = function(itemData, item, data) {
+        var menu_enabled = function(itemData, item, data) {
          var t = pgBrowser.tree, i = item, d = itemData;
          var parent_item = t.hasParent(i) ? t.parent(i): null,
              parent_data = parent_item ? t.itemData(parent_item) : null;
diff --git a/web/pgadmin/tools/restore/templates/restore/js/restore.js b/web/pgadmin/tools/restore/templates/restore/js/restore.js
index 0da0004d..bacfcd3f 100644
--- a/web/pgadmin/tools/restore/templates/restore/js/restore.js
+++ b/web/pgadmin/tools/restore/templates/restore/js/restore.js
@@ -1,5 +1,5 @@
 // Restore dialog
-define([
+define('tools.restore', [
   'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
   'underscore.string', 'alertify', 'pgadmin.browser', 'backbone', 'backgrid',
   'backform', 'pgadmin.browser.node',
@@ -239,7 +239,7 @@ define([
           menu will be enabled otherwise disabled.
           Also, hide it for system view in catalogs
         */
-        menu_enabled = function(itemData, item, data) {
+        var menu_enabled = function(itemData, item, data) {
           var t = pgBrowser.tree, i = item, d = itemData;
           var parent_item = t.hasParent(i) ? t.parent(i): null,
               parent_data = parent_item ? t.itemData(parent_item) : null;
@@ -260,7 +260,7 @@ define([
               return false;
         };
 
-        is_parent_catalog = function(itemData, item, data) {
+        var is_parent_catalog = function(itemData, item, data) {
           var t = pgBrowser.tree, i = item, d = itemData;
           // To iterate over tree to check parent node
           while (i) {
@@ -342,7 +342,7 @@ define([
           return;
         }
 
-        var title = S('{{ 'Restore (%s: %s)' }}'),
+        var title = S(gettext('Restore (%s: %s)')),
             tree = pgBrowser.tree,
             item = treeItem || tree.selected(),
             data = item && item.length == 1 && tree.itemData(item),
diff --git a/web/pgadmin/tools/sqleditor/__init__.py b/web/pgadmin/tools/sqleditor/__init__.py
index d34836c4..a11d22b6 100644
--- a/web/pgadmin/tools/sqleditor/__init__.py
+++ b/web/pgadmin/tools/sqleditor/__init__.py
@@ -25,7 +25,7 @@ from pgadmin.utils.ajax import make_json_response, bad_request, \
 from pgadmin.utils.driver import get_driver
 from pgadmin.utils.sqlautocomplete.autocomplete import SQLAutoComplete
 from pgadmin.misc.file_manager import Filemanager
-
+from pgadmin.utils.menu import MenuItem
 
 from config import PG_DEFAULT_DRIVER, ON_DEMAND_RECORD_COUNT
 
@@ -61,7 +61,14 @@ class SqlEditorModule(PgAdminModule):
     LABEL = gettext("SQL Editor")
 
     def get_own_menuitems(self):
-        return {}
+        return {'tools': [
+            MenuItem(name='mnu_query_tool',
+                     label=gettext('Query tool'),
+                     priority=100,
+                     callback='show_query_tool',
+                     icon='fa fa-question',
+                     url=url_for('help.static', filename='index.html'))
+        ]}
 
     def get_own_javascripts(self):
         return [{
@@ -70,6 +77,7 @@ class SqlEditorModule(PgAdminModule):
             'when': None
         }]
 
+
     def get_panels(self):
         return []
 
diff --git a/web/pgadmin/tools/sqleditor/static/css/sqleditor.css b/web/pgadmin/tools/sqleditor/static/css/sqleditor.css
index a9c2e168..7b7e5615 100644
--- a/web/pgadmin/tools/sqleditor/static/css/sqleditor.css
+++ b/web/pgadmin/tools/sqleditor/static/css/sqleditor.css
@@ -497,7 +497,6 @@ input.editor-checkbox:focus {
   bottom: 4px;
   right: 0;
 }
-}
 
 .slick-cell, .slick-headerrow-column {
   border-right: 1px solid #ccc;
diff --git a/web/pgadmin/tools/sqleditor/templates/sqleditor/js/sqleditor.js b/web/pgadmin/tools/sqleditor/templates/sqleditor/js/sqleditor.js
index 8a797ab8..7a36a679 100644
--- a/web/pgadmin/tools/sqleditor/templates/sqleditor/js/sqleditor.js
+++ b/web/pgadmin/tools/sqleditor/templates/sqleditor/js/sqleditor.js
@@ -1,6 +1,6 @@
-define([
+define('tools.querytool', [
     'sources/gettext','sources/url_for', 'jquery', 'underscore', 'underscore.string', 'alertify',
-    'pgadmin', 'backbone', 'backgrid', 'codemirror', 'pgadmin.misc.explain',
+    'pgadmin', 'backbone', 'sources/../bundle/codemirror', 'pgadmin.misc.explain',
     'sources/selection/grid_selector',
     'sources/selection/active_cell_capture',
     'sources/selection/clipboard',
@@ -10,36 +10,25 @@ define([
     'sources/selection/xcell_selection_model',
     'sources/selection/set_staged_rows',
     'sources/sqleditor_utils',
+    'sources/history/index.js',
+    'sources/../jsx/history/query_history',
+    'react', 'react-dom',
     'sources/alerts/alertify_wrapper',
-
-    'sources/generated/history',
-    'sources/generated/reactComponents',
-
-    'slickgrid', 'bootstrap', 'pgadmin.browser', 'wcdocker',
-    'codemirror/mode/sql/sql', 'codemirror/addon/selection/mark-selection',
-    'codemirror/addon/selection/active-line', 'codemirror/addon/fold/foldcode',
-    'codemirror/addon/fold/foldgutter', 'codemirror/addon/hint/show-hint',
-    'codemirror/addon/hint/sql-hint', 'pgadmin.file_manager',
-    'pgadmin-sqlfoldcode',
-    'codemirror/addon/scroll/simplescrollbars',
-    'codemirror/addon/dialog/dialog',
-    'codemirror/addon/search/search',
-    'codemirror/addon/search/searchcursor',
-    'codemirror/addon/search/jump-to-line',
-    'codemirror/addon/edit/matchbrackets',
-    'codemirror/addon/edit/closebrackets',
-
+    'sources/../bundle/slickgrid',
+    'misc.file_manager',
     'backgrid.sizeable.columns',
     'slick.pgadmin.formatters',
     'slick.pgadmin.editors',
+    'pgadmin.browser'
 ], function(
-  gettext, url_for, $, _, S, alertify, pgAdmin, Backbone, Backgrid, CodeMirror,
+  gettext, url_for, $, _, S, alertify, pgAdmin, Backbone, codemirror,
   pgExplain, GridSelector, ActiveCellCapture, clipboard, copyData, RangeSelectionHelper, handleQueryOutputKeyboardEvent,
-    XCellSelectionModel, setStagedRows,  SqlEditorUtils, AlertifyWrapper, HistoryBundle, reactComponents
+    XCellSelectionModel, setStagedRows,  SqlEditorUtils, HistoryBundle, queryHistory, React, ReactDOM, AlertifyWrapper
 ) {
     /* Return back, this has been called more than once */
     if (pgAdmin.SqlEditor)
       return pgAdmin.SqlEditor;
+    var CodeMirror = codemirror.default;
 
     // Some scripts do export their object in the window only.
     // Generally the one, which do no have AMD support.
@@ -1013,9 +1002,9 @@ define([
 
         self.history_collection = new HistoryBundle.HistoryCollection([]);
 
-        var queryHistoryElement = reactComponents.React.createElement(
-          reactComponents.QueryHistory, {historyCollection: self.history_collection});
-        reactComponents.render(queryHistoryElement, $('#history_grid')[0]);
+        var queryHistoryElement = React.createElement(
+          queryHistory.QueryHistory, {historyCollection: self.history_collection});
+        ReactDOM.render(queryHistoryElement, $('#history_grid')[0]);
       },
 
       // Callback function for Add New Row button click.
@@ -1990,7 +1979,9 @@ define([
             // To show column label and data type in multiline,
             // The elements should be put inside the div.
             // Create column label and type.
-            var col_type = column_label = '';
+            var col_type = '',
+              column_label = '',
+              col_cell;
             var type = pg_types[c.type_code] ?
                          pg_types[c.type_code][0] :
                          // This is the case where user might
@@ -2290,7 +2281,7 @@ define([
             );
 
             // Add the columns to the data so the server can remap the data
-            req_data = self.data_store
+            var req_data = self.data_store;
             req_data.columns = view ? view.handler.columns : self.columns;
 
             // Make ajax call to save the data
@@ -2327,7 +2318,7 @@ define([
                       } else {
                         dataView.beginUpdate();
                         for (var i = 0; i < rows.length; i++) {
-                          item = grid.getDataItem(rows[i]);
+                          var item = grid.getDataItem(rows[i]);
                           data.push(item);
                           dataView.deleteItem(item[self.client_primary_key]);
                         }
@@ -2376,7 +2367,7 @@ define([
                     if(_row_index in self.data_store.added_index) {
                       // Remove new row index from temp_list if save operation
                       // fails
-                      var index = self.handler.temp_new_rows.indexOf(_rowid);
+                      var index = self.handler.temp_new_rows.indexOf(res.data._rowid);
                       if (index > -1) {
                          self.handler.temp_new_rows.splice(index, 1);
                       }
@@ -2571,11 +2562,11 @@ define([
 
         // read data from codemirror and write to file
         _save_file_handler: function(e) {
-          var self = this;
-          data = {
-            'file_name': decodeURI(e),
-            'file_content': self.gridView.query_tool_obj.getValue()
-          }
+          var self = this,
+            data = {
+              'file_name': decodeURI(e),
+              'file_content': self.gridView.query_tool_obj.getValue()
+            };
           self.trigger(
             'pgadmin-sqleditor:loading-icon:show',
             gettext("Saving the queries in the file...")
@@ -2939,7 +2930,7 @@ define([
 
         // This function will apply the filter.
         _apply_filter: function() {
-          var self = this;
+          var self = this,
               sql = self.gridView.filter_obj.getValue();
 
           self.trigger(
@@ -3066,7 +3057,7 @@ define([
 
         // This function will set the limit for SQL query
         _set_limit: function() {
-          var self = this;
+          var self = this,
               limit = parseInt($(".limit").val());
 
           self.trigger(
@@ -3384,7 +3375,7 @@ define([
         },
 
         _auto_rollback: function() {
-          var self = this;
+          var self = this,
               auto_rollback = true;
 
           if ($('.auto-rollback').hasClass('visibility-hidden') === true)
@@ -3732,7 +3723,9 @@ define([
       // This function is used to create and return the object of grid controller.
       create: function(container) {
         return new SqlEditorController(container);
-      }
+      },
+      jquery: $,
+      S: S
     };
 
     return pgAdmin.SqlEditor;
diff --git a/web/pgadmin/tools/templates/js/translations.js b/web/pgadmin/tools/templates/js/translations.js
index 2847224c..71b53db4 100644
--- a/web/pgadmin/tools/templates/js/translations.js
+++ b/web/pgadmin/tools/templates/js/translations.js
@@ -1,4 +1,4 @@
 define(function () {
   var translations = {{ translations|tojson }};
-  return translations;
+  return [];
 });
\ No newline at end of file
diff --git a/web/pgadmin/tools/user_management/templates/user_management/js/user_management.js b/web/pgadmin/tools/user_management/templates/user_management/js/user_management.js
index 5a249e87..3fe41a5a 100644
--- a/web/pgadmin/tools/user_management/templates/user_management/js/user_management.js
+++ b/web/pgadmin/tools/user_management/templates/user_management/js/user_management.js
@@ -1,11 +1,11 @@
-// Backup dialog
 define([
   'sources/gettext', 'sources/url_for', 'jquery', 'underscore', 'underscore.string', 'alertify',
   'pgadmin.browser', 'backbone', 'backgrid', 'backform', 'pgadmin.browser.node',
-  'sources/alerts/alertify_wrapper',
+  'sources/alerts/alertify_wrapper', 'pgadmin.user_management.current_user',
   'backgrid.select.all', 'backgrid.filter'
 ], function(
-  gettext, url_for, $, _, S, alertify, pgBrowser, Backbone, Backgrid, Backform, pgNode, AlertifyWrapper
+  gettext, url_for, $, _, S, alertify, pgBrowser, Backbone, Backgrid, Backform,
+  pgNode, AlertifyWrapper, userInfo
 ) {
 
     // if module is already initialized, refer to that.
@@ -36,11 +36,10 @@ define([
         this.initialized = true;
 
         return this;
-      }
-      {% if is_admin %},
-
+      },
       // Callback to draw User Management Dialog.
       show_users: function(action, item, params) {
+        if (!userInfo['is_admin']) return;
         var Roles = [];
 
         var UserModel = pgAdmin.Browser.Node.Model.extend({
@@ -97,7 +96,7 @@ define([
                 if(m instanceof Backbone.Collection) {
                   return true;
                 }
-                if (m.get("id") == {{user_id}}){
+                if (m.get("id") == userInfo['user_id']){
                     return false;
                 } else {
                     return true;
@@ -111,7 +110,7 @@ define([
                 if(m instanceof Backbone.Collection) {
                   return true;
                 }
-                if (m.get("id") == {{user_id}}){
+                if (m.get("id") == userInfo['user_id']){
                     return false;
                 } else {
                     return true;
@@ -284,7 +283,7 @@ define([
               self = this;
               e.preventDefault();
 
-              if (self.model.get("id") == {{user_id}}) {
+              if (self.model.get("id") == userInfo['user_id']) {
                 alertify.alert(
                   gettext('Cannot delete user.'),
                   gettext('Cannot delete currently logged in user.'),
@@ -468,7 +467,7 @@ define([
                       }
                     },
                     saveUser: function(m) {
-                      d = m.toJSON(true);
+                      var d = m.toJSON(true);
 
                       if(m.isNew() && (!m.get('email') || !m.get('role') ||
                           !m.get('newPassword') || !m.get('confirmPassword') ||
@@ -636,7 +635,7 @@ define([
        });
       }
         alertify.UserManagement(true).resizeTo('680px','400px');
-     }{% endif %}
+     }
 
     };
     return pgBrowser.UserManagement;
diff --git a/web/regression/feature_utils/pgadmin_page.py b/web/regression/feature_utils/pgadmin_page.py
index 89072436..21e45a65 100644
--- a/web/regression/feature_utils/pgadmin_page.py
+++ b/web/regression/feature_utils/pgadmin_page.py
@@ -194,6 +194,7 @@ class PgadminPage:
             except (NoSuchElementException, WebDriverException):
                 return False
 
+        time.sleep(1)
         WebDriverWait(self.driver, timeout=self.timeout, poll_frequency=0.01).\
             until(find_codemirror, "Timed out waiting for codemirror to appear").\
             click()
diff --git a/web/webpack.config.js b/web/webpack.config.js
index 49f0c4e7..44a5d7bd 100644
--- a/web/webpack.config.js
+++ b/web/webpack.config.js
@@ -1,27 +1,109 @@
 /* eslint-env node */
-
+const path = require('path');
+const webpack = require('webpack');
+const webpackShimConfig = require('./webpack.shim');
+const PRODUCTION = process.env.NODE_ENV === 'production';
+const envType = PRODUCTION ? 'prod': 'dev';
+const OptimizeCssAssetsPlugin = require('optimize-css-assets-webpack-plugin');
+const sourceDir = __dirname + '/pgadmin/static';
 const ExtractTextPlugin = require('extract-text-webpack-plugin');
+const extractLib = new ExtractTextPlugin('style.css');
+const extractSass = new ExtractTextPlugin('pgadmin.css');
+const HardSourceWebpackPlugin = require('hard-source-webpack-plugin');
+
+const vendorChunks = new webpack.optimize.CommonsChunkPlugin({
+  name: 'vendor',
+  chunks: ['app.bundle', 'sqleditor', 'codemirror', 'debugger_direct'],
+  filename: 'vendor.js',
+  minChunks: function(module) {
+    return webpackShimConfig.isExternal(module);
+  },
+});
+
+const pgAdminCommonChunks = new webpack.optimize.CommonsChunkPlugin({
+  name: 'pgadmin_commons',
+  chunks: ['app.bundle', 'sqleditor', 'codemirror', 'debugger_direct'],
+  filename: 'pgadmin_commons.js',
+  minChunks: function(module) {
+    return webpackShimConfig.isPgAdminLib(module);
+  },
+});
+
+const providePlugin = new webpack.ProvidePlugin({
+  $: 'jquery',
+  jQuery: 'jquery',
+  'window.jQuery': 'jquery',
+  _: 'underscore',
+  S: 'underscore.string',
+  Backbone: 'backbone',
+  Backgrid: 'backgrid',
+  pgAdmin: 'pgadmin',
+});
+
+const uglifyPlugin = new webpack.optimize.UglifyJsPlugin({
+  output: {comments: false},
+  compress: {
+    warnings: false,
+    unused: true,
+    dead_code: true,
+    drop_console: true,
+  },
+});
 
-const extractSass = new ExtractTextPlugin({
-  filename: '[name].css',
-  disable: process.env.NODE_ENV === 'development',
+const optimizeAssetsPlugin = new OptimizeCssAssetsPlugin({
+  assetNameRegExp: /\.css$/g,
+  cssProcessor: require('cssnano'),
+  cssProcessorOptions: { discardComments: {removeAll: true } },
+  canPrint: true,
+});
+
+const definePlugin = new webpack.DefinePlugin({
+  'process.env': {
+    'NODE_ENV': JSON.stringify('production'),
+  },
+});
+
+const hardSourceWebpackPlugin = new HardSourceWebpackPlugin({
+  cacheDirectory: './.cache/hard-source/' + envType +'/[confighash]',
+  recordsPath: './.cache/hard-source/' + envType +'/[confighash]/records.json',
+  configHash: require('node-object-hash')({sort: false}).hash,
+  environmentHash: {
+    root: process.cwd(),
+    directories: ['node_modules'],
+    files: ['package.json'],
+  },
 });
 
 module.exports = {
-  context: __dirname + '/pgadmin/static',
+  stats: { children: false },
+  context: __dirname,
   entry: {
-    reactComponents: './bundle/components.js',
-    history: './js/history/index.js',
-    slickgrid: './bundle/slickgrid.js',
-    pgadmincss: './scss/pgadmin.scss',
+    'app.bundle': sourceDir + '/bundle/app.js',
+    //reactComponents: sourceDir + '/bundle/reactJS.js',
+    codemirror: sourceDir + '/bundle/codemirror.js',
+    sqleditor: './pgadmin/tools/sqleditor/templates/sqleditor/js/sqleditor.js',
+    debugger_direct: './pgadmin/tools/debugger/templates/debugger/js/direct.js',
+    file_utils: './pgadmin/misc/file_manager/templates/file_manager/js/utility.js',
+    pgadmin_css: './pgadmin/static/scss/pgadmin.scss',
+    lib_css: './pgadmin/static/css/lib.css',
   },
   output: {
     libraryTarget: 'amd',
     path: __dirname + '/pgadmin/static/js/generated',
     filename: '[name].js',
+    libraryExport: 'default',
+  },
+  /*Templates files to be loaded dynamically*/
+  externals: {
+    'pgadmin.browser.messages': 'pgadmin.browser.messages',
+    'pgadmin.browser.utils': 'pgadmin.browser.utils',
+    'pgadmin.browser.endpoints': 'pgadmin.browser.endpoints',
+    'pgadmin.server.supported_servers': 'pgadmin.server.supported_servers',
+    'pgadmin.user_management.current_user': 'pgadmin.user_management.current_user',
+    'pgadmin.node.unique_key': 'pgadmin.node.unique_key',
+    'translations': 'translations',
   },
 
-  plugins: [extractSass],
   module: {
     rules: [{
       test: /\.jsx?$/,
@@ -33,8 +115,120 @@ module.exports = {
         },
       },
     }, {
-      test: /\.css$/,
-      use: ['style-loader', 'raw-loader'],
+      test: /\.js/,
+      loader: 'shim-loader',
+      query: webpackShimConfig,
+      include: path.join(__dirname, '/pgadmin/browser'),
+    }, {
+      test: require.resolve('./pgadmin/tools/datagrid/templates/datagrid/js/datagrid'),
+      use: {
+        loader: 'imports-loader?' +
+        'pgadmin.dashboard' +
+        ',pgadmin.tools.user_management' +
+        ',misc.statistics' +
+        ',misc.depends' +
+        ',misc.sql' +
+        ',misc.bgprocess' +
+        ',pgadmin.node.server_group' +
+        ',pgadmin.node.server' +
+        ',pgadmin.node.database' +
+        ',pgadmin.node.role' +
+        ',pgadmin.node.cast' +
+        ',pgadmin.node.tablespace' +
+        ',pgadmin.node.resource_group' +
+        ',pgadmin.node.event_trigger' +
+        ',pgadmin.node.extension' +
+        ',pgadmin.node.language' +
+        ',pgadmin.node.foreign_data_wrapper' +
+        ',pgadmin.node.schema' +
+        ',pgadmin.node.catalog' +
+        ',pgadmin.node.catalog_object' +
+        ',pgadmin.node.collation' +
+        ',pgadmin.node.domain' +
+        ',pgadmin.node.domain_constraints' +
+        ',pgadmin.node.foreign_table' +
+        ',pgadmin.node.fts_configuration' +
+        ',pgadmin.node.fts_dictionary' +
+        ',pgadmin.node.fts_parser' +
+        ',pgadmin.node.fts_template' +
+        ',pgadmin.node.function' +
+        ',pgadmin.node.procedure' +
+        ',pgadmin.node.edbfunc' +
+        ',pgadmin.node.edbproc' +
+        ',pgadmin.node.edbvar' +
+        ',pgadmin.node.edbvar' +
+        ',pgadmin.node.trigger_function' +
+        ',pgadmin.node.package' +
+        ',pgadmin.node.sequence' +
+        ',pgadmin.node.synonym' +
+        ',pgadmin.node.type' +
+        ',pgadmin.node.rule' +
+        ',pgadmin.node.index' +
+        ',pgadmin.node.trigger' +
+        ',pgadmin.node.catalog_object_column' +
+        ',pgadmin.node.view' +
+        ',pgadmin.node.mview' +
+        ',pgadmin.node.table',
+      },
+    }, {
+      test: require.resolve('./node_modules/acitree/js/jquery.aciTree.min'),
+      use: {
+        loader: 'imports-loader?this=>window',
+      },
+    }, {
+      test: require.resolve('./node_modules/acitree/js/jquery.aciPlugin.min'),
+      use: {
+        loader: 'imports-loader?this=>window',
+      },
+    }, {
+      test: require.resolve('./pgadmin/static/bundle/browser'),
+      use: {
+        loader: 'imports-loader?' +
+        'pgadmin.about' +
+        ',pgadmin.preferences' +
+        ',misc.file_manager' +
+        ',pgadmin.settings' +
+        ',tools.backup' +
+        ',tools.restore' +
+        ',tools.grant_wizard' +
+        ',tools.maintenance' +
+        ',tools.import_export' +
+        ',tools.debugger' +
+        ',tools.direct',
+      },
+    }, {
+      test: require.resolve('snapsvg'),
+      use: {
+        loader: 'imports-loader?this=>window,fix=>module.exports=0',
+      },
+    }, {
+      test: /\.(jpe?g|png|gif|svg)$/i,
+      loaders: [
+        'file-loader?hash=sha512&digest=hex&name=img/[name].[ext]', {
+          loader: 'image-webpack-loader',
+          query: {
+            bypassOnDebug: true,
+            mozjpeg: {
+              progressive: true,
+            },
+            gifsicle: {
+              interlaced: false,
+            },
+            optipng: {
+              optimizationLevel: 7,
+            },
+            pngquant: {
+              quality: '75-90',
+              speed: 3,
+            },
+          },
+        },
+      ],
+      exclude: /vendor/,
+    }, {
+      test: /\.(eot|svg|ttf|woff|woff2)$/,
+      loader: 'file-loader?name=fonts/[name].[ext]',
+      exclude: /vendor/,
     }, {
       test: /\.scss$/,
       use: extractSass.extract({
@@ -42,12 +236,43 @@ module.exports = {
           loader: 'css-loader',
         }, {
           loader: 'sass-loader', // compiles Sass to CSS
+          options: {
+            includePaths: ['./pgadmin/static/scss/'],
+          },
+        }],
+      }),
+    }, {
+      test: /\.css$/,
+      use: extractLib.extract({
+        use: [{
+          loader: 'css-loader',
         }],
       }),
     }],
+    noParse: [/moment.js/],
   },
-
   resolve: {
+    alias: webpackShimConfig.resolveAlias,
+    modules: ['node_modules', '.'],
     extensions: ['.js', '.jsx'],
+    unsafeCache: true,
   },
-};
\ No newline at end of file
+  plugins: PRODUCTION ? [
+    extractSass,
+    extractLib,
+    vendorChunks,
+    pgAdminCommonChunks,
+    providePlugin,
+    uglifyPlugin,
+    optimizeAssetsPlugin,
+    definePlugin,
+    hardSourceWebpackPlugin,
+  ]: [
+    extractSass,
+    extractLib,
+    vendorChunks,
+    pgAdminCommonChunks,
+    providePlugin,
+    hardSourceWebpackPlugin,
+  ],
+};
diff --git a/web/webpack.debug.config.js b/web/webpack.debug.config.js
new file mode 100644
index 00000000..96f4e730
--- /dev/null
+++ b/web/webpack.debug.config.js
@@ -0,0 +1,17 @@
+const baseConfig = require('./webpack.config.js');
+const RawSource = require('webpack-sources').RawSource;
+
+baseConfig.plugins.push(function() {
+  this.plugin('emit', (compilation, callback) => {
+    compilation.chunks.forEach((chunk) => {
+      chunk.files.filter((filename) => /\.js$/.test(filename)).forEach((filename) => {
+        var source = compilation.assets[filename].source();
+
+        compilation.assets[filename] = new RawSource(source.replace(/__WEBPACK_IMPORTED_MODULE_/g, '__'));
+      });
+    });
+    callback();
+  });
+});
+
+module.exports = baseConfig;
diff --git a/web/webpack.shim.js b/web/webpack.shim.js
new file mode 100644
index 00000000..45a89e1e
--- /dev/null
+++ b/web/webpack.shim.js
@@ -0,0 +1,282 @@
+/* eslint-env node */
+//Configuration file contains requireJS like shim and paths used by webpack shim-loader
+const path = require('path');
+
+var webpackShimConfig = {
+  shim: {
+    'moment': {
+      exports: 'moment',
+    },
+    'underscore': {
+      exports: '_',
+    },
+    'jquery': {
+      'exports': '$',
+    },
+    'bootstrap': {
+      'deps': ['jquery'],
+    },
+    'select2': {
+      'deps': ['jquery'],
+      'exports': '$.fn.select2',
+    },
+    'bootstrap.datepicker': {
+      'deps': ['jquery', 'bootstrap'],
+      'exports': 'jQuery.fn.datepicker',
+    },
+    'bootstrap.datetimepicker': {
+      'exports': 'jQuery.fn.datetimepicker',
+    },
+    'bootstrap.switch': {
+      deps: ['jquery', 'bootstrap'],
+      'exports': '$.fn.bootstrapSwitch',
+    },
+    'backbone': {
+      exports: 'Backbone', // Once loaded, use the global 'Backbone' as the module value.
+      deps: [
+        'underscore', // just make sure that underscore is loaded before (uses it's global value)
+        'jquery:$', // Provide jquery as dependency with name $
+      ],
+    },
+    'backgrid': {
+      'deps': ['backform'],
+      'exports': 'Backgrid',
+    },
+    'pgadmin.backform': {
+      'deps': ['backform', 'pgadmin.backgrid', 'select2'],
+    },
+    'pgadmin.backgrid': {
+      'deps': ['backgrid', 'bootstrap.datetimepicker', 'bootstrap.switch'],
+    },
+
+    'backgrid.select.all': {
+      'deps': ['backgrid'],
+    },
+    'backgrid.paginator': {
+      'deps': ['backgrid', 'backbone.paginator'],
+    },
+    'backgrid.filter': {
+      'deps': ['backgrid'],
+    },
+    'backgrid.sizeable.columns': {
+      'deps': ['backgrid'],
+    },
+    'jquery.event.drag': {
+      'deps': ['jquery'], 'exports': 'jQuery.fn.drag',
+    },
+    'jquery.ui': {'deps': ['jquery']},
+    'slick.pgadmin.formatters': {
+      'deps': ['slickgrid'],
+    },
+    'slick.pgadmin.editors': {
+      'deps': ['slickgrid'],
+    },
+    'slickgrid': {
+      'deps': ['jquery', 'jquery.ui', 'jquery.event.drag'],
+      'exports': 'Slick',
+    },
+    'flotr2': {
+      deps: ['bean'],
+    },
+    'alertify': {
+      'exports': 'alertify',
+    },
+    'jqueryui.position': {
+      'deps': ['jquery'],
+      'exports': 'jQuery.ui.position',
+    },
+    'jquery.contextmenu': {
+      'deps': ['jquery', 'jqueryui.position'],
+      'exports': 'jQuery.contextMenu',
+    },
+    'jquery.aciplugin': {
+      'deps': ['jquery'],
+      'exports': 'aciPluginClass',
+    },
+    'jquery.acitree': {
+      'deps': ['jquery', 'jquery.aciplugin'],
+      'exports': 'aciPluginClass.plugins.aciTree',
+    },
+    'jquery.acisortable': {
+      'deps': ['jquery', 'jquery.aciplugin'],
+      'exports': 'aciPluginClass.plugins.aciSortable',
+    },
+    'jquery.acifragment': {
+      'deps': ['jquery', 'jquery.aciplugin'],
+      'exports': 'aciPluginClass.plugins.aciFragment',
+    },
+    'wcdocker': {
+      'deps': ['jquery.contextmenu'],
+    },
+    'pgadmin.browser.messages': {
+      'deps': ['pgadmin.browser.datamodel'],
+    },
+  },
+
+  resolveAlias: {
+    'baseurl': path.join(__dirname, './pgadmin'),
+    'misc': path.join(__dirname, './pgadmin/static/bundle/misc'),
+    'browser_node': path.join(__dirname, './pgadmin/static/bundle/browser'),
+    'sources': path.join(__dirname, './pgadmin/static/js'),
+    'pgadmin': path.join(__dirname, './pgadmin/static/js/pgadmin'),
+    'tools.translations': path.join(__dirname, './pgadmin/tools/templates/js/translations'),
+    'sources/gettext': path.join(__dirname, './pgadmin/static/js/gettext'),
+    'babel-polyfill': path.join(__dirname, './node_modules/babel-polyfill/dist/polyfill'),
+
+    // Vendor JS
+    'jquery': path.join(__dirname, './node_modules/jquery/dist/jquery'),
+    'wcdocker': path.join(__dirname, './node_modules/webcabin-docker/Build/wcDocker'),
+    'alertify': path.join(__dirname, './node_modules/alertifyjs/build/alertify'),
+    'moment': path.join(__dirname, './node_modules/moment/moment'),
+    'jquery.event.drag': path.join(__dirname, './node_modules/slickgrid/lib/jquery.event.drag-2.2'),
+    'jquery.ui': path.join(__dirname, './node_modules/slickgrid/lib/jquery-ui-1.11.3'),
+    'flotr2': path.join(__dirname, './node_modules/flotr2/flotr2.amd'),
+    'bean': path.join(__dirname, './node_modules/flotr2/lib/bean'),
+    'jqueryui.position': path.join(__dirname, './node_modules/jquery-contextmenu/dist/jquery.ui.position'),
+    'jquery.contextmenu': path.join(__dirname, './node_modules/jquery-contextmenu/dist/jquery.contextmenu'),
+    'dropzone': path.join(__dirname, './node_modules/dropzone/dist/dropzone'),
+    'bignumber': path.join(__dirname, './node_modules/bignumber.js/bignumber'),
+
+    // AciTree
+    'jquery.acitree': path.join(__dirname, './node_modules/acitree/js/jquery.aciTree.min'),
+    'jquery.aciplugin': path.join(__dirname, './node_modules/acitree/js/jquery.aciPlugin.min'),
+    'jquery.acisortable': path.join(__dirname, './node_modules/acitree/js/jquery.aciSortable.min'),
+    'jquery.acifragment': path.join(__dirname, './node_modules/acitree/js/jquery.aciFragment.min'),
+
+    // Backbone and Backgrid
+    'backbone': path.join(__dirname, './node_modules/backbone/backbone'),
+    'backbone.undo': path.join(__dirname, './node_modules/backbone-undo/Backbone.Undo'),
+    'backform': path.join(__dirname, './node_modules/backform/src/backform'),
+    'backgrid': path.join(__dirname, './node_modules/backgrid/lib/backgrid'),
+    'bootstrap.datetimepicker': path.join(__dirname, './node_modules/bootstrap-datetime-picker/js/bootstrap-datetimepicker'),
+    'bootstrap.switch': path.join(__dirname, './node_modules/bootstrap-switch/dist/js/bootstrap-switch'),
+    'select2': path.join(__dirname, './node_modules/select2/dist/js/select2.full'),
+    'backgrid.filter': path.join(__dirname, './node_modules/backgrid-filter/backgrid-filter'),
+    'backgrid.sizeable.columns': path.join(__dirname, './node_modules/backgrid-sizeable-columns/backgrid-sizeable-columns'),
+    'backgrid.select.all': path.join(__dirname, './node_modules/backgrid-select-all/backgrid-select-all'),
+
+    'pgadmin.alertifyjs': path.join(__dirname, './pgadmin/static/js/alertify.pgadmin.defaults'),
+    'pgadmin.backform': path.join(__dirname, './pgadmin/static/js/backform.pgadmin'),
+    'pgadmin.backgrid': path.join(__dirname, './pgadmin/static/js/backgrid.pgadmin'),
+    'pgadmin.misc.explain': path.join(__dirname, './pgadmin/misc/templates/explain/js/explain'),
+    'pgadmin.settings': path.join(__dirname, './pgadmin/settings/templates/settings/settings'),
+    'pgadmin.preferences': path.join(__dirname, './pgadmin/preferences/templates/preferences/preferences'),
+    'pgadmin.dashboard': path.join(__dirname, './pgadmin/dashboard/templates/dashboard/js/dashboard'),
+    'bundled_codemirror': path.join(__dirname, './pgadmin/static/bundle/codemirror'),
+    'pgadmin.sqlfoldcode': path.join(__dirname, './pgadmin/static/js/codemirror/addon/fold/pgadmin-sqlfoldcode'),
+    'pgadmin.about': path.join(__dirname, './pgadmin/about/templates/about/about'),
+
+    //tools JS 
+    'tools.backup': path.join(__dirname, './pgadmin/tools/backup/templates/backup/js/backup'),
+    'tools.restore': path.join(__dirname, './pgadmin/tools/restore/templates/restore/js/restore'),
+    'pgadmin.browser.wizard': path.join(__dirname, './pgadmin/browser/static/js/wizard'),
+    'tools.grant_wizard': path.join(__dirname, './pgadmin/tools/grant_wizard/templates/grant_wizard/js/grant_wizard'),
+    'tools.datagrid': path.join(__dirname, './pgadmin/tools/datagrid/templates/datagrid/js/datagrid'),
+    'tools.querytool': path.join(__dirname, './pgadmin/tools/sqleditor/templates/sqleditor/js/sqleditor'),
+    'tools.maintenance': path.join(__dirname, './pgadmin/tools/maintenance/templates/maintenance/js/maintenance'),
+    'tools.import_export': path.join(__dirname, './pgadmin/tools/import_export/templates/import_export/js/import_export'),
+    'tools.debugger.ui': path.join(__dirname, './pgadmin/tools/debugger/templates/debugger/js/debugger_ui'),
+    'tools.debugger': path.join(__dirname, './pgadmin/tools/debugger/templates/debugger/js/debugger'),
+    'tools.direct': path.join(__dirname, './pgadmin/tools/debugger/templates/debugger/js/direct'),
+
+    // Misc JS
+    'misc.bgprocess': path.join(__dirname, './pgadmin/misc/bgprocess/static/js/bgprocess'),
+    'misc.file_manager': path.join(__dirname, './pgadmin/misc/file_manager/templates/file_manager/js/file_manager'),
+    'misc.file_utility': path.join(__dirname, './pgadmin/misc/file_manager/templates/file_manager/js/utility'),
+    'misc.statistics':  path.join(__dirname, './pgadmin/misc/statistics/static/js/statistics'),
+    'misc.depends':  path.join(__dirname, './pgadmin/misc/depends/static/js/depends'),
+    'misc.sql': path.join(__dirname, './pgadmin/misc/sql/static/js/sql'),
+
+    // Browser Plugins JS
+    'pgadmin.browser': path.join(__dirname, './pgadmin/browser/templates/browser/js/browser'),
+    'pgadmin.browser.error': path.join(__dirname, './pgadmin/browser/templates/browser/js/error'),
+    'pgadmin.browser.utils': path.join(__dirname, './pgadmin/browser/templates/browser/js/utils'),
+    'pgadmin.browser.server.privilege': path.join(__dirname, './pgadmin/browser/server_groups/servers/static/js/privilege'),
+    'pgadmin.browser.server.variable': path.join(__dirname, './pgadmin/browser/server_groups/servers/static/js/variable'),
+    'pgadmin.browser.collection': path.join(__dirname, './pgadmin/browser/templates/browser/js/collection'),
+    'pgadmin.browser.node': path.join(__dirname, './pgadmin/browser/templates/browser/js/node'),
+    'pgadmin.browser.node.ui': path.join(__dirname, './pgadmin/browser/static/js/node.ui'),
+    'pgadmin.browser.datamodel': path.join(__dirname, './pgadmin/browser/static/js/datamodel'),
+    'pgadmin.browser.menu': path.join(__dirname, './pgadmin/browser/static/js/menu'),
+    'pgadmin.browser.panel': path.join(__dirname, './pgadmin/browser/static/js/panel'),
+    'pgadmin.browser.frame': path.join(__dirname, './pgadmin/browser/static/js/frame'),
+    'pgadmin.tools.user_management': path.join(__dirname, './pgadmin/tools/user_management/templates/user_management/js/user_management'),
+    'slick.pgadmin.editors': path.join(__dirname, './pgadmin/static/js/slickgrid/slick.pgadmin.editors'),
+    'slick.pgadmin.formatters': path.join(__dirname, './pgadmin/static/js/slickgrid/slick.pgadmin.formatters'),
+
+    // Browser Nodes JS
+    'pgadmin.node.server_group': path.join(__dirname, './pgadmin/browser/server_groups/static/js/server-group'),
+    'pgadmin.node.server': path.join(__dirname, './pgadmin/browser/server_groups/servers/static/js/server'),
+    'pgadmin.node.database': path.join(__dirname, './pgadmin/browser/server_groups/servers/databases/static/js/database'),
+    'pgadmin.node.role': path.join(__dirname, './pgadmin/browser/server_groups/servers/roles/templates/role/js/role'),
+    'pgadmin.node.tablespace': path.join(__dirname, './pgadmin/browser/server_groups/servers/tablespaces/templates/tablespaces/js/tablespaces'),
+    'pgadmin.node.resource_group': path.join(__dirname, './pgadmin/browser/server_groups/servers/resource_groups/templates/resource_groups/js/resource_groups'),
+    'pgadmin.node.cast': path.join(__dirname, './pgadmin/browser/server_groups/servers/databases/casts/static/js/cast'),
+    'pgadmin.node.event_trigger': path.join(__dirname, './pgadmin/browser/server_groups/servers/databases/event_triggers/static/js/event_trigger'),
+    'pgadmin.node.extension': path.join(__dirname, './pgadmin/browser/server_groups/servers/databases/extensions/static/js/extension'),
+    'pgadmin.node.foreign_data_wrapper': path.join(__dirname, './pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/static/js/foreign_data_wrapper'),
+    'pgadmin.node.language': path.join(__dirname, './pgadmin/browser/server_groups/servers/databases/languages/static/js/language'),
+    'pgadmin.node.schema': path.join(__dirname, './pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema'),
+    'pgadmin.node.catalog': path.join(__dirname, './pgadmin/browser/server_groups/servers/databases/schemas/static/js/catalog'),
+    'pgadmin.node.catalog_object': path.join(__dirname, './pgadmin/browser/server_groups/servers/databases/schemas/catalog_objects/static/js/catalog_object'),
+    'pgadmin.node.collation': path.join(__dirname, './pgadmin/browser/server_groups/servers/databases/schemas/collations/static/js/collation'),
+    'pgadmin.node.domain': path.join(__dirname, './pgadmin/browser/server_groups/servers/databases/schemas/domains/static/js/domain'),
+    'pgadmin.node.domain_constraints': path.join(__dirname, './pgadmin/browser/server_groups/servers/databases/schemas/domains/domain_constraints/static/js/domain_constraints'),
+    'pgadmin.node.foreign_table': path.join(__dirname, './pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/static/js/foreign-table'),
+    'pgadmin.node.fts_configuration': path.join(__dirname, './pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/static/js/fts_configuration'),
+    'pgadmin.node.fts_dictionary': path.join(__dirname, './pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/static/js/fts_dictionary'),
+    'pgadmin.node.fts_parser': path.join(__dirname, './pgadmin/browser/server_groups/servers/databases/schemas/fts_parser/static/js/fts_parser'),
+    'pgadmin.node.fts_template': path.join(__dirname, './pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/static/js/fts_template'),
+
+    'pgadmin.node.function': path.join(__dirname, './pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/function'),
+    'pgadmin.node.procedure': path.join(__dirname, './pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/procedure'),
+    'pgadmin.node.trigger_function': path.join(__dirname, './pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/trigger_function'),
+    'pgadmin.node.package': path.join(__dirname, './pgadmin/browser/server_groups/servers/databases/schemas/packages/static/js/package'),
+    'pgadmin.node.sequence': path.join(__dirname, './pgadmin/browser/server_groups/servers/databases/schemas/sequences/static/js/sequence'),
+    'pgadmin.node.synonym': path.join(__dirname, './pgadmin/browser/server_groups/servers/databases/schemas/synonyms/static/js/synonym'),
+
+    'pgadmin.node.table': path.join(__dirname, './pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table'),
+    'pgadmin.browser.table.partition.utils': path.join(__dirname, './pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/partition.utils'),
+    'pgadmin.node.type': path.join(__dirname, './pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type'),
+    'pgadmin.node.view': path.join(__dirname, './pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view'),
+    'pgadmin.node.mview': path.join(__dirname, './pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview'),
+    'pgadmin.node.rule': path.join(__dirname, './pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/templates/rules/js/rules'),
+    'pgadmin.node.index': path.join(__dirname, './pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/templates/index/js/index'),
+    'pgadmin.node.trigger': path.join(__dirname, './pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/templates/trigger/js/trigger'),
+    'pgadmin.node.column': path.join(__dirname, './pgadmin/browser/server_groups/servers/databases/schemas/tables/column/templates/column/js/column'),
+    'pgadmin.node.constraints': path.join(__dirname, './pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/templates/constraints/js/constraints'),
+    'pgadmin.node.check_constraints': path.join(__dirname, './pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/templates/check_constraint/js/check_constraint'),
+    'pgadmin.node.exclusion_constraint': path.join(__dirname, './pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/templates/exclusion_constraint/js/exclusion_constraint'),
+    'pgadmin.node.foreign_key': path.join(__dirname, './pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/templates/foreign_key/js/foreign_key'),
+    'pgadmin.node.primary_key': path.join(__dirname, './pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key'),
+    'pgadmin.node.unique_constraint': path.join(__dirname, './pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint'),
+    'pgadmin.node.catalog_object_column': path.join(__dirname, './pgadmin/browser/server_groups/servers/databases/schemas/catalog_objects/columns/templates/catalog_object_column/js/catalog_object_column'),
+    'pgadmin.node.edbfunc': path.join(__dirname, './pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbfunc/js/edbfunc'),
+    'pgadmin.node.edbproc': path.join(__dirname, './pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/templates/edbproc/js/edbproc'),
+    'pgadmin.node.edbvar': path.join(__dirname, './pgadmin/browser/server_groups/servers/databases/schemas/packages/edbvars/templates/edbvar/js/edbvar'),
+
+    // pgAgent jobs JS
+    'pgadmin.node.pga_job': path.join(__dirname, './pgadmin/browser/server_groups/servers/pgagent/static/js/pga_job'),
+    'pgadmin.node.pga_schedule': path.join(__dirname, './pgadmin/browser/server_groups/servers/pgagent/schedules/static/js/pga_schedule'),
+    'pgadmin.node.pga_jobstep': path.join(__dirname, './pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep'),
+  },
+  pgLibs: [
+    'pgadmin.browser.wizard', 'pgadmin.browser.error', 'pgadmin.browser.server.privilege',
+    'pgadmin.browser.server.variable', 'pgadmin.browser.collection', 'pgadmin.browser.node.ui',
+    'pgadmin.browser.datamodel', 'pgadmin.browser.menu', 'pgadmin.browser.panel', 'pgadmin',
+    'pgadmin.browser.frame', 'slick.pgadmin.editors', 'slick.pgadmin.formatters',
+    'pgadmin.backform', 'pgadmin.backgrid', 'pgadmin.browser', 'misc.file_manager',
+    'misc.file_utility', 'sources/alerts/alertify_wrapper', 'pgadmin.browser.node',
+    'pgadmin.alertifyjs', 'pgadmin.settings', 'pgadmin.preferences', 'pgadmin.sqlfoldcode',
+  ],
+  isExternal: function(module) {
+    var context = module.context;
+    if (typeof context !== 'string') { return false; }
+    return context.indexOf('node_modules') !== -1;
+  },
+  isPgAdminLib: function (module) {
+    if (module.rawRequest === undefined) { return false; }
+    return this.pgLibs.indexOf(module.rawRequest) !== -1;
+  },
+};
+module.exports = webpackShimConfig;
diff --git a/web/yarn.lock b/web/yarn.lock
index 8cbb2408..e824dad4 100644
--- a/web/yarn.lock
+++ b/web/yarn.lock
@@ -2,6 +2,10 @@
 # yarn lockfile v1
 
 
+FileSaver@0.10.0:
+  version "0.10.0"
+  resolved "https://registry.yarnpkg.com/FileSaver/-/FileSaver-0.10.0.tgz#7def3889944458042ef5df2e9064c88e3d2281c7"
+
 JSONStream@^1.0.3:
   version "1.3.1"
   resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.1.tgz#707f761e01dae9e16f1bcf93703b78c70966579a"
@@ -13,13 +17,29 @@ abbrev@1:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f"
 
-accepts@1.3.3:
+abstract-leveldown@~2.4.0:
+  version "2.4.1"
+  resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.4.1.tgz#b3bfedb884eb693a12775f0c55e9f0a420ccee64"
+  dependencies:
+    xtend "~4.0.0"
+
+abstract-leveldown@~2.6.1:
+  version "2.6.1"
+  resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.6.1.tgz#f9014a5669b746418e145168dea49a044ae15900"
+  dependencies:
+    xtend "~4.0.0"
+
+accepts@1.3.3, accepts@~1.3.3:
   version "1.3.3"
   resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca"
   dependencies:
     mime-types "~2.1.11"
     negotiator "0.6.1"
 
+"acitree@git+https://github.com/imsurinder90/jquery-aciTree.git#rc.7":
+  version "4.5.0-rc.7"
+  resolved "git+https://github.com/imsurinder90/jquery-aciTree.git#24dcd7536a008abe25da6adb7bfde8eeb53892f1"
+
 acorn-dynamic-import@^2.0.0:
   version "2.0.2"
   resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz#c752bd210bef679501b6c6cb7fc84f8f47158cc4"
@@ -36,11 +56,11 @@ acorn@^3.0.4:
   version "3.3.0"
   resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a"
 
-acorn@^4.0.3, acorn@^4.0.4:
+acorn@^4.0.3:
   version "4.0.13"
   resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787"
 
-acorn@^5.0.1:
+acorn@^5.0.0, acorn@^5.0.1, acorn@^5.0.3:
   version "5.0.3"
   resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.0.3.tgz#c460df08491463f028ccb82eab3730bf01087b3d"
 
@@ -48,10 +68,14 @@ after@0.8.2:
   version "0.8.2"
   resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f"
 
-ajv-keywords@^1.0.0, ajv-keywords@^1.1.1:
+ajv-keywords@^1.0.0:
   version "1.5.1"
   resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c"
 
+ajv-keywords@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.0.tgz#a296e17f7bfae7c1ce4f7e0de53d29cb32162df0"
+
 ajv@^4.7.0, ajv@^4.9.1:
   version "4.11.8"
   resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536"
@@ -59,13 +83,19 @@ ajv@^4.7.0, ajv@^4.9.1:
     co "^4.6.0"
     json-stable-stringify "^1.0.1"
 
-ajv@^5.0.0:
-  version "5.1.5"
-  resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.1.5.tgz#8734931b601f00d4feef7c65738d77d1b65d1f68"
+ajv@^5.0.0, ajv@^5.1.5:
+  version "5.2.0"
+  resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.2.0.tgz#c1735024c5da2ef75cc190713073d44f098bf486"
   dependencies:
     co "^4.6.0"
+    fast-deep-equal "^0.1.0"
+    json-schema-traverse "^0.3.0"
     json-stable-stringify "^1.0.1"
 
+alertifyjs@^1.10.0:
+  version "1.10.0"
+  resolved "https://registry.yarnpkg.com/alertifyjs/-/alertifyjs-1.10.0.tgz#a49f18cb06e52650e06ef8cfb7514da78c8d0cef"
+
 align-text@^0.1.1, align-text@^0.1.3:
   version "0.1.4"
   resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117"
@@ -74,6 +104,10 @@ align-text@^0.1.1, align-text@^0.1.3:
     longest "^1.0.1"
     repeat-string "^1.5.2"
 
+almond@~0.3.1:
+  version "0.3.3"
+  resolved "https://registry.yarnpkg.com/almond/-/almond-0.3.3.tgz#a0e7c95ac7624d6417b4494b1e68bff693168a20"
+
 alphanum-sort@^1.0.1, alphanum-sort@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3"
@@ -90,6 +124,10 @@ ansi-regex@^2.0.0:
   version "2.1.1"
   resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
 
+ansi-regex@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
+
 ansi-styles@^2.2.1:
   version "2.2.1"
   resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
@@ -105,6 +143,12 @@ aproba@^1.0.3:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.2.tgz#45c6629094de4e96f693ef7eab74ae079c240fc1"
 
+archive-type@^3.0.0, archive-type@^3.0.1:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/archive-type/-/archive-type-3.2.0.tgz#9cd9c006957ebe95fadad5bd6098942a813737f6"
+  dependencies:
+    file-type "^3.1.0"
+
 are-we-there-yet@~1.1.2:
   version "1.1.4"
   resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d"
@@ -128,6 +172,10 @@ arr-flatten@^1.0.1:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.3.tgz#a274ed85ac08849b6bd7847c4580745dc51adfb1"
 
+array-differ@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031"
+
 array-filter@~0.0.0:
   version "0.0.1"
   resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec"
@@ -136,6 +184,10 @@ array-find-index@^1.0.1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1"
 
+array-flatten@1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
+
 array-map@~0.0.0:
   version "0.0.0"
   resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662"
@@ -154,7 +206,7 @@ array-union@^1.0.1:
   dependencies:
     array-uniq "^1.0.1"
 
-array-uniq@^1.0.1:
+array-uniq@^1.0.0, array-uniq@^1.0.1, array-uniq@^1.0.2:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6"
 
@@ -213,6 +265,10 @@ astw@^2.0.0:
   dependencies:
     acorn "^4.0.3"
 
+async-each-series@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/async-each-series/-/async-each-series-1.1.0.tgz#f42fd8155d38f21a5b8ea07c28e063ed1700b138"
+
 async-each@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d"
@@ -261,7 +317,7 @@ axios@^0.16.1:
     follow-redirects "^1.2.3"
     is-buffer "^1.1.5"
 
-babel-code-frame@^6.11.0, babel-code-frame@^6.16.0, babel-code-frame@^6.22.0:
+babel-code-frame@^6.16.0, babel-code-frame@^6.22.0:
   version "6.22.0"
   resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4"
   dependencies:
@@ -777,6 +833,46 @@ babylon@^6.11.0, babylon@^6.17.2:
   version "6.17.4"
   resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.4.tgz#3e8b7402b88d22c3423e137a1577883b15ff869a"
 
+backbone@1.1.2, "backbone@1.1.2 || 1.2.3 || ~1.3.2":
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/backbone/-/backbone-1.1.2.tgz#c2c04c66bf87268fb82c177acebeff7d37ba6f2d"
+  dependencies:
+    underscore ">=1.5.0"
+
+backbone@~1.2.3:
+  version "1.2.3"
+  resolved "https://registry.yarnpkg.com/backbone/-/backbone-1.2.3.tgz#c22cfd07fc86ebbeae61d18929ed115e999d65b9"
+  dependencies:
+    underscore ">=1.7.0"
+
+backform@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/backform/-/backform-0.2.0.tgz#b14cb8deb08c863fc595a2bc505066e32a2ad4ce"
+
+backgrid-filter@^0.3.7:
+  version "0.3.7"
+  resolved "https://registry.yarnpkg.com/backgrid-filter/-/backgrid-filter-0.3.7.tgz#d4b19d0e707013d7f181f9e8c7febb4997d56f03"
+  dependencies:
+    backbone "~1.2.3"
+    backgrid "~0.3.7"
+    lunr "^0.7.0"
+    underscore "^1.8.3"
+
+backgrid-select-all@^0.3.5:
+  version "0.3.5"
+  resolved "https://registry.yarnpkg.com/backgrid-select-all/-/backgrid-select-all-0.3.5.tgz#143a800e5d95ff2ae5a84d78bf4fba41f9481e94"
+
+backgrid-sizeable-columns@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/backgrid-sizeable-columns/-/backgrid-sizeable-columns-0.1.1.tgz#ec6fa592b263b390df1d83e566a48dca5036f02b"
+
+backgrid@^0.3.8, backgrid@~0.3.7:
+  version "0.3.8"
+  resolved "https://registry.yarnpkg.com/backgrid/-/backgrid-0.3.8.tgz#7d26816742d72c859cad39b13f19c9f27baffed7"
+  dependencies:
+    backbone "1.1.2 || 1.2.3 || ~1.3.2"
+    underscore "^1.8.0"
+
 backo2@1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947"
@@ -794,8 +890,8 @@ base64-arraybuffer@0.1.5:
   resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8"
 
 base64-js@^1.0.2:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.0.tgz#a39992d723584811982be5e290bb6a53d86700f1"
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.1.tgz#a91947da1f4a516ea38e5b4ec0ec3773675e0886"
 
 base64id@1.0.0:
   version "1.0.0"
@@ -807,6 +903,10 @@ bcrypt-pbkdf@^1.0.0:
   dependencies:
     tweetnacl "^0.14.3"
 
+beeper@^1.0.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809"
+
 better-assert@~1.0.0:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522"
@@ -817,10 +917,68 @@ big.js@^3.1.3:
   version "3.1.3"
   resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.1.3.tgz#4cada2193652eb3ca9ec8e55c9015669c9806978"
 
+bignumber.js@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-4.0.2.tgz#2d1dc37ee5968867ecea90b6da4d16e68608d21d"
+
+bin-build@^2.0.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/bin-build/-/bin-build-2.2.0.tgz#11f8dd61f70ffcfa2bdcaa5b46f5e8fedd4221cc"
+  dependencies:
+    archive-type "^3.0.1"
+    decompress "^3.0.0"
+    download "^4.1.2"
+    exec-series "^1.0.0"
+    rimraf "^2.2.6"
+    tempfile "^1.0.0"
+    url-regex "^3.0.0"
+
+bin-check@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/bin-check/-/bin-check-2.0.0.tgz#86f8e6f4253893df60dc316957f5af02acb05930"
+  dependencies:
+    executable "^1.0.0"
+
+bin-version-check@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/bin-version-check/-/bin-version-check-2.1.0.tgz#e4e5df290b9069f7d111324031efc13fdd11a5b0"
+  dependencies:
+    bin-version "^1.0.0"
+    minimist "^1.1.0"
+    semver "^4.0.3"
+    semver-truncate "^1.0.0"
+
+bin-version@^1.0.0:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/bin-version/-/bin-version-1.0.4.tgz#9eb498ee6fd76f7ab9a7c160436f89579435d78e"
+  dependencies:
+    find-versions "^1.0.0"
+
+bin-wrapper@^3.0.0:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/bin-wrapper/-/bin-wrapper-3.0.2.tgz#67d3306262e4b1a5f2f88ee23464f6a655677aeb"
+  dependencies:
+    bin-check "^2.0.0"
+    bin-version-check "^2.1.0"
+    download "^4.0.0"
+    each-async "^1.1.1"
+    lazy-req "^1.0.0"
+    os-filter-obj "^1.0.0"
+
 binary-extensions@^1.0.0:
   version "1.8.0"
   resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa5884682480af4d95c774"
 
+bindings@~1.2.1:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.2.1.tgz#14ad6113812d2d37d72e67b4cacb4bb726505f11"
+
+bl@^1.0.0:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.1.tgz#cac328f7bee45730d404b692203fcb590e172d5e"
+  dependencies:
+    readable-stream "^2.0.5"
+
 blob@0.0.4:
   version "0.0.4"
   resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.4.tgz#bcf13052ca54463f30f9fc7e95b9a47630a94921"
@@ -831,7 +989,7 @@ block-stream@*:
   dependencies:
     inherits "~2.0.0"
 
-bluebird@^3.3.0:
+bluebird@^3.0.0, bluebird@^3.3.0:
   version "3.5.0"
   resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c"
 
@@ -864,6 +1022,26 @@ boom@2.x.x:
   dependencies:
     hoek "2.x.x"
 
+bootstrap-datepicker@^1.7.0:
+  version "1.7.1"
+  resolved "https://registry.yarnpkg.com/bootstrap-datepicker/-/bootstrap-datepicker-1.7.1.tgz#4ee7faf34888dbec7834fbf9dbe7c4277e01ddaf"
+  dependencies:
+    jquery ">=1.7.1 <4.0.0"
+
+bootstrap-datetime-picker@^2.4.4:
+  version "2.4.4"
+  resolved "https://registry.yarnpkg.com/bootstrap-datetime-picker/-/bootstrap-datetime-picker-2.4.4.tgz#b7cfe843a3c6d221c03293c9a464a4cc35d73968"
+
+bootstrap-switch@3.3.2:
+  version "3.3.2"
+  resolved "https://registry.yarnpkg.com/bootstrap-switch/-/bootstrap-switch-3.3.2.tgz#79ddb49fadc308fb731e257f95957af48996eea7"
+  dependencies:
+    jquery ">=1.9.0"
+
+bootstrap@^3.3.7:
+  version "3.3.7"
+  resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-3.3.7.tgz#5a389394549f23330875a3b150656574f8a9eb71"
+
 bowser@1.6.1, bowser@^1.6.0:
   version "1.6.1"
   resolved "https://registry.yarnpkg.com/bowser/-/bowser-1.6.1.tgz#9157e9498f456e937173a2918f3b2161e5353eb3"
@@ -1019,6 +1197,15 @@ browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6:
     caniuse-db "^1.0.30000639"
     electron-to-chromium "^1.2.7"
 
+buffer-to-vinyl@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/buffer-to-vinyl/-/buffer-to-vinyl-1.1.0.tgz#00f15faee3ab7a1dda2cde6d9121bffdd07b2262"
+  dependencies:
+    file-type "^3.1.0"
+    readable-stream "^2.0.2"
+    uuid "^2.0.1"
+    vinyl "^1.0.0"
+
 buffer-xor@^1.0.2:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
@@ -1097,8 +1284,12 @@ caniuse-api@^1.5.2:
     lodash.uniq "^4.5.0"
 
 caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639:
-  version "1.0.30000684"
-  resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000684.tgz#99acb0118b8fd1fdd601a15e0c0f2dfc15a81680"
+  version "1.0.30000700"
+  resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000700.tgz#97cfc483865eea8577dc7a3674929b9abf553095"
+
+capture-stack-trace@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d"
 
 caseless@~0.11.0:
   version "0.11.0"
@@ -1108,6 +1299,15 @@ caseless@~0.12.0:
   version "0.12.0"
   resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
 
+caw@^1.0.1:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/caw/-/caw-1.2.0.tgz#ffb226fe7efc547288dc62ee3e97073c212d1034"
+  dependencies:
+    get-proxy "^1.0.1"
+    is-obj "^1.0.0"
+    object-assign "^3.0.0"
+    tunnel-agent "^0.4.0"
+
 center-align@^0.1.1:
   version "0.1.3"
   resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad"
@@ -1161,6 +1361,10 @@ chokidar@^1.0.0, chokidar@^1.4.1, chokidar@^1.4.3:
   optionalDependencies:
     fsevents "^1.0.0"
 
+chownr@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181"
+
 cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.3.tgz#eeabf194419ce900da3018c207d212f2a6df0a07"
@@ -1177,6 +1381,13 @@ clap@^1.0.9:
   dependencies:
     chalk "^1.1.3"
 
+clean-css@^3.1.9:
+  version "3.4.27"
+  resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-3.4.27.tgz#adef75b31c160ffa5d72f4de67966e2660c1a255"
+  dependencies:
+    commander "2.8.x"
+    source-map "0.4.x"
+
 cli-cursor@^1.0.1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987"
@@ -1212,10 +1423,22 @@ clone-deep@^0.3.0:
     kind-of "^3.2.2"
     shallow-clone "^0.1.2"
 
-clone@^1.0.2:
+clone-stats@^0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1"
+
+clone@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/clone/-/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f"
+
+clone@^1.0.0, clone@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149"
 
+co@3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/co/-/co-3.1.0.tgz#4ea54ea5a08938153185e15210c68d9092bc1b78"
+
 co@^4.6.0:
   version "4.6.0"
   resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
@@ -1230,6 +1453,10 @@ code-point-at@^1.0.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
 
+codemirror@^5.27.2:
+  version "5.27.4"
+  resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-5.27.4.tgz#0e817c839bfea9959dd16cd48ae14acc0e43c3b6"
+
 color-convert@^1.3.0:
   version "1.9.0"
   resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.0.tgz#1accf97dd739b983bf994d56fec8f95853641b7a"
@@ -1287,12 +1514,16 @@ combined-stream@^1.0.5, combined-stream@~1.0.5:
   dependencies:
     delayed-stream "~1.0.0"
 
-commander@^2.9.0:
-  version "2.9.0"
-  resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4"
+commander@2.8.x, commander@~2.8.1:
+  version "2.8.1"
+  resolved "https://registry.yarnpkg.com/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4"
   dependencies:
     graceful-readlink ">= 1.0.0"
 
+commander@^2.9.0:
+  version "2.11.0"
+  resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563"
+
 commondir@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
@@ -1325,7 +1556,7 @@ concat-stream@1.5.0:
     readable-stream "~2.0.0"
     typedarray "~0.0.5"
 
-concat-stream@^1.5.2, concat-stream@~1.5.0, concat-stream@~1.5.1:
+concat-stream@^1.4.6, concat-stream@^1.4.7, concat-stream@^1.5.2, concat-stream@~1.5.0, concat-stream@~1.5.1:
   version "1.5.2"
   resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.2.tgz#708978624d856af41a5a741defdd261da752c266"
   dependencies:
@@ -1352,15 +1583,23 @@ console-control-strings@^1.0.0, console-control-strings@~1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
 
+console-stream@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/console-stream/-/console-stream-0.1.1.tgz#a095fe07b20465955f2fafd28b5d72bccd949d44"
+
 constants-browserify@^1.0.0, constants-browserify@~1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
 
+content-disposition@0.5.2:
+  version "0.5.2"
+  resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4"
+
 content-type@~1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed"
 
-convert-source-map@^1.1.0, convert-source-map@^1.1.3:
+convert-source-map@^1.1.0, convert-source-map@^1.1.1, convert-source-map@^1.1.3:
   version "1.5.0"
   resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5"
 
@@ -1368,6 +1607,10 @@ convert-source-map@~1.1.0:
   version "1.1.3"
   resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.1.3.tgz#4829c877e9fe49b3161f3bf3673888e204699860"
 
+cookie-signature@1.0.6:
+  version "1.0.6"
+  resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
+
 cookie@0.3.1:
   version "0.3.1"
   resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"
@@ -1391,6 +1634,12 @@ create-ecdh@^4.0.0:
     bn.js "^4.1.0"
     elliptic "^6.0.0"
 
+create-error-class@^3.0.1:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6"
+  dependencies:
+    capture-stack-trace "^1.0.0"
+
 create-hash@^1.1.0, create-hash@^1.1.1, create-hash@^1.1.2:
   version "1.1.3"
   resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.3.tgz#606042ac8b9262750f483caddab0f5819172d8fd"
@@ -1411,6 +1660,13 @@ create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
     safe-buffer "^5.0.1"
     sha.js "^2.4.8"
 
+cross-env@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-5.0.1.tgz#ff4e72ea43b47da2486b43a7f2043b2609e44913"
+  dependencies:
+    cross-spawn "^5.1.0"
+    is-windows "^1.0.0"
+
 cross-spawn@^3.0.0:
   version "3.0.1"
   resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982"
@@ -1418,6 +1674,21 @@ cross-spawn@^3.0.0:
     lru-cache "^4.0.1"
     which "^1.2.9"
 
+cross-spawn@^4.0.0:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41"
+  dependencies:
+    lru-cache "^4.0.1"
+    which "^1.2.9"
+
+cross-spawn@^5.1.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
+  dependencies:
+    lru-cache "^4.0.1"
+    shebang-command "^1.2.0"
+    which "^1.2.9"
+
 cryptiles@2.x.x:
   version "2.0.5"
   resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8"
@@ -1449,24 +1720,14 @@ css-in-js-utils@^1.0.3:
   dependencies:
     hyphenate-style-name "^1.0.2"
 
-css-loader@^0.28.4:
-  version "0.28.4"
-  resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-0.28.4.tgz#6cf3579192ce355e8b38d5f42dd7a1f2ec898d0f"
+css-loader@0.14.0:
+  version "0.14.0"
+  resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-0.14.0.tgz#7e5acf45fc4d620dedda5b6de78f6738f1a2048b"
   dependencies:
-    babel-code-frame "^6.11.0"
-    css-selector-tokenizer "^0.7.0"
-    cssnano ">=2.6.1 <4"
-    icss-utils "^2.1.0"
-    loader-utils "^1.0.2"
-    lodash.camelcase "^4.3.0"
-    object-assign "^4.0.1"
-    postcss "^5.0.6"
-    postcss-modules-extract-imports "^1.0.0"
-    postcss-modules-local-by-default "^1.0.1"
-    postcss-modules-scope "^1.0.0"
-    postcss-modules-values "^1.1.0"
-    postcss-value-parser "^3.3.0"
-    source-list-map "^0.1.7"
+    clean-css "^3.1.9"
+    fastparse "^1.0.0"
+    loader-utils "~0.2.2"
+    source-list-map "^0.1.4"
 
 css-select@~1.2.0:
   version "1.2.0"
@@ -1477,23 +1738,11 @@ css-select@~1.2.0:
     domutils "1.5.1"
     nth-check "~1.0.1"
 
-css-selector-tokenizer@^0.7.0:
-  version "0.7.0"
-  resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz#e6988474ae8c953477bf5e7efecfceccd9cf4c86"
-  dependencies:
-    cssesc "^0.1.0"
-    fastparse "^1.1.1"
-    regexpu-core "^1.0.0"
-
 css-what@2.1:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd"
 
-cssesc@^0.1.0:
-  version "0.1.0"
-  resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4"
-
-"cssnano@>=2.6.1 <4":
+cssnano@^3.10.0:
   version "3.10.0"
   resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-3.10.0.tgz#4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38"
   dependencies:
@@ -1563,6 +1812,10 @@ date-now@^0.1.4:
   version "0.1.4"
   resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
 
+dateformat@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.0.0.tgz#2743e3abb5c3fc2462e527dca445e04e9f4dee17"
+
 debug@0.7.4:
   version "0.7.4"
   resolved "https://registry.yarnpkg.com/debug/-/debug-0.7.4.tgz#06e1ea8082c2cb14e39806e22e2f6f757f92af39"
@@ -1595,6 +1848,66 @@ decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
 
+decompress-tar@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/decompress-tar/-/decompress-tar-3.1.0.tgz#217c789f9b94450efaadc5c5e537978fc333c466"
+  dependencies:
+    is-tar "^1.0.0"
+    object-assign "^2.0.0"
+    strip-dirs "^1.0.0"
+    tar-stream "^1.1.1"
+    through2 "^0.6.1"
+    vinyl "^0.4.3"
+
+decompress-tarbz2@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/decompress-tarbz2/-/decompress-tarbz2-3.1.0.tgz#8b23935681355f9f189d87256a0f8bdd96d9666d"
+  dependencies:
+    is-bzip2 "^1.0.0"
+    object-assign "^2.0.0"
+    seek-bzip "^1.0.3"
+    strip-dirs "^1.0.0"
+    tar-stream "^1.1.1"
+    through2 "^0.6.1"
+    vinyl "^0.4.3"
+
+decompress-targz@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/decompress-targz/-/decompress-targz-3.1.0.tgz#b2c13df98166268991b715d6447f642e9696f5a0"
+  dependencies:
+    is-gzip "^1.0.0"
+    object-assign "^2.0.0"
+    strip-dirs "^1.0.0"
+    tar-stream "^1.1.1"
+    through2 "^0.6.1"
+    vinyl "^0.4.3"
+
+decompress-unzip@^3.0.0:
+  version "3.4.0"
+  resolved "https://registry.yarnpkg.com/decompress-unzip/-/decompress-unzip-3.4.0.tgz#61475b4152066bbe3fee12f9d629d15fe6478eeb"
+  dependencies:
+    is-zip "^1.0.0"
+    read-all-stream "^3.0.0"
+    stat-mode "^0.2.0"
+    strip-dirs "^1.0.0"
+    through2 "^2.0.0"
+    vinyl "^1.0.0"
+    yauzl "^2.2.1"
+
+decompress@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/decompress/-/decompress-3.0.0.tgz#af1dd50d06e3bfc432461d37de11b38c0d991bed"
+  dependencies:
+    buffer-to-vinyl "^1.0.0"
+    concat-stream "^1.4.6"
+    decompress-tar "^3.0.0"
+    decompress-tarbz2 "^3.0.0"
+    decompress-targz "^3.0.0"
+    decompress-unzip "^3.0.0"
+    stream-combiner2 "^1.1.1"
+    vinyl-assign "^1.0.1"
+    vinyl-fs "^2.2.0"
+
 deep-equal-ident@^1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/deep-equal-ident/-/deep-equal-ident-1.1.1.tgz#06f4b89e53710cd6cea4a7781c7a956642de8dc9"
@@ -1609,6 +1922,12 @@ deep-is@~0.1.3:
   version "0.1.3"
   resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
 
+deferred-leveldown@~1.2.1:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-1.2.1.tgz#5d25c3310f5fe909946f6240dc9f90dd109a71ef"
+  dependencies:
+    abstract-leveldown "~2.4.0"
+
 define-properties@^1.1.2:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94"
@@ -1660,6 +1979,10 @@ des.js@^1.0.0:
     inherits "^2.0.1"
     minimalistic-assert "^1.0.0"
 
+destroy@~1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
+
 detect-indent@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208"
@@ -1740,12 +2063,62 @@ domutils@1.5.1, domutils@^1.5.1:
     dom-serializer "0"
     domelementtype "1"
 
-duplexer2@^0.1.2, duplexer2@~0.1.0, duplexer2@~0.1.2:
+download@^4.0.0, download@^4.1.2:
+  version "4.4.3"
+  resolved "https://registry.yarnpkg.com/download/-/download-4.4.3.tgz#aa55fdad392d95d4b68e8c2be03e0c2aa21ba9ac"
+  dependencies:
+    caw "^1.0.1"
+    concat-stream "^1.4.7"
+    each-async "^1.0.0"
+    filenamify "^1.0.1"
+    got "^5.0.0"
+    gulp-decompress "^1.2.0"
+    gulp-rename "^1.2.0"
+    is-url "^1.2.0"
+    object-assign "^4.0.1"
+    read-all-stream "^3.0.0"
+    readable-stream "^2.0.2"
+    stream-combiner2 "^1.1.1"
+    vinyl "^1.0.0"
+    vinyl-fs "^2.2.0"
+    ware "^1.2.0"
+
+dropzone@^5.1.1:
+  version "5.1.1"
+  resolved "https://registry.yarnpkg.com/dropzone/-/dropzone-5.1.1.tgz#9f5b02fc4aa84e6466e046ba770bc82776ea49de"
+
+duplexer2@0.0.2:
+  version "0.0.2"
+  resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db"
+  dependencies:
+    readable-stream "~1.1.9"
+
+duplexer2@^0.1.2, duplexer2@^0.1.4, duplexer2@~0.1.0, duplexer2@~0.1.2:
   version "0.1.4"
   resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1"
   dependencies:
     readable-stream "^2.0.2"
 
+duplexer@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1"
+
+duplexify@^3.2.0:
+  version "3.5.0"
+  resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.0.tgz#1aa773002e1578457e9d9d4a50b0ccaaebcbd604"
+  dependencies:
+    end-of-stream "1.0.0"
+    inherits "^2.0.1"
+    readable-stream "^2.0.0"
+    stream-shift "^1.0.0"
+
+each-async@^1.0.0, each-async@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/each-async/-/each-async-1.1.1.tgz#dee5229bdf0ab6ba2012a395e1b869abf8813473"
+  dependencies:
+    onetime "^1.0.0"
+    set-immediate-shim "^1.0.0"
+
 ecc-jsbn@~0.1.1:
   version "0.1.1"
   resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505"
@@ -1756,9 +2129,13 @@ ee-first@1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
 
+ejs@^2.5.6:
+  version "2.5.6"
+  resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.5.6.tgz#479636bfa3fe3b1debd52087f0acb204b4f19c88"
+
 electron-to-chromium@^1.2.7:
-  version "1.3.14"
-  resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.14.tgz#64af0f9efd3c3c6acd57d71f83b49ca7ee9c4b43"
+  version "1.3.15"
+  resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.15.tgz#08397934891cbcfaebbd18b82a95b5a481138369"
 
 elliptic@^6.0.0:
   version "6.4.0"
@@ -1786,6 +2163,18 @@ encoding@^0.1.11:
   dependencies:
     iconv-lite "~0.4.13"
 
+end-of-stream@1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.0.0.tgz#d4596e702734a93e40e9af864319eabd99ff2f0e"
+  dependencies:
+    once "~1.3.0"
+
+end-of-stream@^1.0.0, end-of-stream@^1.1.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.0.tgz#7a90d833efda6cfa6eac0f4949dbb0fad3a63206"
+  dependencies:
+    once "^1.4.0"
+
 engine.io-client@1.8.3:
   version "1.8.3"
   resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-1.8.3.tgz#1798ed93451246453d4c6f635d7a201fe940d5ab"
@@ -1826,8 +2215,8 @@ engine.io@1.8.3:
     ws "1.1.2"
 
 enhanced-resolve@^3.0.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.1.0.tgz#9f4b626f577245edcf4b2ad83d86e17f4f421dec"
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.3.0.tgz#950964ecc7f0332a42321b673b38dc8ff15535b3"
   dependencies:
     graceful-fs "^4.1.2"
     memory-fs "^0.4.0"
@@ -1842,9 +2231,9 @@ entities@^1.1.1, entities@~1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0"
 
-enzyme-matchers@^3.1.0, enzyme-matchers@^3.2.0:
-  version "3.2.0"
-  resolved "https://registry.yarnpkg.com/enzyme-matchers/-/enzyme-matchers-3.2.0.tgz#4718779a3b9eb5e8ebad46804f8d3e66045d0181"
+enzyme-matchers@^3.1.0, enzyme-matchers@^3.4.0:
+  version "3.4.0"
+  resolved "https://registry.yarnpkg.com/enzyme-matchers/-/enzyme-matchers-3.4.0.tgz#48c2db3d5c70c8ac3b0993f7b2673367457eea9c"
   dependencies:
     deep-equal-ident "^1.1.1"
 
@@ -1863,7 +2252,7 @@ enzyme@~2.8.2:
     prop-types "^15.5.4"
     uuid "^2.0.3"
 
-errno@^0.1.3:
+errno@^0.1.3, errno@~0.1.1:
   version "0.1.4"
   resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d"
   dependencies:
@@ -1975,7 +2364,7 @@ eslint-plugin-react@^6.10.3:
     jsx-ast-utils "^1.3.4"
     object.assign "^4.0.4"
 
-eslint@^3.19.0:
+eslint@3.19.0:
   version "3.19.0"
   resolved "https://registry.yarnpkg.com/eslint/-/eslint-3.19.0.tgz#c8fc6201c7f40dd08941b87c085767386a679acc"
   dependencies:
@@ -2026,10 +2415,6 @@ esprima@^2.6.0:
   version "2.7.3"
   resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581"
 
-esprima@^3.1.1:
-  version "3.1.3"
-  resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633"
-
 esquery@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa"
@@ -2051,6 +2436,14 @@ esutils@^2.0.0, esutils@^2.0.2:
   version "2.0.2"
   resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
 
+etag@~1.8.0:
+  version "1.8.0"
+  resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.0.tgz#6f631aef336d6c46362b51764044ce216be3c051"
+
+eve@~0.5.1:
+  version "0.5.4"
+  resolved "https://registry.yarnpkg.com/eve/-/eve-0.5.4.tgz#67d080b9725291d7e389e34c26860dd97f1debaa"
+
 event-emitter@~0.3.5:
   version "0.3.5"
   resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39"
@@ -2072,6 +2465,41 @@ evp_bytestokey@^1.0.0:
   dependencies:
     create-hash "^1.1.1"
 
+exec-buffer@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/exec-buffer/-/exec-buffer-3.1.0.tgz#851b46d062fca9bcbc6ff8781693e28e8da80402"
+  dependencies:
+    execa "^0.5.0"
+    p-finally "^1.0.0"
+    pify "^2.3.0"
+    rimraf "^2.5.4"
+    tempfile "^1.0.0"
+
+exec-series@^1.0.0:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/exec-series/-/exec-series-1.0.3.tgz#6d257a9beac482a872c7783bc8615839fc77143a"
+  dependencies:
+    async-each-series "^1.1.0"
+    object-assign "^4.1.0"
+
+execa@^0.5.0:
+  version "0.5.1"
+  resolved "https://registry.yarnpkg.com/execa/-/execa-0.5.1.tgz#de3fb85cb8d6e91c85bcbceb164581785cb57b36"
+  dependencies:
+    cross-spawn "^4.0.0"
+    get-stream "^2.2.0"
+    is-stream "^1.1.0"
+    npm-run-path "^2.0.0"
+    p-finally "^1.0.0"
+    signal-exit "^3.0.0"
+    strip-eof "^1.0.0"
+
+executable@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/executable/-/executable-1.1.0.tgz#877980e9112f3391066da37265de7ad8434ab4d9"
+  dependencies:
+    meow "^3.1.0"
+
 exit-hook@^1.0.0:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8"
@@ -2103,6 +2531,10 @@ expand-range@^1.8.1:
   dependencies:
     fill-range "^2.1.0"
 
+expand-template@^1.0.2:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-1.0.3.tgz#6c303323177a62b1b22c070279f7861287b69b1a"
+
 exports-loader@~0.6.4:
   version "0.6.4"
   resolved "https://registry.yarnpkg.com/exports-loader/-/exports-loader-0.6.4.tgz#d70fc6121975b35fc12830cf52754be2740fc886"
@@ -2110,6 +2542,45 @@ exports-loader@~0.6.4:
     loader-utils "^1.0.2"
     source-map "0.5.x"
 
+express@^4.15.2:
+  version "4.15.3"
+  resolved "https://registry.yarnpkg.com/express/-/express-4.15.3.tgz#bab65d0f03aa80c358408972fc700f916944b662"
+  dependencies:
+    accepts "~1.3.3"
+    array-flatten "1.1.1"
+    content-disposition "0.5.2"
+    content-type "~1.0.2"
+    cookie "0.3.1"
+    cookie-signature "1.0.6"
+    debug "2.6.7"
+    depd "~1.1.0"
+    encodeurl "~1.0.1"
+    escape-html "~1.0.3"
+    etag "~1.8.0"
+    finalhandler "~1.0.3"
+    fresh "0.5.0"
+    merge-descriptors "1.0.1"
+    methods "~1.1.2"
+    on-finished "~2.3.0"
+    parseurl "~1.3.1"
+    path-to-regexp "0.1.7"
+    proxy-addr "~1.1.4"
+    qs "6.4.0"
+    range-parser "~1.2.0"
+    send "0.15.3"
+    serve-static "1.12.3"
+    setprototypeof "1.0.3"
+    statuses "~1.3.1"
+    type-is "~1.6.15"
+    utils-merge "1.0.0"
+    vary "~1.1.1"
+
+extend-shallow@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
+  dependencies:
+    is-extendable "^0.1.0"
+
 extend@^3.0.0, extend@~3.0.0:
   version "3.0.1"
   resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444"
@@ -2142,11 +2613,26 @@ extsprintf@1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550"
 
+fancy-log@^1.1.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.0.tgz#45be17d02bb9917d60ccffd4995c999e6c8c9948"
+  dependencies:
+    chalk "^1.1.1"
+    time-stamp "^1.0.0"
+
+fast-deep-equal@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-0.1.0.tgz#5c6f4599aba6b333ee3342e2ed978672f1001f8d"
+
+fast-future@~1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/fast-future/-/fast-future-1.0.2.tgz#8435a9aaa02d79248d17d704e76259301d99280a"
+
 fast-levenshtein@~2.0.4:
   version "2.0.6"
   resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
 
-fastparse@^1.1.1:
+fastparse@^1.0.0:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.1.tgz#d1e2643b38a94d7583b479060e6c4affc94071f8"
 
@@ -2182,10 +2668,40 @@ file-entry-cache@^2.0.0:
     flat-cache "^1.2.1"
     object-assign "^4.0.1"
 
+file-loader@^0.11.2:
+  version "0.11.2"
+  resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-0.11.2.tgz#4ff1df28af38719a6098093b88c82c71d1794a34"
+  dependencies:
+    loader-utils "^1.0.2"
+
+file-type@^3.1.0:
+  version "3.9.0"
+  resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9"
+
+file-type@^4.1.0:
+  version "4.4.0"
+  resolved "https://registry.yarnpkg.com/file-type/-/file-type-4.4.0.tgz#1b600e5fca1fbdc6e80c0a70c71c8dba5f7906c5"
+
 filename-regex@^2.0.0:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26"
 
+filename-reserved-regex@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-1.0.0.tgz#e61cf805f0de1c984567d0386dc5df50ee5af7e4"
+
+filenamify@^1.0.1:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-1.2.1.tgz#a9f2ffd11c503bed300015029272378f1f1365a5"
+  dependencies:
+    filename-reserved-regex "^1.0.0"
+    strip-outer "^1.0.0"
+    trim-repeated "^1.0.0"
+
+filesize@^3.5.9:
+  version "3.5.10"
+  resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.5.10.tgz#fc8fa23ddb4ef9e5e0ab6e1e64f679a24a56761f"
+
 fill-range@^2.1.0:
   version "2.2.3"
   resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723"
@@ -2196,7 +2712,7 @@ fill-range@^2.1.0:
     repeat-element "^1.1.2"
     repeat-string "^1.5.2"
 
-finalhandler@1.0.3:
+finalhandler@1.0.3, finalhandler@~1.0.3:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.0.3.tgz#ef47e77950e999780e86022a560e3217e0d0cc89"
   dependencies:
@@ -2223,6 +2739,19 @@ find-up@^1.0.0:
     path-exists "^2.0.0"
     pinkie-promise "^2.0.0"
 
+find-versions@^1.0.0:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-1.2.1.tgz#cbde9f12e38575a0af1be1b9a2c5d5fd8f186b62"
+  dependencies:
+    array-uniq "^1.0.0"
+    get-stdin "^4.0.1"
+    meow "^3.5.0"
+    semver-regex "^1.0.0"
+
+first-chunk-stream@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e"
+
 flat-cache@^1.2.1:
   version "1.2.2"
   resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.2.2.tgz#fa86714e72c21db88601761ecf2f555d1abc6b96"
@@ -2236,12 +2765,28 @@ flatten@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782"
 
+flotr2@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/flotr2/-/flotr2-0.1.0.tgz#8d31b0d1b3dc46f5e399edeb7a179e075b36e036"
+
 follow-redirects@^1.2.3:
   version "1.2.3"
   resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.2.3.tgz#01abaeca85e3609837d9fcda3167a7e42fdaca21"
   dependencies:
     debug "^2.4.5"
 
+font-awesome@4.6.3:
+  version "4.6.3"
+  resolved "https://registry.yarnpkg.com/font-awesome/-/font-awesome-4.6.3.tgz#86933651540ee00874c664017f50f2172f6531a2"
+
+font-awesome@^4.7.0:
+  version "4.7.0"
+  resolved "https://registry.yarnpkg.com/font-awesome/-/font-awesome-4.7.0.tgz#8fa8cf0411a1a31afd07b06d2902bb9fc815a133"
+
+font-mfizz@^1.2.2:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/font-mfizz/-/font-mfizz-1.2.2.tgz#515b848bf1932dadc7e05339b1d9f4588ebe9014"
+
 for-in@^0.1.3:
   version "0.1.8"
   resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1"
@@ -2278,6 +2823,14 @@ form-data@~2.1.1:
     combined-stream "^1.0.5"
     mime-types "^2.1.12"
 
+forwarded@~0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.0.tgz#19ef9874c4ae1c297bcf078fde63a09b66a84363"
+
+fresh@0.5.0:
+  version "0.5.0"
+  resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.0.tgz#f474ca5e6a9246d6fd8e0953cfa9b9c805afa78e"
+
 fs-extra@~1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950"
@@ -2359,16 +2912,41 @@ get-caller-file@^1.0.1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5"
 
+get-proxy@^1.0.1:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/get-proxy/-/get-proxy-1.1.0.tgz#894854491bc591b0f147d7ae570f5c678b7256eb"
+  dependencies:
+    rc "^1.1.2"
+
 get-stdin@^4.0.1:
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe"
 
+get-stream@^2.2.0:
+  version "2.3.1"
+  resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-2.3.1.tgz#5f38f93f346009666ee0150a054167f91bdd95de"
+  dependencies:
+    object-assign "^4.0.1"
+    pinkie-promise "^2.0.0"
+
 getpass@^0.1.1:
   version "0.1.7"
   resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
   dependencies:
     assert-plus "^1.0.0"
 
+gifsicle@^3.0.0:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/gifsicle/-/gifsicle-3.0.4.tgz#f45cb5ed10165b665dc929e0e9328b6c821dfa3b"
+  dependencies:
+    bin-build "^2.0.0"
+    bin-wrapper "^3.0.0"
+    logalot "^2.0.0"
+
+github-from-package@0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce"
+
 glob-base@^0.3.0:
   version "0.3.0"
   resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4"
@@ -2382,6 +2960,36 @@ glob-parent@^2.0.0:
   dependencies:
     is-glob "^2.0.0"
 
+glob-parent@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae"
+  dependencies:
+    is-glob "^3.1.0"
+    path-dirname "^1.0.0"
+
+glob-stream@^5.3.2:
+  version "5.3.5"
+  resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-5.3.5.tgz#a55665a9a8ccdc41915a87c701e32d4e016fad22"
+  dependencies:
+    extend "^3.0.0"
+    glob "^5.0.3"
+    glob-parent "^3.0.0"
+    micromatch "^2.3.7"
+    ordered-read-streams "^0.3.0"
+    through2 "^0.6.0"
+    to-absolute-glob "^0.1.1"
+    unique-stream "^2.0.2"
+
+glob@^5.0.3:
+  version "5.0.15"
+  resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1"
+  dependencies:
+    inflight "^1.0.4"
+    inherits "2"
+    minimatch "2 || 3"
+    once "^1.3.0"
+    path-is-absolute "^1.0.0"
+
 glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.0, glob@^7.1.1, glob@~7.1.1:
   version "7.1.2"
   resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
@@ -2408,6 +3016,16 @@ globby@^5.0.0:
     pify "^2.0.0"
     pinkie-promise "^2.0.0"
 
+globby@^6.1.0:
+  version "6.1.0"
+  resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c"
+  dependencies:
+    array-union "^1.0.1"
+    glob "^7.0.3"
+    object-assign "^4.0.1"
+    pify "^2.0.0"
+    pinkie-promise "^2.0.0"
+
 globule@^1.0.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.0.tgz#1dc49c6822dd9e8a2fa00ba2a295006e8664bd09"
@@ -2416,7 +3034,33 @@ globule@^1.0.0:
     lodash "~4.17.4"
     minimatch "~3.0.2"
 
-graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9:
+glogg@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.0.tgz#7fe0f199f57ac906cf512feead8f90ee4a284fc5"
+  dependencies:
+    sparkles "^1.0.0"
+
+got@^5.0.0:
+  version "5.7.1"
+  resolved "https://registry.yarnpkg.com/got/-/got-5.7.1.tgz#5f81635a61e4a6589f180569ea4e381680a51f35"
+  dependencies:
+    create-error-class "^3.0.1"
+    duplexer2 "^0.1.4"
+    is-redirect "^1.0.0"
+    is-retry-allowed "^1.0.0"
+    is-stream "^1.0.0"
+    lowercase-keys "^1.0.0"
+    node-status-codes "^1.0.0"
+    object-assign "^4.0.1"
+    parse-json "^2.1.0"
+    pinkie-promise "^2.0.0"
+    read-all-stream "^3.0.0"
+    readable-stream "^2.0.5"
+    timed-out "^3.0.0"
+    unzip-response "^1.0.2"
+    url-parse-lax "^1.0.0"
+
+graceful-fs@^4.0.0, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9:
   version "4.1.11"
   resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
 
@@ -2424,6 +3068,64 @@ graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725"
 
+gulp-decompress@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/gulp-decompress/-/gulp-decompress-1.2.0.tgz#8eeb65a5e015f8ed8532cafe28454960626f0dc7"
+  dependencies:
+    archive-type "^3.0.0"
+    decompress "^3.0.0"
+    gulp-util "^3.0.1"
+    readable-stream "^2.0.2"
+
+gulp-rename@^1.2.0:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/gulp-rename/-/gulp-rename-1.2.2.tgz#3ad4428763f05e2764dec1c67d868db275687817"
+
+gulp-sourcemaps@1.6.0:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz#b86ff349d801ceb56e1d9e7dc7bbcb4b7dee600c"
+  dependencies:
+    convert-source-map "^1.1.1"
+    graceful-fs "^4.1.2"
+    strip-bom "^2.0.0"
+    through2 "^2.0.0"
+    vinyl "^1.0.0"
+
+gulp-util@^3.0.1:
+  version "3.0.8"
+  resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f"
+  dependencies:
+    array-differ "^1.0.0"
+    array-uniq "^1.0.2"
+    beeper "^1.0.0"
+    chalk "^1.0.0"
+    dateformat "^2.0.0"
+    fancy-log "^1.1.0"
+    gulplog "^1.0.0"
+    has-gulplog "^0.1.0"
+    lodash._reescape "^3.0.0"
+    lodash._reevaluate "^3.0.0"
+    lodash._reinterpolate "^3.0.0"
+    lodash.template "^3.0.0"
+    minimist "^1.1.0"
+    multipipe "^0.1.2"
+    object-assign "^3.0.0"
+    replace-ext "0.0.1"
+    through2 "^2.0.0"
+    vinyl "^0.5.0"
+
+gulplog@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/gulplog/-/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5"
+  dependencies:
+    glogg "^1.0.0"
+
+gzip-size@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-3.0.0.tgz#546188e9bdc337f673772f81660464b389dce520"
+  dependencies:
+    duplexer "^0.1.1"
+
 har-schema@^1.0.5:
   version "1.0.5"
   resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e"
@@ -2444,6 +3146,20 @@ har-validator@~4.2.1:
     ajv "^4.9.1"
     har-schema "^1.0.5"
 
+hard-source-webpack-plugin@^0.4.9:
+  version "0.4.9"
+  resolved "https://registry.yarnpkg.com/hard-source-webpack-plugin/-/hard-source-webpack-plugin-0.4.9.tgz#b26e404b81644f6b95bd7e245e88a25b0229ba98"
+  dependencies:
+    bluebird "^3.0.0"
+    level "^1.4.0"
+    lodash "^4.15.0"
+    mkdirp "^0.5.1"
+    node-object-hash "^1.2.0"
+    source-list-map "^0.1.6"
+    source-map "^0.5.6"
+    webpack-core "~0.6.0"
+    webpack-sources "^1.0.1"
+
 has-ansi@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
@@ -2464,6 +3180,12 @@ has-flag@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa"
 
+has-gulplog@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/has-gulplog/-/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce"
+  dependencies:
+    sparkles "^1.0.0"
+
 has-unicode@^2.0.0:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
@@ -2481,8 +3203,8 @@ hash-base@^2.0.0:
     inherits "^2.0.1"
 
 hash.js@^1.0.0, hash.js@^1.0.3:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.1.tgz#5cb2e796499224e69fd0b00ed01d2d4a16e7a323"
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846"
   dependencies:
     inherits "^2.0.3"
     minimalistic-assert "^1.0.0"
@@ -2527,8 +3249,8 @@ home-or-tmp@^2.0.0:
     os-tmpdir "^1.0.1"
 
 hosted-git-info@^2.1.4:
-  version "2.4.2"
-  resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.4.2.tgz#0076b9f46a270506ddbaaea56496897460612a67"
+  version "2.5.0"
+  resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c"
 
 html-comment-regex@^1.1.0:
   version "1.1.1"
@@ -2585,16 +3307,6 @@ iconv-lite@0.4.15, iconv-lite@~0.4.13:
   version "0.4.15"
   resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.15.tgz#fe265a218ac6a57cfe854927e9d04c19825eddeb"
 
-icss-replace-symbols@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded"
-
-icss-utils@^2.1.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-2.1.0.tgz#83f0a0ec378bf3246178b6c2ad9136f135b1c962"
-  dependencies:
-    postcss "^6.0.1"
-
 ieee754@^1.1.4:
   version "1.1.8"
   resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4"
@@ -2603,15 +3315,78 @@ ignore@^3.2.0:
   version "3.3.3"
   resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.3.tgz#432352e57accd87ab3110e82d3fea0e47812156d"
 
+image-webpack-loader@^3.3.1:
+  version "3.3.1"
+  resolved "https://registry.yarnpkg.com/image-webpack-loader/-/image-webpack-loader-3.3.1.tgz#d2d72be024f8975e48c984f2401c0c484897cbd3"
+  dependencies:
+    imagemin "^5.2.2"
+    imagemin-gifsicle "^5.1.0"
+    imagemin-mozjpeg "^6.0.0"
+    imagemin-optipng "^5.2.1"
+    imagemin-pngquant "^5.0.0"
+    imagemin-svgo "^5.2.1"
+    loader-utils "^1.1.0"
+    object-assign "^4.1.1"
+
+imagemin-gifsicle@^5.1.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/imagemin-gifsicle/-/imagemin-gifsicle-5.1.0.tgz#2e4ddcda2a109b221cabaec498e1e2dd28ca768f"
+  dependencies:
+    exec-buffer "^3.0.0"
+    gifsicle "^3.0.0"
+    is-gif "^1.0.0"
+
+imagemin-mozjpeg@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/imagemin-mozjpeg/-/imagemin-mozjpeg-6.0.0.tgz#71a32a457aa1b26117a68eeef2d9b190c2e5091e"
+  dependencies:
+    exec-buffer "^3.0.0"
+    is-jpg "^1.0.0"
+    mozjpeg "^4.0.0"
+
+imagemin-optipng@^5.2.1:
+  version "5.2.1"
+  resolved "https://registry.yarnpkg.com/imagemin-optipng/-/imagemin-optipng-5.2.1.tgz#d22da412c09f5ff00a4339960b98a88b1dbe8695"
+  dependencies:
+    exec-buffer "^3.0.0"
+    is-png "^1.0.0"
+    optipng-bin "^3.0.0"
+
+imagemin-pngquant@^5.0.0:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/imagemin-pngquant/-/imagemin-pngquant-5.0.1.tgz#d8a329da553afa226b11ce62debe0b7e37b439e6"
+  dependencies:
+    exec-buffer "^3.0.0"
+    is-png "^1.0.0"
+    pngquant-bin "^3.0.0"
+
+imagemin-svgo@^5.2.1:
+  version "5.2.2"
+  resolved "https://registry.yarnpkg.com/imagemin-svgo/-/imagemin-svgo-5.2.2.tgz#501699f5789730a57922b8736ea15c53f7b55838"
+  dependencies:
+    is-svg "^2.0.0"
+    svgo "^0.7.0"
+
+imagemin@^5.2.2:
+  version "5.3.1"
+  resolved "https://registry.yarnpkg.com/imagemin/-/imagemin-5.3.1.tgz#f19c2eee1e71ba6c6558c515f9fc96680189a6d4"
+  dependencies:
+    file-type "^4.1.0"
+    globby "^6.1.0"
+    make-dir "^1.0.0"
+    p-pipe "^1.1.0"
+    pify "^2.3.0"
+    replace-ext "^1.0.0"
+
 immutability-helper@^2.2.0:
   version "2.2.2"
   resolved "https://registry.yarnpkg.com/immutability-helper/-/immutability-helper-2.2.2.tgz#e7e9da728b3de2fad34a216f4157b326dbccc892"
   dependencies:
     invariant "^2.2.0"
 
-"imports-loader@git+https://github.com/webpack-contrib/imports-loader.git#44d6f48463b256a17c1ba6fd9b5cc1449b4e379d":
+imports-loader@^0.7.1:
   version "0.7.1"
-  resolved "git+https://github.com/webpack-contrib/imports-loader.git#44d6f48463b256a17c1ba6fd9b5cc1449b4e379d"
+  resolved "https://registry.yarnpkg.com/imports-loader/-/imports-loader-0.7.1.tgz#f204b5f34702a32c1db7d48d89d5e867a0441253"
   dependencies:
     loader-utils "^1.0.2"
     source-map "^0.5.6"
@@ -2715,10 +3490,24 @@ invert-kv@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
 
+ip-regex@^1.0.1:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-1.0.3.tgz#dc589076f659f419c222039a33316f1c7387effd"
+
+ipaddr.js@1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.3.0.tgz#1e03a52fdad83a8bbb2b25cbf4998b4cffcd3dec"
+
 is-absolute-url@^2.0.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6"
 
+is-absolute@^0.1.5:
+  version "0.1.7"
+  resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-0.1.7.tgz#847491119fccb5fb436217cc737f7faad50f603f"
+  dependencies:
+    is-relative "^0.1.0"
+
 is-arrayish@^0.2.1:
   version "0.2.1"
   resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
@@ -2739,6 +3528,10 @@ is-builtin-module@^1.0.0:
   dependencies:
     builtin-modules "^1.0.0"
 
+is-bzip2@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-bzip2/-/is-bzip2-1.0.0.tgz#5ee58eaa5a2e9c80e21407bedf23ae5ac091b3fc"
+
 is-callable@^1.1.1, is-callable@^1.1.2, is-callable@^1.1.3:
   version "1.1.3"
   resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2"
@@ -2757,7 +3550,7 @@ is-equal-shallow@^0.1.3:
   dependencies:
     is-primitive "^2.0.0"
 
-is-extendable@^0.1.1:
+is-extendable@^0.1.0, is-extendable@^0.1.1:
   version "0.1.1"
   resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
 
@@ -2765,6 +3558,10 @@ is-extglob@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0"
 
+is-extglob@^2.1.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+
 is-finite@^1.0.0:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa"
@@ -2781,12 +3578,30 @@ is-fullwidth-code-point@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
 
+is-gif@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-gif/-/is-gif-1.0.0.tgz#a6d2ae98893007bffa97a1d8c01d63205832097e"
+
 is-glob@^2.0.0, is-glob@^2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863"
   dependencies:
     is-extglob "^1.0.0"
 
+is-glob@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
+  dependencies:
+    is-extglob "^2.1.0"
+
+is-gzip@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-gzip/-/is-gzip-1.0.0.tgz#6ca8b07b99c77998025900e555ced8ed80879a83"
+
+is-jpg@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-jpg/-/is-jpg-1.0.0.tgz#2959c17e73430db38264da75b90dd54f2d86da1c"
+
 is-my-json-valid@^2.10.0, is-my-json-valid@^2.12.4:
   version "2.16.0"
   resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz#f079dd9bfdae65ee2038aae8acbc86ab109e3693"
@@ -2796,6 +3611,10 @@ is-my-json-valid@^2.10.0, is-my-json-valid@^2.12.4:
     jsonpointer "^4.0.0"
     xtend "^4.0.0"
 
+is-natural-number@^2.0.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-2.1.1.tgz#7d4c5728377ef386c3e194a9911bf57c6dc335e7"
+
 is-number@^0.1.1:
   version "0.1.1"
   resolved "https://registry.yarnpkg.com/is-number/-/is-number-0.1.1.tgz#69a7af116963d47206ec9bd9b48a14216f1e3806"
@@ -2812,6 +3631,10 @@ is-number@^3.0.0:
   dependencies:
     kind-of "^3.0.2"
 
+is-obj@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f"
+
 is-path-cwd@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d"
@@ -2838,6 +3661,10 @@ is-plain-object@^2.0.1:
   dependencies:
     isobject "^3.0.0"
 
+is-png@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-png/-/is-png-1.1.0.tgz#d574b12bf275c0350455570b0e5b57ab062077ce"
+
 is-posix-bracket@^0.1.0:
   version "0.1.1"
   resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4"
@@ -2850,19 +3677,31 @@ is-property@^1.0.0:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84"
 
+is-redirect@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24"
+
 is-regex@^1.0.3:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491"
   dependencies:
     has "^1.0.1"
 
+is-relative@^0.1.0:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-0.1.3.tgz#905fee8ae86f45b3ec614bc3c15c869df0876e82"
+
 is-resolvable@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.0.tgz#8df57c61ea2e3c501408d100fb013cf8d6e0cc62"
   dependencies:
     tryit "^1.0.1"
 
-is-stream@^1.0.1:
+is-retry-allowed@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34"
+
+is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
 
@@ -2880,14 +3719,34 @@ is-symbol@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572"
 
+is-tar@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-tar/-/is-tar-1.0.0.tgz#2f6b2e1792c1f5bb36519acaa9d65c0d26fe853d"
+
 is-typedarray@~1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
 
+is-url@^1.2.0:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.2.tgz#498905a593bf47cc2d9e7f738372bbf7696c7f26"
+
 is-utf8@^0.2.0:
   version "0.2.1"
   resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
 
+is-valid-glob@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-0.3.0.tgz#d4b55c69f51886f9b65c70d6c2622d37e29f48fe"
+
+is-windows@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.1.tgz#310db70f742d259a16a369202b51af84233310d9"
+
+is-zip@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-zip/-/is-zip-1.0.0.tgz#47b0a8ff4d38a76431ccfd99a8e15a4c86ba2325"
+
 isarray@0.0.1, isarray@~0.0.1:
   version "0.0.1"
   resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
@@ -2930,18 +3789,36 @@ jasmine-core@~2.5.2:
   resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-2.5.2.tgz#6f61bd79061e27f43e6f9355e44b3c6cab6ff297"
 
 jasmine-enzyme@^3.1.0:
-  version "3.2.0"
-  resolved "https://registry.yarnpkg.com/jasmine-enzyme/-/jasmine-enzyme-3.2.0.tgz#0eeb370d4fa965db03e04347ca9c4ed5a60fadc2"
+  version "3.4.0"
+  resolved "https://registry.yarnpkg.com/jasmine-enzyme/-/jasmine-enzyme-3.4.0.tgz#ed60f00cff4b403aaa714116fa36796a0b28319d"
+  dependencies:
+    enzyme-matchers "^3.4.0"
+
+jquery-contextmenu@1.6.7:
+  version "1.6.7"
+  resolved "https://registry.yarnpkg.com/jquery-contextmenu/-/jquery-contextmenu-1.6.7.tgz#e0d807d1bdca71c11bb82b95c1617dd2757278e5"
   dependencies:
-    enzyme-matchers "^3.2.0"
+    jquery ">=1.7.0"
+
+jquery-contextmenu@^2.5.0:
+  version "2.5.0"
+  resolved "https://registry.yarnpkg.com/jquery-contextmenu/-/jquery-contextmenu-2.5.0.tgz#940dbadbd0f2d7e0a0a8f1bbc5e71667d8257405"
 
-jquery-ui@>=1.8.0:
+jquery-mousewheel@~3.1.13:
+  version "3.1.13"
+  resolved "https://registry.yarnpkg.com/jquery-mousewheel/-/jquery-mousewheel-3.1.13.tgz#06f0335f16e353a695e7206bf50503cb523a6ee5"
+
+jquery-ui@>=1.8.0, jquery-ui@^1.12.1:
   version "1.12.1"
   resolved "https://registry.yarnpkg.com/jquery-ui/-/jquery-ui-1.12.1.tgz#bcb4045c8dd0539c134bc1488cdd3e768a7a9e51"
 
-jquery@>=1.8.0:
-  version "3.2.1"
-  resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.2.1.tgz#5c4d9de652af6cd0a770154a631bba12b015c787"
+jquery@1.11.1:
+  version "1.11.1"
+  resolved "https://registry.yarnpkg.com/jquery/-/jquery-1.11.1.tgz#b6ec928590112ebed69e1e49cbfd0025ccd60ddb"
+
+jquery@1.11.2, jquery@>=1.7.0, "jquery@>=1.7.1 <4.0.0", jquery@>=1.8.0, jquery@>=1.9.0:
+  version "1.11.2"
+  resolved "https://registry.yarnpkg.com/jquery/-/jquery-1.11.2.tgz#30ab26857211c37caa83da0f6903155fe49bb72d"
 
 js-base64@^2.1.8, js-base64@^2.1.9:
   version "2.1.9"
@@ -2952,17 +3829,10 @@ js-string-escape@^1.0.0:
   resolved "https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz#e2625badbc0d67c7533e9edc1068c587ae4137ef"
 
 js-tokens@^3.0.0:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7"
-
-js-yaml@^3.5.1:
-  version "3.8.4"
-  resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.8.4.tgz#520b4564f86573ba96662af85a8cafa7b4b5a6f6"
-  dependencies:
-    argparse "^1.0.7"
-    esprima "^3.1.1"
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
 
-js-yaml@~3.7.0:
+js-yaml@^3.5.1, js-yaml@~3.7.0:
   version "3.7.0"
   resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80"
   dependencies:
@@ -2985,6 +3855,10 @@ json-loader@^0.5.4:
   version "0.5.4"
   resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.4.tgz#8baa1365a632f58a3c46d20175fc6002c96e37de"
 
+json-schema-traverse@^0.3.0:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340"
+
 json-schema@0.2.3:
   version "0.2.3"
   resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
@@ -3009,7 +3883,7 @@ json3@3.3.2:
   version "3.3.2"
   resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1"
 
-json5@^0.5.0:
+json5@^0.5.0, json5@^0.5.1:
   version "0.5.1"
   resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
 
@@ -3174,12 +4048,76 @@ lazy-cache@^1.0.3:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e"
 
+lazy-req@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/lazy-req/-/lazy-req-1.1.0.tgz#bdaebead30f8d824039ce0ce149d4daa07ba1fac"
+
+lazystream@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4"
+  dependencies:
+    readable-stream "^2.0.5"
+
 lcid@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
   dependencies:
     invert-kv "^1.0.0"
 
+level-codec@~6.1.0:
+  version "6.1.0"
+  resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-6.1.0.tgz#f5df0a99582f76dac43855151ab6f4e4d0d60045"
+
+level-errors@^1.0.3, level-errors@~1.0.3:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-1.0.4.tgz#3585e623974c737a93755492a43c0267cda4425f"
+  dependencies:
+    errno "~0.1.1"
+
+level-iterator-stream@~1.3.0:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz#e43b78b1a8143e6fa97a4f485eb8ea530352f2ed"
+  dependencies:
+    inherits "^2.0.1"
+    level-errors "^1.0.3"
+    readable-stream "^1.0.33"
+    xtend "^4.0.0"
+
+level-packager@~1.2.0:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-1.2.1.tgz#067fedfd072b7fe3c6bec6080c0cbd4a6b2e11f4"
+  dependencies:
+    levelup "~1.3.0"
+
+level@^1.4.0:
+  version "1.7.0"
+  resolved "https://registry.yarnpkg.com/level/-/level-1.7.0.tgz#43464a3a8ba73b2f3de56a24292805146da213a1"
+  dependencies:
+    level-packager "~1.2.0"
+    leveldown "~1.7.0"
+
+leveldown@~1.7.0:
+  version "1.7.2"
+  resolved "https://registry.yarnpkg.com/leveldown/-/leveldown-1.7.2.tgz#5e3467bb27ee246a4a7b8dbd8fb2b16206a6eb8b"
+  dependencies:
+    abstract-leveldown "~2.6.1"
+    bindings "~1.2.1"
+    fast-future "~1.0.2"
+    nan "~2.6.1"
+    prebuild-install "^2.1.0"
+
+levelup@~1.3.0:
+  version "1.3.8"
+  resolved "https://registry.yarnpkg.com/levelup/-/levelup-1.3.8.tgz#fb442c488efbea1043f7eb9929a792a74fbd1da6"
+  dependencies:
+    deferred-leveldown "~1.2.1"
+    level-codec "~6.1.0"
+    level-errors "~1.0.3"
+    level-iterator-stream "~1.3.0"
+    prr "~1.0.1"
+    semver "~5.1.0"
+    xtend "~4.0.0"
+
 levn@^0.3.0, levn@~0.3.0:
   version "0.3.0"
   resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
@@ -3207,7 +4145,7 @@ loader-runner@^2.3.0:
   version "2.3.0"
   resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2"
 
-loader-utils@^0.2.16, loader-utils@^0.2.5:
+loader-utils@^0.2.16, loader-utils@^0.2.5, loader-utils@~0.2.2:
   version "0.2.17"
   resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348"
   dependencies:
@@ -3216,7 +4154,7 @@ loader-utils@^0.2.16, loader-utils@^0.2.5:
     json5 "^0.5.0"
     object-assign "^4.0.1"
 
-loader-utils@^1.0.1, loader-utils@^1.0.2:
+loader-utils@^1.0.1, loader-utils@^1.0.2, loader-utils@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd"
   dependencies:
@@ -3224,6 +4162,10 @@ loader-utils@^1.0.1, loader-utils@^1.0.2:
     emojis-list "^2.0.0"
     json5 "^0.5.0"
 
+lodash._basecopy@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36"
+
 lodash._baseisequal@^3.0.0:
   version "3.0.7"
   resolved "https://registry.yarnpkg.com/lodash._baseisequal/-/lodash._baseisequal-3.0.7.tgz#d8025f76339d29342767dcc887ce5cb95a5b51f1"
@@ -3232,6 +4174,14 @@ lodash._baseisequal@^3.0.0:
     lodash.istypedarray "^3.0.0"
     lodash.keys "^3.0.0"
 
+lodash._basetostring@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5"
+
+lodash._basevalues@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7"
+
 lodash._bindcallback@^3.0.0:
   version "3.0.1"
   resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e"
@@ -3240,6 +4190,26 @@ lodash._getnative@^3.0.0:
   version "3.9.1"
   resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5"
 
+lodash._isiterateecall@^3.0.0:
+  version "3.0.9"
+  resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c"
+
+lodash._reescape@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/lodash._reescape/-/lodash._reescape-3.0.0.tgz#2b1d6f5dfe07c8a355753e5f27fac7f1cde1616a"
+
+lodash._reevaluate@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz#58bc74c40664953ae0b124d806996daca431e2ed"
+
+lodash._reinterpolate@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d"
+
+lodash._root@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692"
+
 lodash.assign@^4.2.0:
   version "4.2.0"
   resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7"
@@ -3252,10 +4222,6 @@ lodash.bind@^4.1.4:
   version "4.2.1"
   resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-4.2.1.tgz#7ae3017e939622ac31b7d7d7dcb1b34db1690d35"
 
-lodash.camelcase@^4.3.0:
-  version "4.3.0"
-  resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6"
-
 lodash.clonedeep@^4.3.2:
   version "4.5.0"
   resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef"
@@ -3264,6 +4230,12 @@ lodash.defaults@^4.0.1:
   version "4.2.0"
   resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c"
 
+lodash.escape@^3.0.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698"
+  dependencies:
+    lodash._root "^3.0.0"
+
 lodash.filter@^4.4.0:
   version "4.6.0"
   resolved "https://registry.yarnpkg.com/lodash.filter/-/lodash.filter-4.6.0.tgz#668b1d4981603ae1cc5a6fa760143e480b4c4ace"
@@ -3291,6 +4263,10 @@ lodash.isequal@^3.0:
     lodash._baseisequal "^3.0.0"
     lodash._bindcallback "^3.0.0"
 
+lodash.isequal@^4.0.0:
+  version "4.5.0"
+  resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0"
+
 lodash.istypedarray@^3.0.0:
   version "3.0.6"
   resolved "https://registry.yarnpkg.com/lodash.istypedarray/-/lodash.istypedarray-3.0.6.tgz#c9a477498607501d8e8494d283b87c39281cef62"
@@ -3335,6 +4311,10 @@ lodash.reject@^4.4.0:
   version "4.6.0"
   resolved "https://registry.yarnpkg.com/lodash.reject/-/lodash.reject-4.6.0.tgz#80d6492dc1470864bbf583533b651f42a9f52415"
 
+lodash.restparam@^3.0.0:
+  version "3.6.1"
+  resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805"
+
 lodash.some@^4.4.0:
   version "4.6.0"
   resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d"
@@ -3343,6 +4323,27 @@ lodash.tail@^4.1.1:
   version "4.1.1"
   resolved "https://registry.yarnpkg.com/lodash.tail/-/lodash.tail-4.1.1.tgz#d2333a36d9e7717c8ad2f7cacafec7c32b444664"
 
+lodash.template@^3.0.0:
+  version "3.6.2"
+  resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f"
+  dependencies:
+    lodash._basecopy "^3.0.0"
+    lodash._basetostring "^3.0.0"
+    lodash._basevalues "^3.0.0"
+    lodash._isiterateecall "^3.0.0"
+    lodash._reinterpolate "^3.0.0"
+    lodash.escape "^3.0.0"
+    lodash.keys "^3.0.0"
+    lodash.restparam "^3.0.0"
+    lodash.templatesettings "^3.0.0"
+
+lodash.templatesettings@^3.0.0:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5"
+  dependencies:
+    lodash._reinterpolate "^3.0.0"
+    lodash.escape "^3.0.0"
+
 lodash.uniq@^4.5.0:
   version "4.5.0"
   resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
@@ -3351,7 +4352,7 @@ lodash@^3.10.1, lodash@^3.8.0:
   version "3.10.1"
   resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6"
 
-lodash@^4.0.0, lodash@^4.0.1, lodash@^4.14.0, lodash@^4.17.2, lodash@^4.2.0, lodash@^4.3.0, lodash@^4.5.0, lodash@~4.17.4:
+lodash@^4.0.0, lodash@^4.0.1, lodash@^4.14.0, lodash@^4.14.1, lodash@^4.15.0, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.3.0, lodash@^4.5.0, lodash@~4.17.4:
   version "4.17.4"
   resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
 
@@ -3362,7 +4363,14 @@ log4js@^0.6.31:
     readable-stream "~1.0.2"
     semver "~4.3.3"
 
-longest@^1.0.1:
+logalot@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/logalot/-/logalot-2.1.0.tgz#5f8e8c90d304edf12530951a5554abb8c5e3f552"
+  dependencies:
+    figures "^1.3.5"
+    squeak "^1.0.0"
+
+longest@^1.0.0, longest@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
 
@@ -3379,6 +4387,19 @@ loud-rejection@^1.0.0:
     currently-unhandled "^0.4.1"
     signal-exit "^3.0.0"
 
+lowercase-keys@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306"
+
+lpad-align@^1.0.1:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/lpad-align/-/lpad-align-1.1.2.tgz#21f600ac1c3095c3c6e497ee67271ee08481fe9e"
+  dependencies:
+    get-stdin "^4.0.1"
+    indent-string "^2.1.0"
+    longest "^1.0.0"
+    meow "^3.3.0"
+
 lru-cache@2.2.x:
   version "2.2.4"
   resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.2.4.tgz#6c658619becf14031d0d0b594b16042ce4dc063d"
@@ -3390,10 +4411,20 @@ lru-cache@^4.0.1:
     pseudomap "^1.0.2"
     yallist "^2.1.2"
 
+lunr@^0.7.0:
+  version "0.7.2"
+  resolved "https://registry.yarnpkg.com/lunr/-/lunr-0.7.2.tgz#79a30e932e216cba163541ee37a3607c12cd7281"
+
 macaddress@^0.2.8:
   version "0.2.8"
   resolved "https://registry.yarnpkg.com/macaddress/-/macaddress-0.2.8.tgz#5904dc537c39ec6dbefeae902327135fa8511f12"
 
+make-dir@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.0.0.tgz#97a011751e91dd87cfadef58832ebb04936de978"
+  dependencies:
+    pify "^2.3.0"
+
 map-obj@^1.0.0, map-obj@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d"
@@ -3413,7 +4444,7 @@ memory-fs@^0.4.0, memory-fs@~0.4.1:
     errno "^0.1.3"
     readable-stream "^2.0.1"
 
-meow@^3.7.0:
+meow@^3.1.0, meow@^3.3.0, meow@^3.5.0, meow@^3.7.0:
   version "3.7.0"
   resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb"
   dependencies:
@@ -3428,7 +4459,21 @@ meow@^3.7.0:
     redent "^1.0.0"
     trim-newlines "^1.0.0"
 
-micromatch@^2.1.5:
+merge-descriptors@1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
+
+merge-stream@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1"
+  dependencies:
+    readable-stream "^2.0.1"
+
+methods@~1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
+
+micromatch@^2.1.5, micromatch@^2.3.7:
   version "2.3.11"
   resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565"
   dependencies:
@@ -3463,7 +4508,11 @@ mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.15, mime-types@~2.1.7:
   dependencies:
     mime-db "~1.27.0"
 
-mime@^1.3.4:
+mime@1.3.4:
+  version "1.3.4"
+  resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53"
+
+mime@1.3.x, mime@^1.3.4:
   version "1.3.6"
   resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.6.tgz#591d84d3653a6b0b4a3b9df8de5aa8108e72e5e0"
 
@@ -3475,7 +4524,7 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
 
-minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.2:
+"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.2:
   version "3.0.4"
   resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
   dependencies:
@@ -3532,6 +4581,14 @@ moment@^2.18.1:
   version "2.18.1"
   resolved "https://registry.yarnpkg.com/moment/-/moment-2.18.1.tgz#c36193dd3ce1c2eed2adb7c802dbbc77a81b1c0f"
 
+mozjpeg@^4.0.0:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/mozjpeg/-/mozjpeg-4.1.1.tgz#859030b24f689a53db9b40f0160d89195b88fd50"
+  dependencies:
+    bin-build "^2.0.0"
+    bin-wrapper "^3.0.0"
+    logalot "^2.0.0"
+
 ms@0.7.1:
   version "0.7.1"
   resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098"
@@ -3544,11 +4601,17 @@ ms@2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
 
+multipipe@^0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b"
+  dependencies:
+    duplexer2 "0.0.2"
+
 mute-stream@0.0.5:
   version "0.0.5"
   resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0"
 
-nan@^2.3.0, nan@^2.3.2:
+nan@^2.3.0, nan@^2.3.2, nan@~2.6.1:
   version "2.6.2"
   resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45"
 
@@ -3560,6 +4623,10 @@ negotiator@0.6.1:
   version "0.6.1"
   resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9"
 
+node-abi@^2.0.0:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.0.3.tgz#0ca67e5e667b8e1343549ca17153a815d0bbfdaa"
+
 node-fetch@^1.0.1:
   version "1.7.1"
   resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.1.tgz#899cb3d0a3c92f952c47f1b876f4c8aeabd400d5"
@@ -3613,6 +4680,10 @@ node-libs-browser@^2.0.0:
     util "^0.10.3"
     vm-browserify "0.0.4"
 
+node-object-hash@^1.2.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/node-object-hash/-/node-object-hash-1.3.0.tgz#7f294f5afec6b08d713e40d40a95ec793e05baf3"
+
 node-pre-gyp@^0.6.36:
   version "0.6.36"
   resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.36.tgz#db604112cb74e0d477554e9b505b17abddfab786"
@@ -3650,6 +4721,14 @@ node-sass@^4.5.3:
     sass-graph "^2.1.1"
     stdout-stream "^1.4.0"
 
+node-status-codes@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/node-status-codes/-/node-status-codes-1.0.0.tgz#5ae5541d024645d32a58fcddc9ceecea7ae3ac2f"
+
+noop-logger@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2"
+
 "nopt@2 || 3":
   version "3.0.6"
   resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
@@ -3691,7 +4770,13 @@ normalize-url@^1.4.0:
     query-string "^4.1.0"
     sort-keys "^1.0.0"
 
-"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2:
+npm-run-path@^2.0.0:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
+  dependencies:
+    path-key "^2.0.0"
+
+"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.1, npmlog@^4.0.2:
   version "4.1.0"
   resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.0.tgz#dc59bee85f64f00ed424efb2af0783df25d1c0b5"
   dependencies:
@@ -3722,7 +4807,15 @@ object-assign@4.1.0:
   version "4.1.0"
   resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0"
 
-object-assign@^4.0.0, object-assign@^4.0.1, object-assign@^4.1.0:
+object-assign@^2.0.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-2.1.1.tgz#43c36e5d569ff8e4816c4efa8be02d26967c18aa"
+
+object-assign@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2"
+
+object-assign@^4.0.0, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1:
   version "4.1.1"
   resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
 
@@ -3777,16 +4870,26 @@ on-finished@~2.3.0:
   dependencies:
     ee-first "1.1.1"
 
-once@^1.3.0, once@^1.3.3:
+once@^1.3.0, once@^1.3.1, once@^1.3.3, once@^1.4.0:
   version "1.4.0"
   resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
   dependencies:
     wrappy "1"
 
-onetime@^1.0.0:
+once@~1.3.0:
+  version "1.3.3"
+  resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20"
+  dependencies:
+    wrappy "1"
+
+onetime@^1.0.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789"
 
+opener@^1.4.3:
+  version "1.4.3"
+  resolved "https://registry.yarnpkg.com/opener/-/opener-1.4.3.tgz#5c6da2c5d7e5831e8ffa3964950f8d6674ac90b8"
+
 optimist@^0.6.1:
   version "0.6.1"
   resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686"
@@ -3794,6 +4897,13 @@ optimist@^0.6.1:
     minimist "~0.0.1"
     wordwrap "~0.0.2"
 
+optimize-css-assets-webpack-plugin@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-2.0.0.tgz#51cae71230ec91a4c157649715e47498e0cb460b"
+  dependencies:
+    underscore "^1.8.3"
+    webpack-sources "^0.1.0"
+
 optionator@^0.8.2:
   version "0.8.2"
   resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64"
@@ -3809,6 +4919,21 @@ options@>=0.0.5:
   version "0.0.6"
   resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f"
 
+optipng-bin@^3.0.0:
+  version "3.1.4"
+  resolved "https://registry.yarnpkg.com/optipng-bin/-/optipng-bin-3.1.4.tgz#95d34f2c488704f6fd70606bfea0c659f1d95d84"
+  dependencies:
+    bin-build "^2.0.0"
+    bin-wrapper "^3.0.0"
+    logalot "^2.0.0"
+
+ordered-read-streams@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz#7137e69b3298bb342247a1bbee3881c80e2fd78b"
+  dependencies:
+    is-stream "^1.0.1"
+    readable-stream "^2.0.1"
+
 os-browserify@^0.2.0:
   version "0.2.1"
   resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.2.1.tgz#63fc4ccee5d2d7763d26bbf8601078e6c2e0044f"
@@ -3817,9 +4942,13 @@ os-browserify@~0.1.1:
   version "0.1.2"
   resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.1.2.tgz#49ca0293e0b19590a5f5de10c7f265a617d8fe54"
 
-os-homedir@^1.0.0:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
+os-filter-obj@^1.0.0:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/os-filter-obj/-/os-filter-obj-1.0.3.tgz#5915330d90eced557d2d938a31c6dd214d9c63ad"
+
+os-homedir@^1.0.0, os-homedir@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.1.tgz#0d62bdf44b916fd3bbdcf2cab191948fb094f007"
 
 os-locale@^1.4.0:
   version "1.4.0"
@@ -3848,6 +4977,14 @@ outpipe@^1.1.0:
   dependencies:
     shell-quote "^1.4.2"
 
+p-finally@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
+
+p-pipe@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/p-pipe/-/p-pipe-1.1.0.tgz#2e9dc7cc57ce67d2ce2db348ca03f28731854075"
+
 pako@~0.2.0:
   version "0.2.9"
   resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75"
@@ -3877,7 +5014,7 @@ parse-glob@^3.0.4:
     is-extglob "^1.0.0"
     is-glob "^2.0.0"
 
-parse-json@^2.2.0:
+parse-json@^2.1.0, parse-json@^2.2.0:
   version "2.2.0"
   resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
   dependencies:
@@ -3909,6 +5046,10 @@ path-browserify@0.0.0, path-browserify@~0.0.0:
   version "0.0.0"
   resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a"
 
+path-dirname@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0"
+
 path-exists@^2.0.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b"
@@ -3923,6 +5064,10 @@ path-is-inside@^1.0.1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
 
+path-key@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
+
 path-parse@^1.0.5:
   version "1.0.5"
   resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1"
@@ -3931,6 +5076,10 @@ path-platform@~0.11.15:
   version "0.11.15"
   resolved "https://registry.yarnpkg.com/path-platform/-/path-platform-0.11.15.tgz#e864217f74c36850f0852b78dc7bf7d4a5721bf2"
 
+path-to-regexp@0.1.7:
+  version "0.1.7"
+  resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
+
 path-type@^1.0.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
@@ -3971,7 +5120,7 @@ phantomjs-prebuilt@^2.1.7:
     request-progress "~2.0.1"
     which "~1.2.10"
 
-pify@^2.0.0:
+pify@^2.0.0, pify@^2.3.0:
   version "2.3.0"
   resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
 
@@ -3999,6 +5148,14 @@ pluralize@^1.2.1:
   version "1.2.1"
   resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45"
 
+pngquant-bin@^3.0.0:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/pngquant-bin/-/pngquant-bin-3.1.1.tgz#d124d98a75a9487f40c1640b4dbfcbb2bd5a1fd1"
+  dependencies:
+    bin-build "^2.0.0"
+    bin-wrapper "^3.0.0"
+    logalot "^2.0.0"
+
 postcss-calc@^5.2.0:
   version "5.3.1"
   resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e"
@@ -4121,33 +5278,6 @@ postcss-minify-selectors@^2.0.4:
     postcss "^5.0.14"
     postcss-selector-parser "^2.0.0"
 
-postcss-modules-extract-imports@^1.0.0:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.0.tgz#66140ecece38ef06bf0d3e355d69bf59d141ea85"
-  dependencies:
-    postcss "^6.0.1"
-
-postcss-modules-local-by-default@^1.0.1:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069"
-  dependencies:
-    css-selector-tokenizer "^0.7.0"
-    postcss "^6.0.1"
-
-postcss-modules-scope@^1.0.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90"
-  dependencies:
-    css-selector-tokenizer "^0.7.0"
-    postcss "^6.0.1"
-
-postcss-modules-values@^1.1.0:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20"
-  dependencies:
-    icss-replace-symbols "^1.1.0"
-    postcss "^6.0.1"
-
 postcss-normalize-charset@^1.1.0:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz#ef9ee71212d7fe759c78ed162f61ed62b5cb93f1"
@@ -4228,7 +5358,7 @@ postcss-zindex@^2.0.1:
     postcss "^5.0.4"
     uniqs "^2.0.0"
 
-postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.6, postcss@^5.0.8, postcss@^5.2.16:
+postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.8, postcss@^5.2.16:
   version "5.2.17"
   resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.17.tgz#cf4f597b864d65c8a492b2eabe9d706c879c388b"
   dependencies:
@@ -4237,19 +5367,34 @@ postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0
     source-map "^0.5.6"
     supports-color "^3.2.3"
 
-postcss@^6.0.1:
-  version "6.0.2"
-  resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.2.tgz#5c4fea589f0ac3b00caa75b1cbc3a284195b7e5d"
+prebuild-install@^2.1.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-2.2.0.tgz#55934756a32bac8747390ca44ff663cee8b99b69"
   dependencies:
-    chalk "^1.1.3"
-    source-map "^0.5.6"
-    supports-color "^3.2.3"
+    expand-template "^1.0.2"
+    github-from-package "0.0.0"
+    minimist "^1.2.0"
+    mkdirp "^0.5.1"
+    node-abi "^2.0.0"
+    noop-logger "^0.1.1"
+    npmlog "^4.0.1"
+    os-homedir "^1.0.1"
+    pump "^1.0.1"
+    rc "^1.1.6"
+    simple-get "^1.4.2"
+    tar-fs "^1.13.0"
+    tunnel-agent "^0.6.0"
+    xtend "4.0.1"
+
+precond@^0.2.3:
+  version "0.2.3"
+  resolved "https://registry.yarnpkg.com/precond/-/precond-0.2.3.tgz#aa9591bcaa24923f1e0f4849d240f47efc1075ac"
 
 prelude-ls@~1.1.2:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
 
-prepend-http@^1.0.0:
+prepend-http@^1.0.0, prepend-http@^1.0.1:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
 
@@ -4286,10 +5431,21 @@ prop-types@^15.5.4, prop-types@^15.5.8:
     fbjs "^0.8.9"
     loose-envify "^1.3.1"
 
+proxy-addr@~1.1.4:
+  version "1.1.4"
+  resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-1.1.4.tgz#27e545f6960a44a627d9b44467e35c1b6b4ce2f3"
+  dependencies:
+    forwarded "~0.1.0"
+    ipaddr.js "1.3.0"
+
 prr@~0.0.0:
   version "0.0.0"
   resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a"
 
+prr@~1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
+
 pseudomap@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
@@ -4304,6 +5460,13 @@ public-encrypt@^4.0.0:
     parse-asn1 "^5.0.0"
     randombytes "^2.0.1"
 
+pump@^1.0.0, pump@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/pump/-/pump-1.0.2.tgz#3b3ee6512f94f0e575538c17995f9f16990a5d51"
+  dependencies:
+    end-of-stream "^1.1.0"
+    once "^1.3.1"
+
 punycode@1.3.2:
   version "1.3.2"
   resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
@@ -4356,7 +5519,7 @@ randombytes@^2.0.0, randombytes@^2.0.1:
   dependencies:
     safe-buffer "^5.1.0"
 
-range-parser@^1.0.3, range-parser@^1.2.0:
+range-parser@^1.0.3, range-parser@^1.2.0, range-parser@~1.2.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e"
 
@@ -4372,7 +5535,7 @@ raw-loader@^0.5.1:
   version "0.5.1"
   resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-0.5.1.tgz#0c3d0beaed8a01c966d9787bf778281252a979aa"
 
-rc@^1.1.7:
+rc@^1.1.2, rc@^1.1.6, rc@^1.1.7:
   version "1.2.1"
   resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95"
   dependencies:
@@ -4416,6 +5579,13 @@ react-style-proptype@^3.0.0:
     loose-envify "^1.1.0"
     object-assign "^4.1.0"
 
+read-all-stream@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/read-all-stream/-/read-all-stream-3.1.0.tgz#35c3e177f2078ef789ee4bfafa4373074eaef4fa"
+  dependencies:
+    pinkie-promise "^2.0.0"
+    readable-stream "^2.0.0"
+
 read-only-stream@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/read-only-stream/-/read-only-stream-2.0.0.tgz#2724fd6a8113d73764ac288d4386270c1dbf17f0"
@@ -4437,7 +5607,25 @@ read-pkg@^1.0.0:
     normalize-package-data "^2.3.2"
     path-type "^1.0.0"
 
-readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.6:
+"readable-stream@>=1.0.33-1 <1.1.0-0", readable-stream@~1.0.2:
+  version "1.0.34"
+  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c"
+  dependencies:
+    core-util-is "~1.0.0"
+    inherits "~2.0.1"
+    isarray "0.0.1"
+    string_decoder "~0.10.x"
+
+readable-stream@^1.0.33, readable-stream@~1.1.9:
+  version "1.1.14"
+  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
+  dependencies:
+    core-util-is "~1.0.0"
+    inherits "~2.0.1"
+    isarray "0.0.1"
+    string_decoder "~0.10.x"
+
+readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.6:
   version "2.3.1"
   resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.1.tgz#84e26965bb9e785535ed256e8d38e92c69f09d10"
   dependencies:
@@ -4449,15 +5637,6 @@ readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable
     string_decoder "~1.0.0"
     util-deprecate "~1.0.1"
 
-readable-stream@~1.0.2:
-  version "1.0.34"
-  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c"
-  dependencies:
-    core-util-is "~1.0.0"
-    inherits "~2.0.1"
-    isarray "0.0.1"
-    string_decoder "~0.10.x"
-
 readable-stream@~2.0.0:
   version "2.0.6"
   resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e"
@@ -4536,14 +5715,6 @@ regex-cache@^0.4.2:
     is-equal-shallow "^0.1.3"
     is-primitive "^2.0.0"
 
-regexpu-core@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b"
-  dependencies:
-    regenerate "^1.2.1"
-    regjsgen "^0.2.0"
-    regjsparser "^0.1.4"
-
 regexpu-core@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240"
@@ -4584,6 +5755,14 @@ repeating@^2.0.0:
   dependencies:
     is-finite "^1.0.0"
 
+replace-ext@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924"
+
+replace-ext@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb"
+
 request-progress@~2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-2.0.1.tgz#5d36bb57961c673aa5b788dbc8141fdf23b44e08"
@@ -4692,7 +5871,7 @@ right-align@^0.1.1:
   dependencies:
     align-text "^0.1.1"
 
-rimraf@2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.6.0, rimraf@^2.6.1:
+rimraf@2, rimraf@^2.2.6, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.5.4, rimraf@^2.6.0, rimraf@^2.6.1:
   version "2.6.1"
   resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d"
   dependencies:
@@ -4759,19 +5938,73 @@ scss-tokenizer@^0.2.3:
     js-base64 "^2.1.8"
     source-map "^0.4.2"
 
+seek-bzip@^1.0.3:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-1.0.5.tgz#cfe917cb3d274bcffac792758af53173eb1fabdc"
+  dependencies:
+    commander "~2.8.1"
+
+select2@^4.0.3:
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/select2/-/select2-4.0.3.tgz#207733fe91eacb9cb1a13f12463401f472449e0f"
+  dependencies:
+    almond "~0.3.1"
+    jquery-mousewheel "~3.1.13"
+
+semver-regex@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-1.0.0.tgz#92a4969065f9c70c694753d55248fc68f8f652c9"
+
+semver-truncate@^1.0.0:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/semver-truncate/-/semver-truncate-1.1.2.tgz#57f41de69707a62709a7e0104ba2117109ea47e8"
+  dependencies:
+    semver "^5.3.0"
+
 "semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@~5.3.0:
   version "5.3.0"
   resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
 
-semver@~4.3.3:
+semver@^4.0.3, semver@~4.3.3:
   version "4.3.6"
   resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da"
 
+semver@~5.1.0:
+  version "5.1.1"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-5.1.1.tgz#a3292a373e6f3e0798da0b20641b9a9c5bc47e19"
+
+send@0.15.3:
+  version "0.15.3"
+  resolved "https://registry.yarnpkg.com/send/-/send-0.15.3.tgz#5013f9f99023df50d1bd9892c19e3defd1d53309"
+  dependencies:
+    debug "2.6.7"
+    depd "~1.1.0"
+    destroy "~1.0.4"
+    encodeurl "~1.0.1"
+    escape-html "~1.0.3"
+    etag "~1.8.0"
+    fresh "0.5.0"
+    http-errors "~1.6.1"
+    mime "1.3.4"
+    ms "2.0.0"
+    on-finished "~2.3.0"
+    range-parser "~1.2.0"
+    statuses "~1.3.1"
+
+serve-static@1.12.3:
+  version "1.12.3"
+  resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.12.3.tgz#9f4ba19e2f3030c547f8af99107838ec38d5b1e2"
+  dependencies:
+    encodeurl "~1.0.1"
+    escape-html "~1.0.3"
+    parseurl "~1.3.1"
+    send "0.15.3"
+
 set-blocking@^2.0.0, set-blocking@~2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
 
-set-immediate-shim@^1.0.1:
+set-immediate-shim@^1.0.0, set-immediate-shim@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61"
 
@@ -4805,6 +6038,16 @@ shasum@^1.0.0:
     json-stable-stringify "~0.0.0"
     sha.js "~2.4.4"
 
+shebang-command@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
+  dependencies:
+    shebang-regex "^1.0.0"
+
+shebang-regex@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
+
 shell-quote@^1.4.2, shell-quote@^1.6.1:
   version "1.6.1"
   resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767"
@@ -4822,10 +6065,27 @@ shelljs@^0.7.5:
     interpret "^1.0.0"
     rechoir "^0.6.2"
 
+shim-loader@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/shim-loader/-/shim-loader-1.0.1.tgz#2583a6d2aa938897c2a41658bcef73ec87d3aa5e"
+  dependencies:
+    loader-utils "^1.1.0"
+    lodash "^4.14.1"
+    precond "^0.2.3"
+    webpack-sources "^0.2.3"
+
 signal-exit@^3.0.0:
   version "3.0.2"
   resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
 
+simple-get@^1.4.2:
+  version "1.4.3"
+  resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-1.4.3.tgz#e9755eda407e96da40c5e5158c9ea37b33becbeb"
+  dependencies:
+    once "^1.3.1"
+    unzip-response "^1.0.0"
+    xtend "^4.0.0"
+
 slash@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
@@ -4841,6 +6101,12 @@ slice-ansi@0.0.4:
     jquery ">=1.8.0"
     jquery-ui ">=1.8.0"
 
+snapsvg@^0.5.1:
+  version "0.5.1"
+  resolved "https://registry.yarnpkg.com/snapsvg/-/snapsvg-0.5.1.tgz#0caf52c79189a290746fc446cc5e863f6bdddfe3"
+  dependencies:
+    eve "~0.5.1"
+
 sntp@1.x.x:
   version "1.0.9"
   resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198"
@@ -4897,7 +6163,7 @@ sort-keys@^1.0.0:
   dependencies:
     is-plain-obj "^1.0.0"
 
-source-list-map@^0.1.7:
+source-list-map@^0.1.4, source-list-map@^0.1.6, source-list-map@~0.1.7:
   version "0.1.8"
   resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-0.1.8.tgz#c550b2ab5427f6b3f21f5afead88c4f5587b2106"
 
@@ -4915,6 +6181,12 @@ source-map-support@^0.4.2:
   dependencies:
     source-map "^0.5.6"
 
+source-map@0.4.x, source-map@^0.4.2, source-map@~0.4.1:
+  version "0.4.4"
+  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b"
+  dependencies:
+    amdefine ">=0.0.4"
+
 source-map@0.5.x, source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1, source-map@~0.5.3:
   version "0.5.6"
   resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412"
@@ -4925,11 +6197,9 @@ source-map@^0.1.41:
   dependencies:
     amdefine ">=0.0.4"
 
-source-map@^0.4.2:
-  version "0.4.4"
-  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b"
-  dependencies:
-    amdefine ">=0.0.4"
+sparkles@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.0.tgz#1acbbfb592436d10bbe8f785b7cc6f82815012c3"
 
 spdx-correct@~1.0.0:
   version "1.0.2"
@@ -4945,10 +6215,18 @@ spdx-license-ids@^1.0.2:
   version "1.2.2"
   resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57"
 
-sprintf-js@~1.0.2:
+sprintf-js@^1.0.3, sprintf-js@~1.0.2:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
 
+squeak@^1.0.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/squeak/-/squeak-1.3.0.tgz#33045037b64388b567674b84322a6521073916c3"
+  dependencies:
+    chalk "^1.0.0"
+    console-stream "^0.1.1"
+    lpad-align "^1.0.1"
+
 sshpk@^1.7.0:
   version "1.13.1"
   resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3"
@@ -4963,6 +6241,10 @@ sshpk@^1.7.0:
     jsbn "~0.1.0"
     tweetnacl "~0.14.0"
 
+stat-mode@^0.2.0:
+  version "0.2.2"
+  resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-0.2.2.tgz#e6c80b623123d7d80cf132ce538f346289072502"
+
 "statuses@>= 1.3.1 < 2", statuses@~1.3.1:
   version "1.3.1"
   resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e"
@@ -4997,6 +6279,10 @@ stream-http@^2.0.0, stream-http@^2.3.1:
     to-arraybuffer "^1.0.0"
     xtend "^4.0.0"
 
+stream-shift@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952"
+
 stream-splicer@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/stream-splicer/-/stream-splicer-2.0.0.tgz#1b63be438a133e4b671cc1935197600175910d83"
@@ -5017,21 +6303,21 @@ string-width@^1.0.1, string-width@^1.0.2:
     strip-ansi "^3.0.0"
 
 string-width@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.0.0.tgz#635c5436cc72a6e0c387ceca278d4e2eec52687e"
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.0.tgz#030664561fc146c9423ec7d978fe2457437fe6d0"
   dependencies:
     is-fullwidth-code-point "^2.0.0"
-    strip-ansi "^3.0.0"
+    strip-ansi "^4.0.0"
 
 string_decoder@^0.10.25, string_decoder@~0.10.0, string_decoder@~0.10.x:
   version "0.10.31"
   resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
 
 string_decoder@~1.0.0:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.2.tgz#b29e1f4e1125fa97a10382b8a533737b7491e179"
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab"
   dependencies:
-    safe-buffer "~5.0.1"
+    safe-buffer "~5.1.0"
 
 stringstream@~0.0.4:
   version "0.0.5"
@@ -5043,6 +6329,19 @@ strip-ansi@^3.0.0, strip-ansi@^3.0.1:
   dependencies:
     ansi-regex "^2.0.0"
 
+strip-ansi@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
+  dependencies:
+    ansi-regex "^3.0.0"
+
+strip-bom-stream@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz#e7144398577d51a6bed0fa1994fa05f43fd988ee"
+  dependencies:
+    first-chunk-stream "^1.0.0"
+    strip-bom "^2.0.0"
+
 strip-bom@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
@@ -5053,6 +6352,21 @@ strip-bom@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
 
+strip-dirs@^1.0.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/strip-dirs/-/strip-dirs-1.1.1.tgz#960bbd1287844f3975a4558aa103a8255e2456a0"
+  dependencies:
+    chalk "^1.0.0"
+    get-stdin "^4.0.1"
+    is-absolute "^0.1.5"
+    is-natural-number "^2.0.0"
+    minimist "^1.1.0"
+    sum-up "^1.0.1"
+
+strip-eof@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
+
 strip-indent@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2"
@@ -5063,6 +6377,12 @@ strip-json-comments@~2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
 
+strip-outer@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.0.tgz#aac0ba60d2e90c5d4f275fd8869fd9a2d310ffb8"
+  dependencies:
+    escape-string-regexp "^1.0.2"
+
 style-loader@^0.18.2:
   version "0.18.2"
   resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.18.2.tgz#cc31459afbcd6d80b7220ee54b291a9fd66ff5eb"
@@ -5076,6 +6396,12 @@ subarg@^1.0.0:
   dependencies:
     minimist "^1.1.0"
 
+sum-up@^1.0.1:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/sum-up/-/sum-up-1.0.3.tgz#1c661f667057f63bcb7875aa1438bc162525156e"
+  dependencies:
+    chalk "^1.0.0"
+
 supports-color@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
@@ -5119,6 +6445,15 @@ tapable@^0.2.5, tapable@~0.2.5:
   version "0.2.6"
   resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.6.tgz#206be8e188860b514425375e6f1ae89bfb01fd8d"
 
+tar-fs@^1.13.0:
+  version "1.15.3"
+  resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-1.15.3.tgz#eccf935e941493d8151028e636e51ce4c3ca7f20"
+  dependencies:
+    chownr "^1.0.1"
+    mkdirp "^0.5.1"
+    pump "^1.0.0"
+    tar-stream "^1.1.2"
+
 tar-pack@^3.4.0:
   version "3.4.0"
   resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.0.tgz#23be2d7f671a8339376cbdb0b8fe3fdebf317984"
@@ -5132,6 +6467,15 @@ tar-pack@^3.4.0:
     tar "^2.2.1"
     uid-number "^0.0.6"
 
+tar-stream@^1.1.1, tar-stream@^1.1.2:
+  version "1.5.4"
+  resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.5.4.tgz#36549cf04ed1aee9b2a30c0143252238daf94016"
+  dependencies:
+    bl "^1.0.0"
+    end-of-stream "^1.0.0"
+    readable-stream "^2.0.0"
+    xtend "^4.0.0"
+
 tar@^2.0.0, tar@^2.2.1:
   version "2.2.1"
   resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1"
@@ -5140,6 +6484,13 @@ tar@^2.0.0, tar@^2.2.1:
     fstream "^1.0.2"
     inherits "2"
 
+tempfile@^1.0.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/tempfile/-/tempfile-1.1.1.tgz#5bcc4eaecc4ab2c707d8bc11d99ccc9a2cb287f2"
+  dependencies:
+    os-tmpdir "^1.0.0"
+    uuid "^2.0.1"
+
 text-table@~0.2.0:
   version "0.2.0"
   resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
@@ -5148,7 +6499,21 @@ throttleit@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c"
 
-through2@^2.0.0:
+through2-filter@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-2.0.0.tgz#60bc55a0dacb76085db1f9dae99ab43f83d622ec"
+  dependencies:
+    through2 "~2.0.0"
+    xtend "~4.0.0"
+
+through2@^0.6.0, through2@^0.6.1:
+  version "0.6.5"
+  resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48"
+  dependencies:
+    readable-stream ">=1.0.33-1 <1.1.0-0"
+    xtend ">=4.0.0 <4.1.0-0"
+
+through2@^2.0.0, through2@~2.0.0:
   version "2.0.3"
   resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be"
   dependencies:
@@ -5159,6 +6524,14 @@ through2@^2.0.0:
   version "2.3.8"
   resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
 
+time-stamp@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3"
+
+timed-out@^3.0.0:
+  version "3.1.3"
+  resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-3.1.3.tgz#95860bfcc5c76c277f8f8326fd0f5b2e20eba217"
+
 timers-browserify@^1.0.1:
   version "1.4.2"
   resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-1.4.2.tgz#c9c58b575be8407375cb5e2462dacee74359f41d"
@@ -5177,6 +6550,12 @@ tmp@0.0.31, tmp@0.0.x:
   dependencies:
     os-tmpdir "~1.0.1"
 
+to-absolute-glob@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz#1cdfa472a9ef50c239ee66999b662ca0eb39937f"
+  dependencies:
+    extend-shallow "^2.0.1"
+
 to-array@0.1.4:
   version "0.1.4"
   resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890"
@@ -5199,6 +6578,12 @@ trim-newlines@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613"
 
+trim-repeated@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/trim-repeated/-/trim-repeated-1.0.0.tgz#e3646a2ea4e891312bf7eace6cfb05380bc01c21"
+  dependencies:
+    escape-string-regexp "^1.0.2"
+
 trim-right@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
@@ -5211,16 +6596,16 @@ tty-browserify@0.0.0, tty-browserify@~0.0.0:
   version "0.0.0"
   resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
 
+tunnel-agent@^0.4.0, tunnel-agent@~0.4.1:
+  version "0.4.3"
+  resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb"
+
 tunnel-agent@^0.6.0:
   version "0.6.0"
   resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
   dependencies:
     safe-buffer "^5.0.1"
 
-tunnel-agent@~0.4.1:
-  version "0.4.3"
-  resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb"
-
 tweetnacl@^0.14.3, tweetnacl@~0.14.0:
   version "0.14.5"
   resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
@@ -5243,10 +6628,10 @@ typedarray@~0.0.5:
   resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
 
 ua-parser-js@^0.7.9:
-  version "0.7.12"
-  resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.12.tgz#04c81a99bdd5dc52263ea29d24c6bf8d4818a4bb"
+  version "0.7.13"
+  resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.13.tgz#cd9dd2f86493b3f44dbeeef3780fda74c5ee14be"
 
-uglify-js@^2.8.5:
+uglify-js@^2.8.29:
   version "2.8.29"
   resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd"
   dependencies:
@@ -5259,6 +6644,14 @@ uglify-to-browserify@~1.0.0:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7"
 
+uglifyjs-webpack-plugin@^0.4.4, uglifyjs-webpack-plugin@^0.4.6:
+  version "0.4.6"
+  resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz#b951f4abb6bd617e66f63eb891498e391763e309"
+  dependencies:
+    source-map "^0.5.6"
+    uglify-js "^2.8.29"
+    webpack-sources "^1.0.1"
+
 uid-number@^0.0.6:
   version "0.0.6"
   resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81"
@@ -5267,11 +6660,22 @@ ultron@1.0.x:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa"
 
+ultron@~1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.0.tgz#b07a2e6a541a815fc6a34ccd4533baec307ca864"
+
 umd@^3.0.0:
   version "3.0.1"
   resolved "https://registry.yarnpkg.com/umd/-/umd-3.0.1.tgz#8ae556e11011f63c2596708a8837259f01b3d60e"
 
-underscore@~1.8.3:
+underscore.string@^3.3.4:
+  version "3.3.4"
+  resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.4.tgz#2c2a3f9f83e64762fdc45e6ceac65142864213db"
+  dependencies:
+    sprintf-js "^1.0.3"
+    util-deprecate "^1.0.2"
+
+underscore@>=1.5.0, underscore@>=1.7.0, underscore@^1.8.0, underscore@^1.8.3:
   version "1.8.3"
   resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022"
 
@@ -5289,10 +6693,40 @@ uniqs@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02"
 
+unique-stream@^2.0.2:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.2.1.tgz#5aa003cfbe94c5ff866c4e7d668bb1c4dbadb369"
+  dependencies:
+    json-stable-stringify "^1.0.0"
+    through2-filter "^2.0.0"
+
 unpipe@1.0.0, unpipe@~1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
 
+unzip-response@^1.0.0, unzip-response@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-1.0.2.tgz#b984f0877fc0a89c2c773cc1ef7b5b232b5b06fe"
+
+url-loader@^0.5.9:
+  version "0.5.9"
+  resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-0.5.9.tgz#cc8fea82c7b906e7777019250869e569e995c295"
+  dependencies:
+    loader-utils "^1.0.2"
+    mime "1.3.x"
+
+url-parse-lax@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73"
+  dependencies:
+    prepend-http "^1.0.1"
+
+url-regex@^3.0.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/url-regex/-/url-regex-3.2.0.tgz#dbad1e0c9e29e105dd0b1f09f6862f7fdb482724"
+  dependencies:
+    ip-regex "^1.0.1"
+
 url@^0.11.0, url@~0.11.0:
   version "0.11.0"
   resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
@@ -5313,7 +6747,7 @@ useragent@^2.1.12:
     lru-cache "2.2.x"
     tmp "0.0.x"
 
-util-deprecate@~1.0.1:
+util-deprecate@^1.0.2, util-deprecate@~1.0.1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
 
@@ -5327,7 +6761,7 @@ utils-merge@1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8"
 
-uuid@^2.0.3:
+uuid@^2.0.1, uuid@^2.0.3:
   version "2.0.3"
   resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a"
 
@@ -5335,6 +6769,10 @@ uuid@^3.0.0:
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04"
 
+vali-date@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/vali-date/-/vali-date-1.0.0.tgz#1b904a59609fb328ef078138420934f6b86709a6"
+
 validate-npm-package-license@^3.0.1:
   version "3.0.1"
   resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc"
@@ -5342,6 +6780,10 @@ validate-npm-package-license@^3.0.1:
     spdx-correct "~1.0.0"
     spdx-expression-parse "~1.0.0"
 
+vary@~1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.1.tgz#67535ebb694c1d52257457984665323f587e8d37"
+
 vendors@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.1.tgz#37ad73c8ee417fb3d580e785312307d274847f22"
@@ -5352,6 +6794,58 @@ verror@1.3.6:
   dependencies:
     extsprintf "1.0.2"
 
+vinyl-assign@^1.0.1:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/vinyl-assign/-/vinyl-assign-1.2.1.tgz#4d198891b5515911d771a8cd9c5480a46a074a45"
+  dependencies:
+    object-assign "^4.0.1"
+    readable-stream "^2.0.0"
+
+vinyl-fs@^2.2.0:
+  version "2.4.4"
+  resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-2.4.4.tgz#be6ff3270cb55dfd7d3063640de81f25d7532239"
+  dependencies:
+    duplexify "^3.2.0"
+    glob-stream "^5.3.2"
+    graceful-fs "^4.0.0"
+    gulp-sourcemaps "1.6.0"
+    is-valid-glob "^0.3.0"
+    lazystream "^1.0.0"
+    lodash.isequal "^4.0.0"
+    merge-stream "^1.0.0"
+    mkdirp "^0.5.0"
+    object-assign "^4.0.0"
+    readable-stream "^2.0.4"
+    strip-bom "^2.0.0"
+    strip-bom-stream "^1.0.0"
+    through2 "^2.0.0"
+    through2-filter "^2.0.0"
+    vali-date "^1.0.0"
+    vinyl "^1.0.0"
+
+vinyl@^0.4.3:
+  version "0.4.6"
+  resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.4.6.tgz#2f356c87a550a255461f36bbeb2a5ba8bf784847"
+  dependencies:
+    clone "^0.2.0"
+    clone-stats "^0.0.1"
+
+vinyl@^0.5.0:
+  version "0.5.3"
+  resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.5.3.tgz#b0455b38fc5e0cf30d4325132e461970c2091cde"
+  dependencies:
+    clone "^1.0.0"
+    clone-stats "^0.0.1"
+    replace-ext "0.0.1"
+
+vinyl@^1.0.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-1.2.0.tgz#5c88036cf565e5df05558bfc911f8656df218884"
+  dependencies:
+    clone "^1.0.0"
+    clone-stats "^0.0.1"
+    replace-ext "0.0.1"
+
 vm-browserify@0.0.4, vm-browserify@~0.0.1:
   version "0.0.4"
   resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73"
@@ -5362,6 +6856,12 @@ void-elements@^2.0.0:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec"
 
+ware@^1.2.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/ware/-/ware-1.3.0.tgz#d1b14f39d2e2cb4ab8c4098f756fe4b164e473d4"
+  dependencies:
+    wrap-fn "^0.1.0"
+
 watchify@~3.9.0:
   version "3.9.0"
   resolved "https://registry.yarnpkg.com/watchify/-/watchify-3.9.0.tgz#f075fd2e8a86acde84cedba6e5c2a0bedd523d9e"
@@ -5382,15 +6882,54 @@ watchpack@^1.3.1:
     chokidar "^1.4.3"
     graceful-fs "^4.1.2"
 
+webcabin-docker@^2.2.2:
+  version "2.2.2"
+  resolved "https://registry.yarnpkg.com/webcabin-docker/-/webcabin-docker-2.2.2.tgz#ff5e4bb48278b4219c0951d1f4db6456659bed2a"
+  dependencies:
+    FileSaver "0.10.0"
+    font-awesome "4.6.3"
+    jquery "1.11.1"
+    jquery-contextmenu "1.6.7"
+
+webpack-bundle-analyzer@^2.8.2:
+  version "2.8.2"
+  resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-2.8.2.tgz#8b6240c29a9d63bc72f09d920fb050adbcce9fe8"
+  dependencies:
+    acorn "^5.0.3"
+    chalk "^1.1.3"
+    commander "^2.9.0"
+    ejs "^2.5.6"
+    express "^4.15.2"
+    filesize "^3.5.9"
+    gzip-size "^3.0.0"
+    lodash "^4.17.4"
+    mkdirp "^0.5.1"
+    opener "^1.4.3"
+    ws "^2.3.1"
+
+webpack-core@~0.6.0:
+  version "0.6.9"
+  resolved "https://registry.yarnpkg.com/webpack-core/-/webpack-core-0.6.9.tgz#fc571588c8558da77be9efb6debdc5a3b172bdc2"
+  dependencies:
+    source-list-map "~0.1.7"
+    source-map "~0.4.1"
+
 webpack-dev-middleware@^1.0.11:
-  version "1.10.2"
-  resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.10.2.tgz#2e252ce1dfb020dbda1ccb37df26f30ab014dbd1"
+  version "1.11.0"
+  resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.11.0.tgz#09691d0973a30ad1f82ac73a12e2087f0a4754f9"
   dependencies:
     memory-fs "~0.4.1"
     mime "^1.3.4"
     path-is-absolute "^1.0.0"
     range-parser "^1.0.3"
 
+webpack-sources@^0.1.0:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-0.1.5.tgz#aa1f3abf0f0d74db7111c40e500b84f966640750"
+  dependencies:
+    source-list-map "~0.1.7"
+    source-map "~0.5.3"
+
 webpack-sources@^0.2.3:
   version "0.2.3"
   resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-0.2.3.tgz#17c62bfaf13c707f9d02c479e0dcdde8380697fb"
@@ -5405,29 +6944,31 @@ webpack-sources@^1.0.1:
     source-list-map "^2.0.0"
     source-map "~0.5.3"
 
-webpack@~2.3.1:
-  version "2.3.3"
-  resolved "https://registry.yarnpkg.com/webpack/-/webpack-2.3.3.tgz#eecc083c18fb7bf958ea4f40b57a6640c5a0cc78"
+webpack@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/webpack/-/webpack-3.0.0.tgz#ee9bcebf21247f7153cb410168cab45e3a59d4d7"
   dependencies:
-    acorn "^4.0.4"
+    acorn "^5.0.0"
     acorn-dynamic-import "^2.0.0"
-    ajv "^4.7.0"
-    ajv-keywords "^1.1.1"
+    ajv "^5.1.5"
+    ajv-keywords "^2.0.0"
     async "^2.1.2"
     enhanced-resolve "^3.0.0"
+    escope "^3.6.0"
     interpret "^1.0.0"
     json-loader "^0.5.4"
+    json5 "^0.5.1"
     loader-runner "^2.3.0"
-    loader-utils "^0.2.16"
+    loader-utils "^1.1.0"
     memory-fs "~0.4.1"
     mkdirp "~0.5.0"
     node-libs-browser "^2.0.0"
     source-map "^0.5.3"
     supports-color "^3.1.0"
     tapable "~0.2.5"
-    uglify-js "^2.8.5"
+    uglifyjs-webpack-plugin "^0.4.4"
     watchpack "^1.3.1"
-    webpack-sources "^0.2.3"
+    webpack-sources "^1.0.1"
     yargs "^6.0.0"
 
 whatwg-fetch@>=0.10.0:
@@ -5477,6 +7018,12 @@ wrap-ansi@^2.0.0:
     string-width "^1.0.1"
     strip-ansi "^3.0.1"
 
+wrap-fn@^0.1.0:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/wrap-fn/-/wrap-fn-0.1.5.tgz#f21b6e41016ff4a7e31720dbc63a09016bdf9845"
+  dependencies:
+    co "3.1.0"
+
 wrappy@1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
@@ -5494,6 +7041,13 @@ ws@1.1.2:
     options ">=0.0.5"
     ultron "1.0.x"
 
+ws@^2.3.1:
+  version "2.3.1"
+  resolved "https://registry.yarnpkg.com/ws/-/ws-2.3.1.tgz#6b94b3e447cb6a363f785eaf94af6359e8e81c80"
+  dependencies:
+    safe-buffer "~5.0.1"
+    ultron "~1.1.0"
+
 wtf-8@1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/wtf-8/-/wtf-8-1.0.0.tgz#392d8ba2d0f1c34d1ee2d630f15d0efb68e1048a"
@@ -5502,7 +7056,7 @@ xmlhttprequest-ssl@1.5.3:
   version "1.5.3"
   resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz#185a888c04eca46c3e4070d99f7b49de3528992d"
 
-xtend@^4.0.0, xtend@~4.0.1:
+xtend@4.0.1, "xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@~4.0.0, xtend@~4.0.1:
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
 
@@ -5571,7 +7125,7 @@ yargs@~3.10.0:
     decamelize "^1.0.0"
     window-size "0.1.0"
 
-yauzl@2.4.1:
+yauzl@2.4.1, yauzl@^2.2.1:
   version "2.4.1"
   resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005"
   dependencies:
