You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by an...@apache.org on 2015/11/30 05:58:23 UTC

[2/5] ignite git commit: IGNITE-1936 implemented spa behavior to ignite console - Fixes #266.

http://git-wip-us.apache.org/repos/asf/ignite/blob/50856911/modules/control-center-web/src/main/js/gulpfile.js/index.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/gulpfile.js/index.js b/modules/control-center-web/src/main/js/gulpfile.js/index.js
index dfcf7e7..6e4f5de 100644
--- a/modules/control-center-web/src/main/js/gulpfile.js/index.js
+++ b/modules/control-center-web/src/main/js/gulpfile.js/index.js
@@ -23,4 +23,4 @@ requireDir('./tasks', { recurse: true });
 
 // Summary tasks
 gulp.task('default', ['build']);
-gulp.task('watch', ['build', 'sass:watch', 'jade:watch', 'copy:watch']);
+gulp.task('watch', ['build', 'bundle:watch', 'sass:watch', 'jade:watch', 'copy:watch']);

http://git-wip-us.apache.org/repos/asf/ignite/blob/50856911/modules/control-center-web/src/main/js/gulpfile.js/tasks/build.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/gulpfile.js/tasks/build.js b/modules/control-center-web/src/main/js/gulpfile.js/tasks/build.js
index 0930383..3f4cd61 100644
--- a/modules/control-center-web/src/main/js/gulpfile.js/tasks/build.js
+++ b/modules/control-center-web/src/main/js/gulpfile.js/tasks/build.js
@@ -16,8 +16,10 @@
  */
 
 var gulp = require('gulp');
-var gulpSequence = require('gulp-sequence');
+var sequence = require('gulp-sequence');
 
 gulp.task('build', function(cb) {
-    gulpSequence('clean', ['bundle', 'copy', 'jade', 'sass'], 'inject:plugins', cb)
+	var tasks = ['clean', ['copy', 'jade', 'sass'], 'bundle', 'concat', 'inject:plugins'];
+
+    sequence.apply(null, tasks)(cb)
 });

http://git-wip-us.apache.org/repos/asf/ignite/blob/50856911/modules/control-center-web/src/main/js/gulpfile.js/tasks/bundle.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/gulpfile.js/tasks/bundle.js b/modules/control-center-web/src/main/js/gulpfile.js/tasks/bundle.js
index fd733b0..ed9e65f 100644
--- a/modules/control-center-web/src/main/js/gulpfile.js/tasks/bundle.js
+++ b/modules/control-center-web/src/main/js/gulpfile.js/tasks/bundle.js
@@ -1,7 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
 var gulp = require('gulp');
 var jspm = require('jspm');
+var util = require('gulp-util');
+
+var paths = [
+    './app/**/*.js'
+];
+
+var options = {
+	minify: true
+};
 
 gulp.task('bundle', function() {
-	return jspm.bundleSFX('app/index', 'build/app.min.js', {})
+	if (util.env.debug) {
+		delete options.minify;
+	}
+
+	if (util.env.debug || util.env.sourcemaps) {
+		options.sourceMaps = true;
+	}
+
+	return jspm.bundleSFX('app/index', 'build/app.min.js', options);
 });
 
+gulp.task('bundle:watch', function() {
+	gulp.watch(paths, ['bundle'])
+});

http://git-wip-us.apache.org/repos/asf/ignite/blob/50856911/modules/control-center-web/src/main/js/gulpfile.js/tasks/concat.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/gulpfile.js/tasks/concat.js b/modules/control-center-web/src/main/js/gulpfile.js/tasks/concat.js
new file mode 100644
index 0000000..dfb2115
--- /dev/null
+++ b/modules/control-center-web/src/main/js/gulpfile.js/tasks/concat.js
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+var gulp = require('gulp');
+var concat = require('gulp-concat');
+
+paths = [
+	'!./controllers/common-module.js',
+	'./controllers/*.js',
+	'./controllers/**/*.js'
+];
+
+gulp.task('concat', function() {
+	return gulp.src(paths)
+		.pipe(concat('all.js'))
+		.pipe(gulp.dest('./build'))
+});

http://git-wip-us.apache.org/repos/asf/ignite/blob/50856911/modules/control-center-web/src/main/js/gulpfile.js/tasks/connect.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/gulpfile.js/tasks/connect.js b/modules/control-center-web/src/main/js/gulpfile.js/tasks/connect.js
new file mode 100644
index 0000000..d994691
--- /dev/null
+++ b/modules/control-center-web/src/main/js/gulpfile.js/tasks/connect.js
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+var gulp = require('gulp');
+var connect = require('gulp-connect');
+var modrewrite = require('connect-modrewrite');
+
+var options = {
+	root: './build',
+	middleware: function (connect, opt) {
+		return [modrewrite([
+			'^/api/v1/(.*)$ http://localhost:3000/$1 [P]' 
+		])]
+    },
+    fallback: './build/index.html'
+};
+
+gulp.task('connect', function() {
+	connect.server(options);
+});

http://git-wip-us.apache.org/repos/asf/ignite/blob/50856911/modules/control-center-web/src/main/js/gulpfile.js/tasks/copy.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/gulpfile.js/tasks/copy.js b/modules/control-center-web/src/main/js/gulpfile.js/tasks/copy.js
index fb9dff5..8956587 100644
--- a/modules/control-center-web/src/main/js/gulpfile.js/tasks/copy.js
+++ b/modules/control-center-web/src/main/js/gulpfile.js/tasks/copy.js
@@ -16,19 +16,31 @@
  */
 
 var gulp = require('gulp');
-var gulpSequence = require('gulp-sequence');
+var util = require('gulp-util');
+var sequence = require('gulp-sequence');
 
 var igniteModules = process.env.IGNITE_MODULES || './ignite_modules';
 
 var paths = [
-    './app/**/**/*.js',
+    './app/**/**/*.js'
+];
+
+var cssPaths = [
+    'jspm_packages/**/nvd3@*/build/nv.d3.css',
+    'jspm_packages/**/angular-tree-control@*/css/*.css',
+    'jspm_packages/**/ag-grid@*/dist/ag-grid.css',
+    'jspm_packages/**/angular-loading@*/angular-loading.css',
+    'jspm_packages/**/angular-motion@*/dist/angular-motion.css'
+];
+
+var legacyPaths = [
     './controllers/*.js',
     './controllers/**/*.js',
     './controllers/**/*.json',
     './helpers/*.js',
     './helpers/**/*.js',
     './public/**/*.png',
-    './public/**/*.js'
+    './public/*.png'
 ];
 
 var igniteModulePaths = [
@@ -39,19 +51,39 @@ var igniteModulePaths = [
 ];
 
 gulp.task('copy', function(cb) {
-    return gulpSequence('copy:source', 'copy:ignite_modules')(cb)
+    var tasks = ['copy:legacy', 'copy:fonts', 'copy:ignite_modules'];
+
+    if (util.env.debug || util.env.sourcemaps) {
+        tasks.push('copy:css');
+
+        tasks.push('copy:base');
+    }
+
+    return sequence(tasks)(cb);
+});
+
+gulp.task('copy:base', function(cb) {
+    return gulp.src(paths, {base: './'}).pipe(gulp.dest('./build'));
+});
+
+gulp.task('copy:legacy', function(cb) {
+    return gulp.src(legacyPaths).pipe(gulp.dest('./build'));
+});
+
+gulp.task('copy:css', function(cb) {
+    return gulp.src(cssPaths, {base: './'}).pipe(gulp.dest('./build'));
 });
 
-gulp.task('copy:source', function(cb) {
-    return gulp.src(paths).pipe(gulp.dest('./build'))
+gulp.task('copy:fonts', function(cb) {
+    return gulp.src('./node_modules/font-awesome/fonts/*', {base: './node_modules/font-awesome'}).pipe(gulp.dest('./build'));
 });
 
 gulp.task('copy:ignite_modules', function(cb) {
-    return gulp.src(igniteModulePaths).pipe(gulp.dest('./build/ignite_modules'))
+    return gulp.src(igniteModulePaths).pipe(gulp.dest('./build/ignite_modules'));
 });
 
 gulp.task('copy:watch', function(cb) {
-    gulp.watch([paths, igniteModulePaths], function(glob) {
-        gulpSequence('copy', 'inject:plugins:js')(cb)
-    })
+    gulp.watch([paths, legacyPaths, igniteModulePaths], function(glob) {
+        sequence(['copy:base', 'copy:legacy', 'copy:ignite_modules'], 'inject:plugins:js')(cb);
+    });
 });

http://git-wip-us.apache.org/repos/asf/ignite/blob/50856911/modules/control-center-web/src/main/js/gulpfile.js/tasks/production.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/gulpfile.js/tasks/production.js b/modules/control-center-web/src/main/js/gulpfile.js/tasks/production.js
new file mode 100644
index 0000000..e682bcd
--- /dev/null
+++ b/modules/control-center-web/src/main/js/gulpfile.js/tasks/production.js
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+var gulp = require('gulp');
+var sequence = require('gulp-sequence');
+var environments = require('gulp-environments');
+
+var production = environments.production;
+
+gulp.task('set-prod', production.task);
+
+gulp.task('production', function(cb) {
+	sequence('set-prod', 'build', cb)
+});

http://git-wip-us.apache.org/repos/asf/ignite/blob/50856911/modules/control-center-web/src/main/js/gulpfile.js/tasks/sass.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/gulpfile.js/tasks/sass.js b/modules/control-center-web/src/main/js/gulpfile.js/tasks/sass.js
index 0c5408f..d50a91d 100644
--- a/modules/control-center-web/src/main/js/gulpfile.js/tasks/sass.js
+++ b/modules/control-center-web/src/main/js/gulpfile.js/tasks/sass.js
@@ -16,18 +16,21 @@
  */
 
 var gulp = require('gulp');
+var gulpSequence = require('gulp-sequence');
 var sass = require('gulp-sass');
 
 var paths = [
-    './public/stylesheets/*.scss'
+    './public/stylesheets/style.scss'
 ];
 
 gulp.task('sass', function () {
     return gulp.src(paths)
         .pipe(sass({ outputStyle: 'nested' }).on('error', sass.logError))
-        .pipe(gulp.dest('./build/stylesheets'));
+        .pipe(gulp.dest('./public/stylesheets'));
 });
 
-gulp.task('sass:watch', function () {
-    gulp.watch(paths, ['sass']);
+gulp.task('sass:watch', function (cb) {
+    gulp.watch(paths, function(glob) {
+        gulpSequence('sass', 'bundle')(cb)
+    });
 });

http://git-wip-us.apache.org/repos/asf/ignite/blob/50856911/modules/control-center-web/src/main/js/package.json
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/package.json b/modules/control-center-web/src/main/js/package.json
index e9c6c8d..52dd01e 100644
--- a/modules/control-center-web/src/main/js/package.json
+++ b/modules/control-center-web/src/main/js/package.json
@@ -4,7 +4,7 @@
   "description": "Interactive Web console for configuration, executing SQL queries and monitoring of Apache Ignite Cluster",
   "private": true,
   "scripts": {
-    "start": "jspm i && gulp build && node ./bin/www"
+    "start": "jspm i && gulp build && node serve"
   },
   "author": "",
   "contributors": [
@@ -22,7 +22,7 @@
   "dependencies": {
     "async": "1.5.0",
     "body-parser": "~1.14.1",
-    "bootstrap-sass": "^3.3.5",
+    "bootstrap-sass": "^3.3.6",
     "compression": "1.6.0",
     "connect-mongo": "^0.8.1",
     "cookie-parser": "~1.4.0",
@@ -37,6 +37,7 @@
     "gulp-rimraf": "^0.2.0",
     "gulp-sass": "^2.1.0",
     "gulp-sequence": "^0.4.1",
+    "gulp-util": "^3.0.7",
     "jade": "~1.11.0",
     "jszip": "^2.5.0",
     "lodash": "3.10.1",
@@ -60,13 +61,11 @@
   },
   "jspm": {
     "dependencies": {
-      "Blob": "github:eligrey/Blob.js@master",
-      "FileSaver": "github:eligrey/FileSaver.js@master",
       "ace": "github:ajaxorg/ace-builds@^1.2.2",
       "angular": "github:angular/bower-angular@^1.4.8",
+      "angular-ag-grid": "github:ceolter/ag-grid@^2.3.5",
       "angular-animate": "github:angular/bower-angular-animate@^1.4.8",
       "angular-drag-and-drop-lists": "github:marceljuenemann/angular-drag-and-drop-lists@^1.3.0",
-      "angular-grid": "github:ceolter/ag-grid@^2.3.5",
       "angular-loading": "github:darthwade/angular-loading@^0.1.4",
       "angular-motion": "github:mgcrea/angular-motion@^0.4.3",
       "angular-nvd3": "github:krispo/angular-nvd3@^1.0.4",
@@ -75,15 +74,16 @@
       "angular-strap": "github:akuznetsov-gridgain/angular-strap@fix-1852-2.3.6",
       "angular-tree-control": "github:wix/angular-tree-control@^0.2.22",
       "angular-ui-ace": "github:angular-ui/ui-ace@^0.2.3",
-      "css": "github:systemjs/plugin-css@^0.1.19",
+      "angular-ui-router": "github:angular-ui/ui-router@^0.2.15",
+      "blob": "github:eligrey/Blob.js@master",
+      "bootstrap-carousel": "github:twbs/bootstrap@^3.3.6",
+      "css": "github:systemjs/plugin-css@^0.1.20",
+      "file-saver": "github:eligrey/FileSaver.js@master",
       "font-awesome": "npm:font-awesome@^4.4.0",
       "jquery": "github:components/jquery@^2.1.4",
       "jszip": "github:Stuk/jszip@^2.5.0",
       "lodash": "npm:lodash@^3.10.1",
-      "query-command-supported": "github:zenorocha/document.queryCommandSupported@^1.0.0",
-      "sass": "github:mobilexag/plugin-sass@^0.0.10",
-      "scss": "github:theefer/plugin-sass@master",
-      "spinjs": "github:fgnass/spin.js@^2.3.2"
+      "query-command-supported": "github:zenorocha/document.queryCommandSupported@^1.0.0"
     },
     "devDependencies": {
       "babel": "npm:babel-core@^5.8.24",
@@ -99,24 +99,12 @@
       "github:zenorocha/document.queryCommandSupported@1.0.0": {
         "format": "global"
       },
-      "github:angular/bower-angular@1.4.8": {
-        "dependencies": {
-          "jquery": "github:components/jquery@^2.1.4"
-        },
-        "shim": {
-          "angular": {
-            "deps": [
-              "jquery"
-            ]
-          }
-        }
-      },
       "github:krispo/angular-nvd3@1.0.4": {
         "main": "dist/angular-nvd3",
         "dependencies": {
           "angular": "^1",
           "nvd3": "npm:nvd3@1.8.1",
-          "d3": "npm:d3@3.5.9"
+          "d3": "npm:d3@3.5.10"
         },
         "shim": {
           "dist/angular-nvd3": {
@@ -142,7 +130,6 @@
               "./mode-xml",
               "./mode-java",
               "./mode-sql",
-              "./worker-xml",
               "./ext-language_tools",
               "./mode-dockerfile"
             ]
@@ -182,14 +169,30 @@
           }
         }
       },
-      "github:eligrey/FileSaver.js@master": {
-        "format": "global"
+      "github:angular/bower-angular@1.4.8": {
+        "dependencies": {
+          "jquery": "github:components/jquery@^2.1.4"
+        },
+        "shim": {
+          "angular": {
+            "deps": [
+              "jquery"
+            ]
+          }
+        }
       },
-      "github:eligrey/Blob.js@master": {
-        "format": "global"
+      "github:darthwade/angular-loading@0.1.4": {
+        "dependencies": {
+          "spinjs": "github:fgnass/spin.js@^2.3.2"
+        }
       },
       "github:akuznetsov-gridgain/angular-strap@fix-1852-2.3.6": {
         "main": "dist/angular-strap.tpl",
+        "dependencies": {
+          "angular-animate": "github:angular/bower-angular-animate@^1.4.8",
+          "angular-motion": "github:mgcrea/angular-motion@^0.4.3",
+          "angular-sanitize": "github:angular/bower-angular-sanitize@^1.4.8"
+        },
         "shim": {
           "dist/angular-strap.tpl": {
             "deps": [
@@ -197,6 +200,20 @@
             ]
           }
         }
+      },
+      "github:angular-ui/ui-ace@0.2.3": {
+        "dependencies": {
+          "ace": "github:ajaxorg/ace-builds@^1.2.2"
+        }
+      },
+      "github:eligrey/FileSaver.js@master": {
+        "format": "global",
+        "dependencies": {
+          "blob": "github:eligrey/Blob.js@master"
+        }
+      },
+      "github:eligrey/Blob.js@master": {
+        "format": "global"
       }
     }
   }

http://git-wip-us.apache.org/repos/asf/ignite/blob/50856911/modules/control-center-web/src/main/js/public/favicon.ico
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/public/favicon.ico b/modules/control-center-web/src/main/js/public/favicon.ico
deleted file mode 100644
index 74ec626..0000000
Binary files a/modules/control-center-web/src/main/js/public/favicon.ico and /dev/null differ

http://git-wip-us.apache.org/repos/asf/ignite/blob/50856911/modules/control-center-web/src/main/js/public/favicon.png
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/public/favicon.png b/modules/control-center-web/src/main/js/public/favicon.png
new file mode 100644
index 0000000..74ec626
Binary files /dev/null and b/modules/control-center-web/src/main/js/public/favicon.png differ

http://git-wip-us.apache.org/repos/asf/ignite/blob/50856911/modules/control-center-web/src/main/js/public/images/cache.png
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/public/images/cache.png b/modules/control-center-web/src/main/js/public/images/cache.png
index 28aa268..27d1aef 100755
Binary files a/modules/control-center-web/src/main/js/public/images/cache.png and b/modules/control-center-web/src/main/js/public/images/cache.png differ

http://git-wip-us.apache.org/repos/asf/ignite/blob/50856911/modules/control-center-web/src/main/js/public/images/cluster.png
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/public/images/cluster.png b/modules/control-center-web/src/main/js/public/images/cluster.png
index c48b9ef..938052e 100755
Binary files a/modules/control-center-web/src/main/js/public/images/cluster.png and b/modules/control-center-web/src/main/js/public/images/cluster.png differ

http://git-wip-us.apache.org/repos/asf/ignite/blob/50856911/modules/control-center-web/src/main/js/public/images/logo.png
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/public/images/logo.png b/modules/control-center-web/src/main/js/public/images/logo.png
old mode 100755
new mode 100644
index c3577c5..4545a70
Binary files a/modules/control-center-web/src/main/js/public/images/logo.png and b/modules/control-center-web/src/main/js/public/images/logo.png differ

http://git-wip-us.apache.org/repos/asf/ignite/blob/50856911/modules/control-center-web/src/main/js/public/images/metadata.png
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/public/images/metadata.png b/modules/control-center-web/src/main/js/public/images/metadata.png
index 1f2f8f5..3086aa6 100755
Binary files a/modules/control-center-web/src/main/js/public/images/metadata.png and b/modules/control-center-web/src/main/js/public/images/metadata.png differ

http://git-wip-us.apache.org/repos/asf/ignite/blob/50856911/modules/control-center-web/src/main/js/public/images/query-chart.png
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/public/images/query-chart.png b/modules/control-center-web/src/main/js/public/images/query-chart.png
index d053b6a..52ab88c 100755
Binary files a/modules/control-center-web/src/main/js/public/images/query-chart.png and b/modules/control-center-web/src/main/js/public/images/query-chart.png differ

http://git-wip-us.apache.org/repos/asf/ignite/blob/50856911/modules/control-center-web/src/main/js/public/images/query-metadata.png
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/public/images/query-metadata.png b/modules/control-center-web/src/main/js/public/images/query-metadata.png
index 71bad47..d72843d 100755
Binary files a/modules/control-center-web/src/main/js/public/images/query-metadata.png and b/modules/control-center-web/src/main/js/public/images/query-metadata.png differ

http://git-wip-us.apache.org/repos/asf/ignite/blob/50856911/modules/control-center-web/src/main/js/public/images/query-table.png
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/public/images/query-table.png b/modules/control-center-web/src/main/js/public/images/query-table.png
index b234255..fab3ea2 100755
Binary files a/modules/control-center-web/src/main/js/public/images/query-table.png and b/modules/control-center-web/src/main/js/public/images/query-table.png differ

http://git-wip-us.apache.org/repos/asf/ignite/blob/50856911/modules/control-center-web/src/main/js/public/images/summary.png
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/public/images/summary.png b/modules/control-center-web/src/main/js/public/images/summary.png
index 7a1148d..bc7d8e2 100755
Binary files a/modules/control-center-web/src/main/js/public/images/summary.png and b/modules/control-center-web/src/main/js/public/images/summary.png differ

http://git-wip-us.apache.org/repos/asf/ignite/blob/50856911/modules/control-center-web/src/main/js/public/stylesheets/_bootstrap-variables.scss
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/public/stylesheets/_bootstrap-variables.scss b/modules/control-center-web/src/main/js/public/stylesheets/_bootstrap-variables.scss
index ae0a3d7..20efe3c 100644
--- a/modules/control-center-web/src/main/js/public/stylesheets/_bootstrap-variables.scss
+++ b/modules/control-center-web/src/main/js/public/stylesheets/_bootstrap-variables.scss
@@ -14,6 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
 $bootstrap-sass-asset-helper: false !default;
 //
 // Variables
@@ -884,5 +885,7 @@ $blockquote-border-color:     $gray-lighter !default;
 $page-header-border-color:    $gray-lighter !default;
 //** Width of horizontal description list titles
 $dl-horizontal-offset:        $component-offset-horizontal !default;
+//** Point at which .dl-horizontal becomes horizontal
+$dl-horizontal-breakpoint:    $grid-float-breakpoint !default;
 //** Horizontal line color.
 $hr-border:                   $gray-lighter !default;

http://git-wip-us.apache.org/repos/asf/ignite/blob/50856911/modules/control-center-web/src/main/js/public/stylesheets/_font-awesome-custom.scss
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/public/stylesheets/_font-awesome-custom.scss b/modules/control-center-web/src/main/js/public/stylesheets/_font-awesome-custom.scss
new file mode 100644
index 0000000..8c041de
--- /dev/null
+++ b/modules/control-center-web/src/main/js/public/stylesheets/_font-awesome-custom.scss
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+@import "../../node_modules/font-awesome/scss/variables";
+$fa-font-path: "/fonts";
+
+@import "../../node_modules/font-awesome/scss/mixins";
+@import "../../node_modules/font-awesome/scss/path";
+@import "../../node_modules/font-awesome/scss/core";
+@import "../../node_modules/font-awesome/scss/larger";
+@import "../../node_modules/font-awesome/scss/fixed-width";
+@import "../../node_modules/font-awesome/scss/list";
+@import "../../node_modules/font-awesome/scss/bordered-pulled";
+@import "../../node_modules/font-awesome/scss/animated";
+@import "../../node_modules/font-awesome/scss/rotated-flipped";
+@import "../../node_modules/font-awesome/scss/stacked";
+@import "../../node_modules/font-awesome/scss/icons";

http://git-wip-us.apache.org/repos/asf/ignite/blob/50856911/modules/control-center-web/src/main/js/public/stylesheets/style.scss
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/public/stylesheets/style.scss b/modules/control-center-web/src/main/js/public/stylesheets/style.scss
index 6851d9e..3172b1d 100644
--- a/modules/control-center-web/src/main/js/public/stylesheets/style.scss
+++ b/modules/control-center-web/src/main/js/public/stylesheets/style.scss
@@ -15,9 +15,10 @@
  * limitations under the License.
  */
 
+@import "font-awesome-custom";
 @import "bootstrap-custom";
 
-$logo-path: "https://www.filepicker.io/api/file/QagunjDGRFul2JgNCAli";
+$logo-path: "/images/logo.png";
 $input-height: 28px;
 $ignite-block-callout-left-background: #f4f8fa;
 $ignite-block-callout-right-background: #f3f8f3;
@@ -30,6 +31,20 @@ $ignite-background-color: #fff;
 $ignite-header-color: #555;
 $ignite-invalid-color: $brand-primary;
 
+@font-face {
+    font-family: 'Roboto Slab';
+    font-style: normal;
+    font-weight: 400;
+    src: local('Roboto Slab Regular'), local('RobotoSlab-Regular'), url(//fonts.gstatic.com/s/robotoslab/v6/y7lebkjgREBJK96VQi37ZiwlidHJgAgmTjOEEzwu1L8.ttf) format('truetype');
+}
+
+@font-face {
+    font-family: 'Roboto Slab';
+    font-style: normal;
+    font-weight: 700;
+    src: local('Roboto Slab Bold'), local('RobotoSlab-Bold'), url(//fonts.gstatic.com/s/robotoslab/v6/dazS1PrQQuCxC3iOAJFEJTdGNerWpg2Hn6A-BxWgZ_I.ttf) format('truetype');
+}
+
 hr {
     margin: 20px 0;
 }
@@ -159,6 +174,7 @@ ul.navbar-nav, .sidebar-nav {
     max-height: 20em;
     overflow: auto;
     overflow-x: hidden;
+    outline-style: none;
 
     li > a {
         display: block;

http://git-wip-us.apache.org/repos/asf/ignite/blob/50856911/modules/control-center-web/src/main/js/routes/admin.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/routes/admin.js b/modules/control-center-web/src/main/js/routes/admin.js
index d554a70..7ff5eee 100644
--- a/modules/control-center-web/src/main/js/routes/admin.js
+++ b/modules/control-center-web/src/main/js/routes/admin.js
@@ -22,10 +22,6 @@ var nodemailer = require('nodemailer');
 var db = require('../db');
 var config = require('../helpers/configuration-loader.js');
 
-router.get('/', function (req, res) {
-    res.render('settings/admin');
-});
-
 /**
  * Get list of user accounts.
  */
@@ -104,22 +100,21 @@ router.post('/save', function (req, res) {
 
 // Become user.
 router.get('/become', function (req, res) {
-    var viewedUserId = req.query.viewedUserId;
-
-    if (!viewedUserId) {
-        req.session.viewedUser = null;
-
-        return res.redirect('/admin');
-    }
-
-    db.Account.findById(viewedUserId).exec(function (err, viewedUser) {
+    db.Account.findById(req.query.viewedUserId).exec(function (err, viewedUser) {
         if (err)
             return res.sendStatus(404);
 
         req.session.viewedUser = viewedUser;
 
-        res.redirect('/');
+        return res.sendStatus(200);
     })
 });
 
+// Become user.
+router.get('/revertIdentity', function (req, res) {
+    req.session.viewedUser = null;
+
+    return res.sendStatus(200);
+});
+
 module.exports = router;

http://git-wip-us.apache.org/repos/asf/ignite/blob/50856911/modules/control-center-web/src/main/js/routes/agent.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/routes/agent.js b/modules/control-center-web/src/main/js/routes/agent.js
index 3574f2c..693fb9f 100644
--- a/modules/control-center-web/src/main/js/routes/agent.js
+++ b/modules/control-center-web/src/main/js/routes/agent.js
@@ -40,11 +40,6 @@ function _compact(className) {
 }
 
 /* Get grid topology. */
-router.get('/download', function (req, res) {
-    res.render('templates/agent-download');
-});
-
-/* Get grid topology. */
 router.get('/download/zip', function (req, res) {
     var fs = require('fs');
     var JSZip = require('jszip');

http://git-wip-us.apache.org/repos/asf/ignite/blob/50856911/modules/control-center-web/src/main/js/routes/caches.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/routes/caches.js b/modules/control-center-web/src/main/js/routes/caches.js
index 0875be5..bca0d2e 100644
--- a/modules/control-center-web/src/main/js/routes/caches.js
+++ b/modules/control-center-web/src/main/js/routes/caches.js
@@ -19,11 +19,6 @@ var _ = require('lodash');
 var router = require('express').Router();
 var db = require('../db');
 
-/* GET caches page. */
-router.get('/', function (req, res) {
-    res.render('configuration/caches');
-});
-
 /**
  * Get spaces and caches accessed for user account.
  *

http://git-wip-us.apache.org/repos/asf/ignite/blob/50856911/modules/control-center-web/src/main/js/routes/clusters.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/routes/clusters.js b/modules/control-center-web/src/main/js/routes/clusters.js
index 6e9364f..311dcef 100644
--- a/modules/control-center-web/src/main/js/routes/clusters.js
+++ b/modules/control-center-web/src/main/js/routes/clusters.js
@@ -19,11 +19,6 @@ var _ = require('lodash');
 var router = require('express').Router();
 var db = require('../db');
 
-/* GET clusters page. */
-router.get('/', function (req, res) {
-    res.render('configuration/clusters');
-});
-
 /**
  * Get spaces and clusters accessed for user account.
  *

http://git-wip-us.apache.org/repos/asf/ignite/blob/50856911/modules/control-center-web/src/main/js/routes/igfs.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/routes/igfs.js b/modules/control-center-web/src/main/js/routes/igfs.js
index caf99b1..ea33644 100644
--- a/modules/control-center-web/src/main/js/routes/igfs.js
+++ b/modules/control-center-web/src/main/js/routes/igfs.js
@@ -19,11 +19,6 @@ var _ = require('lodash');
 var router = require('express').Router();
 var db = require('../db');
 
-/* GET IGFS page. */
-router.get('/', function (req, res) {
-    res.render('configuration/igfs');
-});
-
 /**
  * Get spaces and IGFSs accessed for user account.
  *

http://git-wip-us.apache.org/repos/asf/ignite/blob/50856911/modules/control-center-web/src/main/js/routes/metadata.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/routes/metadata.js b/modules/control-center-web/src/main/js/routes/metadata.js
index 09d67f4..617c5c3 100644
--- a/modules/control-center-web/src/main/js/routes/metadata.js
+++ b/modules/control-center-web/src/main/js/routes/metadata.js
@@ -20,16 +20,6 @@ var _ = require('lodash');
 var router = require('express').Router();
 var db = require('../db');
 
-/* GET metadata page. */
-router.get('/', function (req, res) {
-    res.render('configuration/metadata');
-});
-
-/* GET metadata load dialog. */
-router.get('/metadata-load', function (req, res) {
-    res.render('configuration/metadata-load');
-});
-
 /**
  * Get spaces and metadata accessed for user account.
  *

http://git-wip-us.apache.org/repos/asf/ignite/blob/50856911/modules/control-center-web/src/main/js/routes/notebooks.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/routes/notebooks.js b/modules/control-center-web/src/main/js/routes/notebooks.js
index 45e69c3..6dd02c2 100644
--- a/modules/control-center-web/src/main/js/routes/notebooks.js
+++ b/modules/control-center-web/src/main/js/routes/notebooks.js
@@ -20,10 +20,6 @@ var router = require('express').Router();
 var db = require('../db');
 var utils = require('./../helpers/common-utils');
 
-router.get('/new', function (req, res) {
-    res.render('sql/notebook-new', {});
-});
-
 /**
  * Get notebooks names accessed for user account.
  *
@@ -143,7 +139,7 @@ router.post('/new', function (req, res) {
         if (err)
             return res.status(500).send(err.message);
 
-        (new db.Notebook({space: space.id, name: req.body.name, paragraphs: []})).save(function (err, note) {
+        (new db.Notebook({space: space.id, name: req.body.name})).save(function (err, note) {
             if (err)
                 return res.status(500).send(err.message);
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/50856911/modules/control-center-web/src/main/js/routes/profile.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/routes/profile.js b/modules/control-center-web/src/main/js/routes/profile.js
index cd3fd5b..0a166f3 100644
--- a/modules/control-center-web/src/main/js/routes/profile.js
+++ b/modules/control-center-web/src/main/js/routes/profile.js
@@ -18,20 +18,6 @@
 var router = require('express').Router();
 var db = require('../db');
 
-/**
- * Get user profile page.
- */
-router.get('/', function (req, res) {
-    var user_id = req.currentUserId();
-
-    db.Account.findById(user_id, function (err) {
-        if (err)
-            return res.status(500).send(err.message);
-
-        res.render('settings/profile');
-    });
-});
-
 function _updateUser(res, user, params) {
     if (params.userName)
         user.username = params.userName;

http://git-wip-us.apache.org/repos/asf/ignite/blob/50856911/modules/control-center-web/src/main/js/routes/public.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/routes/public.js b/modules/control-center-web/src/main/js/routes/public.js
index 5c331c7..717b217 100644
--- a/modules/control-center-web/src/main/js/routes/public.js
+++ b/modules/control-center-web/src/main/js/routes/public.js
@@ -38,41 +38,6 @@ router.post('/user', function (req, res) {
     res.json(user);
 });
 
-// GET dropdown-menu template.
-router.get('/select', function (req, res) {
-    res.render('templates/select', {});
-});
-
-// GET dropdown-menu template.
-router.get('/validation-error', function (req, res) {
-    res.render('templates/validation-error', {});
-});
-
-// GET confirmation dialog.
-router.get('/message', function (req, res) {
-    res.render('templates/message', {});
-});
-
-// GET confirmation dialog.
-router.get('/confirm', function (req, res) {
-    res.render('templates/confirm', {});
-});
-
-// GET batch confirmation dialog.
-router.get('/confirm/batch', function (req, res) {
-    res.render('templates/batch-confirm', {});
-});
-
-// GET copy dialog.
-router.get('/clone', function (req, res) {
-    res.render('templates/clone', {});
-});
-
-/* GET login dialog. */
-router.get('/login', function (req, res) {
-    res.render('login');
-});
-
 /**
  * Register new account.
  */
@@ -100,7 +65,7 @@ router.post('/register', function (req, res) {
                 if (err)
                     return res.status(401).send(err.message);
 
-                return res.redirect('/configuration/clusters');
+                return res.sendStatus(200);
             });
         });
     });
@@ -121,7 +86,7 @@ router.post('/login', function (req, res, next) {
             if (err)
                 return res.status(401).send(err.message);
 
-            res.redirect('/configuration/clusters');
+            return res.sendStatus(200);
         });
     })(req, res, next);
 });
@@ -129,10 +94,10 @@ router.post('/login', function (req, res, next) {
 /**
  * Logout.
  */
-router.get('/logout', function (req, res) {
+router.post('/logout', function (req, res) {
     req.logout();
 
-    res.redirect('/');
+    res.sendStatus(200);
 });
 
 /**
@@ -185,7 +150,7 @@ router.post('/password/forgot', function(req, res) {
                 if (err)
                     return res.status(401).send('Failed to send e-mail with reset link!<br />' + err);
 
-                return res.status(403).send('An e-mail has been sent with further instructions.');
+                return res.status(200).send('An e-mail has been sent with further instructions.');
             });
         });
     });
@@ -245,10 +210,6 @@ router.post('/password/reset', function(req, res) {
     });
 });
 
-router.get('/password/reset', function (req, res) {
-    res.render('reset');
-});
-
 /* GET reset password page. */
 router.post('/password/validate-token', function (req, res) {
     var token = req.body.token;
@@ -267,12 +228,4 @@ router.post('/password/validate-token', function (req, res) {
     });
 });
 
-/* GET home page. */
-router.get('/', function (req, res) {
-    if (req.isAuthenticated())
-        res.redirect('/configuration/clusters');
-    else
-        res.render('login');
-});
-
 module.exports = router;

http://git-wip-us.apache.org/repos/asf/ignite/blob/50856911/modules/control-center-web/src/main/js/routes/sql.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/routes/sql.js b/modules/control-center-web/src/main/js/routes/sql.js
deleted file mode 100644
index ba23eef..0000000
--- a/modules/control-center-web/src/main/js/routes/sql.js
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-var router = require('express').Router();
-var db = require('../db');
-
-router.get('/rate', function (req, res) {
-    res.render('sql/paragraph-rate');
-});
-
-router.get('/chart-settings', function (req, res) {
-    res.render('sql/chart-settings');
-});
-
-router.get('/cache-metadata', function (req, res) {
-    res.render('sql/cache-metadata');
-});
-
-router.get('/', function (req, res) {
-    res.render('sql/sql');
-});
-
-module.exports = router;

http://git-wip-us.apache.org/repos/asf/ignite/blob/50856911/modules/control-center-web/src/main/js/routes/summary.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/routes/summary.js b/modules/control-center-web/src/main/js/routes/summary.js
deleted file mode 100644
index 0d8f4ce..0000000
--- a/modules/control-center-web/src/main/js/routes/summary.js
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-var router = require('express').Router();
-
-// GET template for summary tabs.
-router.get('/summary-tabs', function (req, res) {
-    res.render('configuration/summary-tabs', {});
-});
-
-/* GET summary page. */
-router.get('/', function (req, res) {
-    res.render('configuration/summary');
-});
-
-module.exports = router;

http://git-wip-us.apache.org/repos/asf/ignite/blob/50856911/modules/control-center-web/src/main/js/serve.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/serve.js b/modules/control-center-web/src/main/js/serve.js
new file mode 100644
index 0000000..3baf090
--- /dev/null
+++ b/modules/control-center-web/src/main/js/serve.js
@@ -0,0 +1,107 @@
+#!/usr/bin/env node
+
+/**
+ * Module dependencies.
+ */
+var http = require('http');
+var https = require('https');
+var config = require('./helpers/configuration-loader.js');
+var app = require('./app');
+var agentManager = require('./agents/agent-manager');
+
+var fs = require('fs');
+
+var debug = require('debug')('ignite-web-console:server');
+
+/**
+ * Get port from environment and store in Express.
+ */
+var port = config.normalizePort(config.get('server:port') || process.env.PORT || 80);
+
+// Create HTTP server.
+var server = http.createServer(app);
+
+app.set('port', port);
+
+/**
+ * Listen on provided port, on all network interfaces.
+ */
+server.listen(port);
+server.on('error', onError);
+server.on('listening', onListening);
+
+if (config.get('server:ssl')) {
+    httpsServer = https.createServer({
+        key: fs.readFileSync(config.get('server:key')),
+        cert: fs.readFileSync(config.get('server:cert')),
+        passphrase: config.get('server:keyPassphrase')
+    }, app);
+
+    var httpsPort = config.normalizePort(config.get('server:https-port') || 443);
+
+    /**
+     * Listen on provided port, on all network interfaces.
+     */
+    httpsServer.listen(httpsPort);
+    httpsServer.on('error', onError);
+    httpsServer.on('listening', onListening);
+}
+
+/**
+ * Start agent server.
+ */
+var agentServer;
+
+if (config.get('agent-server:ssl')) {
+    agentServer = https.createServer({
+    key: fs.readFileSync(config.get('agent-server:key')),
+    cert: fs.readFileSync(config.get('agent-server:cert')),
+    passphrase: config.get('agent-server:keyPassphrase')
+  });
+}
+else {
+  agentServer = http.createServer();
+}
+
+agentServer.listen(config.get('agent-server:port'));
+
+agentManager.createManager(agentServer);
+
+/**
+ * Event listener for HTTP server "error" event.
+ */
+function onError(error) {
+  if (error.syscall !== 'listen') {
+    throw error;
+  }
+
+  var bind = typeof port === 'string'
+    ? 'Pipe ' + port
+    : 'Port ' + port;
+
+  // handle specific listen errors with friendly messages
+  switch (error.code) {
+    case 'EACCES':
+      console.error(bind + ' requires elevated privileges');
+      process.exit(1);
+      break;
+    case 'EADDRINUSE':
+      console.error(bind + ' is already in use');
+      process.exit(1);
+      break;
+    default:
+      throw error;
+  }
+}
+
+/**
+ * Event listener for HTTP server "listening" event.
+ */
+function onListening() {
+  var addr = server.address();
+  var bind = typeof addr === 'string'
+    ? 'pipe ' + addr
+    : 'port ' + addr.port;
+
+  console.log('Start listening on ' + bind);
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/50856911/modules/control-center-web/src/main/js/views/base.jade
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/views/base.jade b/modules/control-center-web/src/main/js/views/base.jade
new file mode 100644
index 0000000..1ba3a24
--- /dev/null
+++ b/modules/control-center-web/src/main/js/views/base.jade
@@ -0,0 +1,6 @@
+include includes/header
+
+.container.body-container
+    .main-content(ui-view='')
+
+include includes/footer

http://git-wip-us.apache.org/repos/asf/ignite/blob/50856911/modules/control-center-web/src/main/js/views/configuration/caches.jade
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/views/configuration/caches.jade b/modules/control-center-web/src/main/js/views/configuration/caches.jade
index 0acdabc..42ba4a1 100644
--- a/modules/control-center-web/src/main/js/views/configuration/caches.jade
+++ b/modules/control-center-web/src/main/js/views/configuration/caches.jade
@@ -14,11 +14,6 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 
-extends sidebar
-
-append scripts
-    script(src='/caches-controller.js')
-
 include ../includes/controls
 
 block content

http://git-wip-us.apache.org/repos/asf/ignite/blob/50856911/modules/control-center-web/src/main/js/views/configuration/clusters.jade
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/views/configuration/clusters.jade b/modules/control-center-web/src/main/js/views/configuration/clusters.jade
index b546db6..33d0f75 100644
--- a/modules/control-center-web/src/main/js/views/configuration/clusters.jade
+++ b/modules/control-center-web/src/main/js/views/configuration/clusters.jade
@@ -14,11 +14,6 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 
-extends sidebar
-
-append scripts
-    script(src='/clusters-controller.js')
-
 include ../includes/controls
 
 block content

http://git-wip-us.apache.org/repos/asf/ignite/blob/50856911/modules/control-center-web/src/main/js/views/configuration/igfs.jade
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/views/configuration/igfs.jade b/modules/control-center-web/src/main/js/views/configuration/igfs.jade
index 2a99d71..ef090c2 100644
--- a/modules/control-center-web/src/main/js/views/configuration/igfs.jade
+++ b/modules/control-center-web/src/main/js/views/configuration/igfs.jade
@@ -14,11 +14,6 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 
-extends sidebar
-
-append scripts
-    script(src='/igfs-controller.js')
-
 include ../includes/controls
 
 block content

http://git-wip-us.apache.org/repos/asf/ignite/blob/50856911/modules/control-center-web/src/main/js/views/configuration/metadata.jade
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/views/configuration/metadata.jade b/modules/control-center-web/src/main/js/views/configuration/metadata.jade
index 3cbe5c2..7f50c9e 100644
--- a/modules/control-center-web/src/main/js/views/configuration/metadata.jade
+++ b/modules/control-center-web/src/main/js/views/configuration/metadata.jade
@@ -14,11 +14,6 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 
-extends sidebar
-
-append scripts
-    script(src='/metadata-controller.js')
-
 include ../includes/controls
 
 block content

http://git-wip-us.apache.org/repos/asf/ignite/blob/50856911/modules/control-center-web/src/main/js/views/configuration/sidebar.jade
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/views/configuration/sidebar.jade b/modules/control-center-web/src/main/js/views/configuration/sidebar.jade
index fb4d1b2..a8e7129 100644
--- a/modules/control-center-web/src/main/js/views/configuration/sidebar.jade
+++ b/modules/control-center-web/src/main/js/views/configuration/sidebar.jade
@@ -14,8 +14,6 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 
-extends ../templates/layout
-
 append scripts
     script(src='/data-structures.js')
     script(src='/generator/generator-common.js')
@@ -38,5 +36,5 @@ block container
                                 a(ng-class='{active: isActive("{{::subItem.href}}")}' href='{{::subItem.href}}') {{::subItem.label}}
 
         .col-xs-9.col-sm-9.col-md-10.border-left.section-right
-            .docs-content
+            .docs-content(ui-view='')
                 block content

http://git-wip-us.apache.org/repos/asf/ignite/blob/50856911/modules/control-center-web/src/main/js/views/configuration/summary.jade
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/views/configuration/summary.jade b/modules/control-center-web/src/main/js/views/configuration/summary.jade
index 5b568ed..79c31ed 100644
--- a/modules/control-center-web/src/main/js/views/configuration/summary.jade
+++ b/modules/control-center-web/src/main/js/views/configuration/summary.jade
@@ -14,14 +14,11 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 
-extends sidebar
-
 append scripts
     script(src='/generator/generator-docker.js')
     script(src='/generator/generator-properties.js')
     script(src='/generator/generator-pom.js')
     script(src='/generator/generator-readme.js')
-    script(src='/summary-controller.js')
 
 include ../includes/controls
 
@@ -55,7 +52,7 @@ block content
         hr
         .padding-dflt(ng-if='clusters.length == 0')
             | You have no clusters configured. Please configure them &nbsp;
-            a(href='clusters') here.
+            a(href='/configuration/clusters') here.
         +main-table('Clusters:', 'clusters', 'clusterName', 'selectItem(row)', '{{$index + 1}}) {{row.name}}')
         .padding-top-dflt(ng-if='clusters.length > 0' bs-affix)
             button.btn.btn-primary(id='download' ng-click='downloadConfiguration()' bs-tooltip data-title='Download configuration' data-placement='bottom') Download
@@ -67,7 +64,7 @@ block content
                         i.fa(ng-class='panelExpanded(panels, "server") ? "fa-chevron-circle-up" : "fa-chevron-circle-down"')
                         label Server
                     .panel-collapse(id='server' role='tabpanel' bs-collapse-target)
-                        .summary-tabs(bs-tabs data-bs-active-pane="tabsServer.activeTab" ng-show='selectedItem' template='summary/summary-tabs')
+                        .summary-tabs(bs-tabs data-bs-active-pane="tabsServer.activeTab" ng-show='selectedItem' template='configuration/summary-tabs.html')
                             div(bs-pane title='XML')
                                 div(ui-ace='{onLoad: aceInit, mode: "xml"}' ng-model='xmlServer')
                             div(bs-pane title='Java')
@@ -103,7 +100,7 @@ block content
                         div(ng-show='selectedItem')
                             .details-row(ng-repeat='field in clientFields')
                                 +form-row-custom(['col-xs-4 col-sm-4 col-md-3'], ['col-xs-4 col-sm-4 col-md-3'], 'backupItem')
-                            .summary-tabs(bs-tabs data-bs-active-pane="tabsClient.activeTab" template='summary/summary-tabs')
+                            .summary-tabs(bs-tabs data-bs-active-pane="tabsClient.activeTab" template='configuration/summary-tabs.html')
                                 div(bs-pane title='XML')
                                     div(ui-ace='{onLoad: aceInit, mode: "xml"}' ng-model='xmlClient')
                                 div(bs-pane title='Java')

http://git-wip-us.apache.org/repos/asf/ignite/blob/50856911/modules/control-center-web/src/main/js/views/error.jade
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/views/error.jade b/modules/control-center-web/src/main/js/views/error.jade
deleted file mode 100644
index b458fb7..0000000
--- a/modules/control-center-web/src/main/js/views/error.jade
+++ /dev/null
@@ -1,22 +0,0 @@
-//-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
-extends templates/layout
-
-block container
-  h1= message
-  h2= error.status
-  pre #{error.stack}

http://git-wip-us.apache.org/repos/asf/ignite/blob/50856911/modules/control-center-web/src/main/js/views/includes/controls.jade
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/views/includes/controls.jade b/modules/control-center-web/src/main/js/views/includes/controls.jade
index 7504231..2f76c29 100644
--- a/modules/control-center-web/src/main/js/views/includes/controls.jade
+++ b/modules/control-center-web/src/main/js/views/includes/controls.jade
@@ -26,7 +26,7 @@ mixin block-callout(workflowTitle, workflowContent, whatsNextTitle, whatsNextCon
                             li(ng-repeat='item in #{workflowContent}')
                                 div(ng-switch='item')
                                     div(ng-switch-when='more-info')
-                                        a(ng-click='showMoreInfo(moreInfo.title, moreInfo.content)') More info
+                                        a(bs-modal='moreInfo' data-placement='center' data-template-url='/templates/message.html') More info
                                     div(ng-switch-default) {{::item}}
                     td.block-callout-right(width='50%')
                         i.fa.fa-check-square.block-callout-header-right

http://git-wip-us.apache.org/repos/asf/ignite/blob/50856911/modules/control-center-web/src/main/js/views/includes/footer.jade
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/views/includes/footer.jade b/modules/control-center-web/src/main/js/views/includes/footer.jade
index 8ebac3d..8a9aa2a 100644
--- a/modules/control-center-web/src/main/js/views/includes/footer.jade
+++ b/modules/control-center-web/src/main/js/views/includes/footer.jade
@@ -19,4 +19,4 @@
         center
             p Apache Ignite Web Console, version 1.0.0 beta
             p © 2015 The Apache Software Foundation.
-            p Apache, Apache Ignite, the Apache feather and the Apache Ignite logo are trademarks of The Apache Software Foundation.
+            p Apache, Apache Ignite, the Apache feather and the Apache Ignite logo are trademarks of The Apache Software Foundation.
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/50856911/modules/control-center-web/src/main/js/views/includes/header.jade
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/views/includes/header.jade b/modules/control-center-web/src/main/js/views/includes/header.jade
index 9df984f..7b2a1c8 100644
--- a/modules/control-center-web/src/main/js/views/includes/header.jade
+++ b/modules/control-center-web/src/main/js/views/includes/header.jade
@@ -18,12 +18,12 @@ header#header.header
     .viewedUser(ng-show='$root.user.becomeUsed') Currently assuming "
         strong {{$root.user.username}}
         | ",&nbsp;&nbsp;
-        a(href='/admin/become') revert to your identity.
-    .container(ng-controller='auth')
+        a(ng-click='$root.revertIdentity()') revert to your identity.
+    .container
         h1.navbar-brand
             a(href='/') Apache Ignite Web Console
-        .navbar-collapse.collapse(ng-controller='activeLink')
-            ul.nav.navbar-nav(ignite-navbar ng-show='$root.user')
+        .navbar-collapse.collapse(ng-if='$root.user' ng-controller='activeLink' )
+            ul.nav.navbar-nav(ignite-navbar)
                 li
                     a.dropdown-toggle(ng-class='{active: isActive("/configuration.*")}' data-toggle='dropdown' bs-dropdown='configurationDropdown' data-placement='bottom-right') Configuration
                         span.caret
@@ -36,7 +36,7 @@ header#header.header
                 li(ng-repeat='item in navbar.items')
                     a(ng-class='{active: isActive(item.href)}' ng-href='{{::item.href}}') {{::item.title}}
 
-            ul.nav.navbar-nav.pull-right
-                li(ng-if='$root.user')
-                    a.dropdown-toggle(data-toggle='dropdown' ng-class='{active: isActive("/profile") || isActive("/admin")}' bs-dropdown='userDropdown' data-placement='bottom-right') {{user.username}}
+            ul.nav.navbar-nav.pull-right(ignite-userbar)
+                li
+                    a.dropdown-toggle(data-toggle='dropdown' ng-class='{active: isActive("/profile") || isActive("/admin")}' bs-dropdown='userbar.items' data-placement='bottom-right') {{user.username}}
                         span.caret

http://git-wip-us.apache.org/repos/asf/ignite/blob/50856911/modules/control-center-web/src/main/js/views/index.jade
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/views/index.jade b/modules/control-center-web/src/main/js/views/index.jade
new file mode 100644
index 0000000..97f46e2
--- /dev/null
+++ b/modules/control-center-web/src/main/js/views/index.jade
@@ -0,0 +1,40 @@
+//-
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+doctype html
+html(ng-app='ignite-web-console')
+    head
+        base(href='/')
+        link(rel="icon" type="image/png" href="favicon.png")
+        meta(http-equiv='content-type' content='text/html; charset=UTF8')
+        title=title
+
+        block css
+            link(rel='stylesheet', href='/app.min.css')
+
+        block scripts
+            script(src='/common-utils.js')
+            script(src='/app.min.js')
+
+            // ignite:plugins
+            // endignite
+            
+            script(src='/common-module.js')
+            script(src='/data-structures.js')
+            script(src='/all.js')
+
+    body.theme-line.body-overlap.greedy
+        .wrapper(ui-view='')

http://git-wip-us.apache.org/repos/asf/ignite/blob/50856911/modules/control-center-web/src/main/js/views/login.jade
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/views/login.jade b/modules/control-center-web/src/main/js/views/login.jade
index 119ffb8..b33e37b 100644
--- a/modules/control-center-web/src/main/js/views/login.jade
+++ b/modules/control-center-web/src/main/js/views/login.jade
@@ -14,128 +14,122 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 
-extends templates/layout
-
-append scripts
-    script(src='//cdn.rawgit.com/twbs/bootstrap/master/js/carousel.js')
-
 mixin lbl(txt)
     label.col-xs-3.col-md-3.required #{txt}
 
-block body
-    header#header.header
-        .container
-            h1.navbar-brand
-                a(href='/') Apache Ignite Web Configurator
-            p.navbar-text(style='font-size: 18px;') Apache Ignite Web Console
+header#header.header
+    .container
+        h1.navbar-brand
+            a(href='/') Apache Ignite Web Configurator
+        p.navbar-text(style='font-size: 18px;') Apache Ignite Web Console
 
-    .container.body-container
-        .main-content(ng-controller='auth')
-            .row.greedy.home
-                .col-xs-12.col-md-6
-                    form(name='loginForm')
-                        .modal-body.row(style='padding: 0; margin: 0')
-                            .settings-row(ng-if='action == "register"')
-                                h3.login-header Sign Up
-                            .settings-row(ng-if='action == "login"')
-                                h3.login-header Sign In
-                            .settings-row(ng-if='action == "password/forgot"')
-                                h3.login-header Forgot password?
-                            .settings-row
-                                p.col-xs-12.col-md-11(ng-show='action == "password/forgot"')
-                                    | That's ok! Simply enter your email below and a reset password link will be sent to you via email. You can then follow that link and select a new password.
-                            .settings-row(ng-show='action == "register"')
-                                +lbl('Full Name:')
-                                .col-xs-9.col-md-8
-                                    input#user_name.form-control(enter-focus-next='user_email' type='text' ng-model='user_info.username' placeholder='John Smith' ng-required='action=="register"')
-                            .settings-row
-                                +lbl('Email:')
-                                .col-xs-9.col-md-8
-                                    input#user_email.form-control(enter-focus-next='user_password' type='email' ng-model='user_info.email' placeholder='you@domain.com' required on-enter='action == "password/forgot" && loginForm.$valid && auth(action, user_info)')
-                            .settings-row(ng-show='action != "password/forgot"')
-                                +lbl('Password:')
-                                .col-xs-9.col-md-8
-                                    input#user_password.form-control(enter-focus-next='user_confirm' type='password' ng-model='user_info.password' placeholder='Password' ng-required='action != "password/forgot"' on-enter='action == "login" && loginForm.$valid && auth(action, user_info)')
-                            .settings-row(ng-if='action == "register"')
-                                +lbl('Confirm:')
-                                .col-xs-9.col-md-8
-                                    input#user_confirm.form-control(type='password' ng-model='user_info.confirm' match='user_info.password' placeholder='Confirm password' ng-required='action == "register"' on-enter='loginForm.$valid && auth(action, user_info)')
-                        .col-xs-12.col-md-11
-                            .login-footer(ng-show='action == "register"')
-                                a.labelField(ng-click='action = "password/forgot"' on-click-focus='user_email') Forgot password?
-                                a.labelLogin(ng-click='action = "login"' on-click-focus='user_email') Sign In
-                                button#signup.btn.btn-primary(ng-click='auth(action, user_info)' ng-disabled='loginForm.$invalid') Sign Up
-                        .col-xs-12.col-md-11
-                            .login-footer(ng-show='action == "password/forgot"')
-                                a.labelField(ng-click='action = "login"' on-click-focus='user_email') Sign In
-                                button#forgot.btn.btn-primary(ng-click='auth(action, user_info)' ng-disabled='loginForm.$invalid') Send it to me
-                        .col-xs-12.col-md-11
-                            .login-footer(ng-show='action == "login"')
-                                a.labelField(ng-click='action = "password/forgot"' on-click-focus='user_email') Forgot password?
-                                a.labelLogin(ng-click='action = "register"' on-click-focus='user_name') Sign Up
-                                button#login.btn.btn-primary(ng-click='auth(action, user_info)' ng-disabled='loginForm.$invalid') Sign In
+.container.body-container
+    .main-content(ng-controller='auth')
+        .row.greedy.home
+            .col-xs-12.col-md-6
+                form(name='loginForm')
+                    .modal-body.row(style='padding: 0; margin: 0')
+                        .settings-row(ng-if='action == "register"')
+                            h3.login-header Sign Up
+                        .settings-row(ng-if='action == "login"')
+                            h3.login-header Sign In
+                        .settings-row(ng-if='action == "password/forgot"')
+                            h3.login-header Forgot password?
+                        .settings-row
+                            p.col-xs-12.col-md-11(ng-show='action == "password/forgot"')
+                                | That's ok! Simply enter your email below and a reset password link will be sent to you via email. You can then follow that link and select a new password.
+                        .settings-row(ng-show='action == "register"')
+                            +lbl('Full Name:')
+                            .col-xs-9.col-md-8
+                                input#user_name.form-control(enter-focus-next='user_email' type='text' ng-model='user_info.username' placeholder='John Smith' ng-required='action=="register"')
+                        .settings-row
+                            +lbl('Email:')
+                            .col-xs-9.col-md-8
+                                input#user_email.form-control(enter-focus-next='user_password' type='email' ng-model='user_info.email' placeholder='you@domain.com' required on-enter='action == "password/forgot" && loginForm.$valid && auth(action, user_info)')
+                        .settings-row(ng-show='action != "password/forgot"')
+                            +lbl('Password:')
+                            .col-xs-9.col-md-8
+                                input#user_password.form-control(enter-focus-next='user_confirm' type='password' ng-model='user_info.password' placeholder='Password' ng-required='action != "password/forgot"' on-enter='action == "login" && loginForm.$valid && auth(action, user_info)')
+                        .settings-row(ng-if='action == "register"')
+                            +lbl('Confirm:')
+                            .col-xs-9.col-md-8
+                                input#user_confirm.form-control(type='password' ng-model='user_info.confirm' match='user_info.password' placeholder='Confirm password' ng-required='action == "register"' on-enter='loginForm.$valid && auth(action, user_info)')
+                    .col-xs-12.col-md-11
+                        .login-footer(ng-show='action == "register"')
+                            a.labelField(ng-click='action = "password/forgot"' on-click-focus='user_email') Forgot password?
+                            a.labelLogin(ng-click='action = "login"' on-click-focus='user_email') Sign In
+                            button#signup.btn.btn-primary(ng-click='auth(action, user_info)' ng-disabled='loginForm.$invalid') Sign Up
+                    .col-xs-12.col-md-11
+                        .login-footer(ng-show='action == "password/forgot"')
+                            a.labelField(ng-click='action = "login"' on-click-focus='user_email') Sign In
+                            button#forgot.btn.btn-primary(ng-click='auth(action, user_info)' ng-disabled='loginForm.$invalid') Send it to me
+                    .col-xs-12.col-md-11
+                        .login-footer(ng-show='action == "login"')
+                            a.labelField(ng-click='action = "password/forgot"' on-click-focus='user_email') Forgot password?
+                            a.labelLogin(ng-click='action = "register"' on-click-focus='user_name') Sign Up
+                            button#login.btn.btn-primary(ng-click='auth(action, user_info)' ng-disabled='loginForm.$invalid') Sign In
 
-                    .col-xs-12.col-md-11.home-panel
-                        p Apache Ignite Web Console is an interactive web management tool which allows users to:
-                        ul
-                            li Create and download various configurations for Apache Ignite
-                            li Automatically load SQL metadata from any RDBMS
-                            li Connect to Ignite cluster and run SQL analytics on it
-                .col-xs-12.col-md-6
-                    #carousel.carousel.slide(data-ride='carousel')
-                        // Indicators
-                        ol.carousel-indicators
-                            li.active(data-target='#carousel', data-slide-to='0')
-                            li(data-target='#carousel', data-slide-to='1')
-                            li(data-target='#carousel', data-slide-to='2')
-                            li(data-target='#carousel', data-slide-to='3')
-                            li(data-target='#carousel', data-slide-to='4')
-                            li(data-target='#carousel', data-slide-to='5')
-                            li(data-target='#carousel', data-slide-to='6')
-                        // Wrapper for slides
-                        .carousel-inner(role='listbox')
-                            .item.active
-                                img(src='/images/cluster.png', alt='Cluster screen')
-                                .carousel-caption
-                                    h3 Clusters screen
-                                    p Configure clusters, link clusters to caches
-                            .item
-                                img(src='/images/cache.png', alt='Caches screen')
-                                .carousel-caption
-                                    h3 Caches screen
-                                    p Configure caches, link metadata to caches, link caches to clusters
-                            .item
-                                img(src='/images/metadata.png', alt='Metadatas screen')
-                                .carousel-caption
-                                    h3 Metadata screen
-                                    p Manually enter metadata or load from database
-                            .item
-                                img(src='/images/summary.png', alt='Summary screen')
-                                .carousel-caption
-                                    h3 Summary screen
-                                    p Download XML config, JAVA code, Docker file
-                            .item
-                                img(src='/images/query-table.png', alt='Query')
-                                .carousel-caption
-                                    h3 Query
-                                    p Explain SQL, execute, scan queries
-                            .item
-                                img(src='/images/query-metadata.png', alt='Cache metadata')
-                                .carousel-caption
-                                    h3 Cache metadata
-                                    p View cache type metadata
-                            .item
-                                img(src='/images/query-chart.png', alt='Query chart')
-                                .carousel-caption
-                                    h3 Query chart
-                                    p View data in tabular form and as charts
-                        // Controls
-                        a.left.carousel-control(href='#carousel', role='button', data-slide='prev')
-                            span.fa.fa-chevron-left(aria-hidden='true')
-                            span.sr-only Previous
-                        a.right.carousel-control(href='#carousel', role='button', data-slide='next')
-                            span.fa.fa-chevron-right(aria-hidden='true')
-                            span.sr-only Next
-    include includes/footer
+                .col-xs-12.col-md-11.home-panel
+                    p Apache Ignite Web Console is an interactive web management tool which allows users to:
+                    ul
+                        li Create and download various configurations for Apache Ignite
+                        li Automatically load SQL metadata from any RDBMS
+                        li Connect to Ignite cluster and run SQL analytics on it
+            .col-xs-12.col-md-6
+                #carousel.carousel.slide(data-ride='carousel')
+                    // Indicators
+                    ol.carousel-indicators
+                        li.active(data-target='#carousel', data-slide-to='0')
+                        li(data-target='#carousel', data-slide-to='1')
+                        li(data-target='#carousel', data-slide-to='2')
+                        li(data-target='#carousel', data-slide-to='3')
+                        li(data-target='#carousel', data-slide-to='4')
+                        li(data-target='#carousel', data-slide-to='5')
+                        li(data-target='#carousel', data-slide-to='6')
+                    // Wrapper for slides
+                    .carousel-inner(role='listbox')
+                        .item.active
+                            img(src='/images/cluster.png', alt='Cluster screen')
+                            .carousel-caption
+                                h3 Clusters screen
+                                p Configure clusters, link clusters to caches
+                        .item
+                            img(src='/images/cache.png', alt='Caches screen')
+                            .carousel-caption
+                                h3 Caches screen
+                                p Configure caches, link metadata to caches, link caches to clusters
+                        .item
+                            img(src='/images/metadata.png', alt='Metadatas screen')
+                            .carousel-caption
+                                h3 Metadata screen
+                                p Manually enter metadata or load from database
+                        .item
+                            img(src='/images/summary.png', alt='Summary screen')
+                            .carousel-caption
+                                h3 Summary screen
+                                p Download XML config, JAVA code, Docker file
+                        .item
+                            img(src='/images/query-table.png', alt='Query')
+                            .carousel-caption
+                                h3 Query
+                                p Explain SQL, execute, scan queries
+                        .item
+                            img(src='/images/query-metadata.png', alt='Cache metadata')
+                            .carousel-caption
+                                h3 Cache metadata
+                                p View cache type metadata
+                        .item
+                            img(src='/images/query-chart.png', alt='Query chart')
+                            .carousel-caption
+                                h3 Query chart
+                                p View data in tabular form and as charts
+                    // Controls
+                    a.left.carousel-control(href='#carousel', role='button', data-slide='prev')
+                        span.fa.fa-chevron-left(aria-hidden='true')
+                        span.sr-only Previous
+                    a.right.carousel-control(href='#carousel', role='button', data-slide='next')
+                        span.fa.fa-chevron-right(aria-hidden='true')
+                        span.sr-only Next
+include includes/footer
 
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/50856911/modules/control-center-web/src/main/js/views/reset.jade
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/views/reset.jade b/modules/control-center-web/src/main/js/views/reset.jade
index eaee2af..5f77c81 100644
--- a/modules/control-center-web/src/main/js/views/reset.jade
+++ b/modules/control-center-web/src/main/js/views/reset.jade
@@ -14,25 +14,31 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 
-extends templates/layout
+header#header.header
+    .container
+        h1.navbar-brand
+            a(href='/') Apache Ignite Web Configurator
+        p.navbar-text(style='font-size: 18px;') Apache Ignite Web Console
 
-block container
-    .row(ng-controller='auth' ng-init='validateToken()')
-        .text-center(ng-if='!token')
-            p Further instructions for password reset have been sent to your e-mail address.
-        .text-center(ng-if='error')
-            p {{::error}}
-        div(ng-if='token && !error')
-            form.form-horizontal(name='resetForm' ng-init='reset_info.token = token')
-                .settings-row
-                    label.col-sm-1 E-mail:
-                    label {{::email}}
-                .settings-row
-                    label.col-sm-1.required Password:
-                    .col-sm-3
-                        input#user_password.form-control(enter-focus-next='user_confirm' type='password' ng-model='reset_info.password' placeholder='New password' required)
-                .settings-row
-                    label.col-sm-1.required Confirm:
-                    .col-sm-3
-                        input#user_confirm.form-control(type='password' ng-model='reset_info.confirm' match='reset_info.password' placeholder='Confirm new password' required on-enter='resetForm.$valid && resetPassword(user_info)')
-            button.btn.btn-primary(ng-disabled='resetForm.$invalid' ng-click='resetPassword(reset_info)') Reset Password
+.container.body-container
+    .main-content(ng-controller='resetPassword')
+        .row
+            .text-center(ng-if='!token')
+                p Further instructions for password reset have been sent to your e-mail address.
+            .text-center(ng-if='error')
+                p {{::error}}
+            div(ng-if='token && !error')
+                form.form-horizontal(name='resetForm' ng-init='reset_info.token = token')
+                    .settings-row
+                        label.col-sm-1 E-mail:
+                        label {{::email}}
+                    .settings-row
+                        label.col-sm-1.required Password:
+                        .col-sm-3
+                            input#user_password.form-control(enter-focus-next='user_confirm' type='password' ng-model='reset_info.password' placeholder='New password' required)
+                    .settings-row
+                        label.col-sm-1.required Confirm:
+                        .col-sm-3
+                            input#user_confirm.form-control(type='password' ng-model='reset_info.confirm' match='reset_info.password' placeholder='Confirm new password' required on-enter='resetForm.$valid && resetPassword(user_info)')
+                button.btn.btn-primary(ng-disabled='resetForm.$invalid' ng-click='resetPassword(reset_info)') Reset Password
+include includes/footer

http://git-wip-us.apache.org/repos/asf/ignite/blob/50856911/modules/control-center-web/src/main/js/views/settings/admin.jade
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/views/settings/admin.jade b/modules/control-center-web/src/main/js/views/settings/admin.jade
index 46210cb..b9c2860 100644
--- a/modules/control-center-web/src/main/js/views/settings/admin.jade
+++ b/modules/control-center-web/src/main/js/views/settings/admin.jade
@@ -12,11 +12,6 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 
-extends ../templates/layout
-
-append scripts
-    script(src='/admin-controller.js')
-
 block container
     .row(ng-controller='adminController')
         .docs-content

http://git-wip-us.apache.org/repos/asf/ignite/blob/50856911/modules/control-center-web/src/main/js/views/settings/profile.jade
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/views/settings/profile.jade b/modules/control-center-web/src/main/js/views/settings/profile.jade
index d45f52f..7f76ed7 100644
--- a/modules/control-center-web/src/main/js/views/settings/profile.jade
+++ b/modules/control-center-web/src/main/js/views/settings/profile.jade
@@ -14,14 +14,9 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 
-extends ../templates/layout
-
 mixin lbl(txt)
     label.col-sm-2.required.labelFormField #{txt}
 
-append scripts
-    script(src='/profile-controller.js')
-
 block container
     .row(ng-controller='profileController')
         .docs-content

http://git-wip-us.apache.org/repos/asf/ignite/blob/50856911/modules/control-center-web/src/main/js/views/sql/sql.jade
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/views/sql/sql.jade b/modules/control-center-web/src/main/js/views/sql/sql.jade
index c16ff88..4c50210 100644
--- a/modules/control-center-web/src/main/js/views/sql/sql.jade
+++ b/modules/control-center-web/src/main/js/views/sql/sql.jade
@@ -12,11 +12,6 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 
-extends ../templates/layout
-
-append scripts
-    script(src='/sql-controller.js')
-
 mixin btn-toolbar(btn, click, tip, focusId)
     i.btn.btn-default.fa(class=btn ng-click=click bs-tooltip='' data-title=tip on-click-focus=focusId data-trigger='hover' data-placement='bottom')
 
@@ -36,7 +31,7 @@ mixin chart-settings(mdl)
         .col-xs-4
             .chart-settings-link(ng-show='paragraph.chart && paragraph.chartColumns.length > 0')
                 i.fa.fa-chevron-circle-down
-                a(ng-click='$event.stopPropagation()' bs-popover data-template-url='chart-settings' data-placement='bottom' data-auto-close='1' data-trigger='click') Chart settings
+                a(ng-click='$event.stopPropagation()' bs-popover data-template-url='/sql/chart-settings.html' data-placement='bottom' data-auto-close='1' data-trigger='click') Chart settings
                 div(ng-show='paragraphTimeSpanVisible(paragraph)')
                     label Show
                     button.select-manual-caret.btn.btn-default(ng-model='paragraph.timeLineSpan' ng-change='applyChartSettings(paragraph)' bs-options='item for item in timeLineSpans' bs-select data-caret-html='<span class="caret"></span>')
@@ -121,7 +116,7 @@ block container
                                     .col-xs-4.col-sm-3
                                         div(ng-show='caches.length > 0' style='padding: 5px 10px' st-table='displayedCaches' st-safe-src='caches')
                                             lable.labelField.labelFormField Caches:
-                                            i.fa.fa-database.tipField(bs-popover data-template-url='cache-metadata', data-placement='bottom', data-trigger='click')
+                                            i.fa.fa-database.tipField(bs-popover data-template-url='/sql/cache-metadata.html', data-placement='bottom', data-trigger='click')
                                             .input-tip
                                                 input.form-control(type='text' st-search placeholder='Filter caches...')
                                             table.links
@@ -145,7 +140,7 @@ block container
                                             labelHide System columns:
                                             a.btn.btn-default.fa.fa-bars.tipLabel(ng-class='{"btn-info": paragraph.systemColumns}' ng-click='toggleSystemColumns(paragraph)' ng-disabled='paragraph.disabledSystemColumns' bs-tooltip data-title='Show "_KEY", "_VAL" columns')
                                             label.tipLabel Refresh rate:
-                                            button.btn.btn-default.fa.fa-clock-o.tipLabel(ng-class='{"btn-info": paragraph.rate && paragraph.rate.installed}' bs-popover data-template-url='rate' data-placement='left' data-auto-close='1' data-trigger='click') {{rateAsString(paragraph)}}
+                                            button.btn.btn-default.fa.fa-clock-o.tipLabel(ng-class='{"btn-info": paragraph.rate && paragraph.rate.installed}' bs-popover data-template-url='/sql/paragraph-rate.html' data-placement='left' data-auto-close='1' data-trigger='click') {{rateAsString(paragraph)}}
                                             label.tipLabel Page size:
                                             button.select-toggle.fieldButton.btn.btn-default(ng-model='paragraph.pageSize' bs-options='item for item in pageSizes' bs-select bs-tooltip data-title='Max number of rows to show in query result as one page')
                                 .col-sm-12(ng-show='paragraph.errMsg')

http://git-wip-us.apache.org/repos/asf/ignite/blob/50856911/modules/control-center-web/src/main/js/views/templates/layout.jade
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/views/templates/layout.jade b/modules/control-center-web/src/main/js/views/templates/layout.jade
index e9f50c3..a600dc9 100644
--- a/modules/control-center-web/src/main/js/views/templates/layout.jade
+++ b/modules/control-center-web/src/main/js/views/templates/layout.jade
@@ -20,21 +20,15 @@ html(ng-app='ignite-web-console')
         title=title
 
         block css
-            //- Font Awesome Icons
-            link(rel='stylesheet', href='//maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.css')
-
-            //- Font
-            link(rel='stylesheet', href='//fonts.googleapis.com/css?family=Roboto+Slab:700:serif|Roboto+Slab:400:serif')
-
-            link(rel='stylesheet', href='/stylesheets/style.css')
+            link(rel='stylesheet', href='/app.min.css')
 
         block scripts
             script(src='/common-utils.js')
             script(src='/app.min.js')
 
             // ignite:modules
-            script(src='/modules/navbar/main.js')
-            script(src='/modules/configuration-sidebar/main.js')
+            script(src='app/modules/navbar/main.js')
+            script(src='app/modules/configuration-sidebar/main.js')
             // endignite
 
             // ignite:plugins