You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by vo...@apache.org on 2016/11/09 08:38:37 UTC

[23/50] [abbrv] ignite git commit: Web console beta-5.

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/gulpfile.babel.js/paths.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/gulpfile.babel.js/paths.js b/modules/web-console/frontend/gulpfile.babel.js/paths.js
index 9134e44..6ebfbad 100644
--- a/modules/web-console/frontend/gulpfile.babel.js/paths.js
+++ b/modules/web-console/frontend/gulpfile.babel.js/paths.js
@@ -24,17 +24,20 @@ const destDir = path.resolve('build');
 const igniteModulesDir = process.env.IGNITE_MODULES ? path.join(path.normalize(process.env.IGNITE_MODULES), 'frontend') : './ignite_modules';
 const igniteModulesTemp = path.resolve('ignite_modules_temp');
 
-const jadePaths = [
-    './views/*.jade',
+const jadeViewsPaths = [
     './views/**/*.jade',
-    './app/helpers/**/*.jade',
-    './app/modules/states/configuration/**/*.jade',
-    './app/modules/sql/*.jade'
+    '!./views/configuration/*.jade'
 ];
 
-const resourcePaths = [
-    './public/**/*.png',
-    './public/*.ico'
+const jadeAppModulePaths = [
+    './app/modules/states/configuration/**/*.jade',
+    './app/modules/sql/*.jade',
+    './views/**/*.jade',
+    '!./views/*.jade',
+    '!./views/includes/*.jade',
+    '!./views/settings/*.jade',
+    '!./views/sql/*.jade',
+    '!./views/templates/*.jade'
 ];
 
 const jadeModulePaths = [
@@ -53,6 +56,11 @@ const appModulePaths = [
     igniteModulesDir + '/**/app/data/*.json'
 ];
 
+const resourcePaths = [
+    './public/**/*.png',
+    './public/*.ico'
+];
+
 const resourceModulePaths = [
     igniteModulesDir + '/**/images/*.png',
     igniteModulesDir + '/*.ico'
@@ -65,10 +73,11 @@ export {
     igniteModulesDir,
     igniteModulesTemp,
 
-    jadePaths,
-    resourcePaths,
-
+    jadeViewsPaths,
+    jadeAppModulePaths,
     jadeModulePaths,
+
+    resourcePaths,
     resourceModulePaths,
     appModulePaths
 };

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/gulpfile.babel.js/tasks/jade.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/gulpfile.babel.js/tasks/jade.js b/modules/web-console/frontend/gulpfile.babel.js/tasks/jade.js
index b150373..fe8bb09 100644
--- a/modules/web-console/frontend/gulpfile.babel.js/tasks/jade.js
+++ b/modules/web-console/frontend/gulpfile.babel.js/tasks/jade.js
@@ -16,19 +16,28 @@
  */
 
 import gulp from 'gulp';
+import ll from 'gulp-ll';
 import jade from 'gulp-jade';
-import sequence from 'gulp-sequence';
 
-import { jadePaths, jadeModulePaths, destDir } from '../paths';
+import { jadeViewsPaths, jadeAppModulePaths, jadeModulePaths, destDir } from '../paths';
 
 const jadeOptions = {
-    basedir: './'
+    basedir: './',
+    cache: true
 };
 
-gulp.task('jade', (cb) => sequence('jade:source', 'jade:ignite_modules', cb));
+ll.tasks(['jade:views', 'jade:app', 'jade:ignite_modules']);
 
-gulp.task('jade:source', () =>
-    gulp.src(jadePaths)
+gulp.task('jade', ['jade:views', 'jade:app', 'jade:ignite_modules']);
+
+gulp.task('jade:views', () =>
+    gulp.src(jadeViewsPaths)
+        .pipe(jade(jadeOptions))
+        .pipe(gulp.dest(destDir))
+);
+
+gulp.task('jade:app', () =>
+    gulp.src(jadeAppModulePaths)
         .pipe(jade(jadeOptions))
         .pipe(gulp.dest(destDir))
 );

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/gulpfile.babel.js/tasks/watch.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/gulpfile.babel.js/tasks/watch.js b/modules/web-console/frontend/gulpfile.babel.js/tasks/watch.js
index c179f9c..dfaa1a3 100644
--- a/modules/web-console/frontend/gulpfile.babel.js/tasks/watch.js
+++ b/modules/web-console/frontend/gulpfile.babel.js/tasks/watch.js
@@ -18,13 +18,15 @@
 import gulp from 'gulp';
 import sequence from 'gulp-sequence';
 
-import { jadePaths, jadeModulePaths, resourcePaths, resourceModulePaths, appModulePaths } from '../paths';
+import { jadeViewsPaths, jadeAppModulePaths, jadeModulePaths, resourcePaths, resourceModulePaths, appModulePaths } from '../paths';
 
 gulp.task('watch:ignite-modules', (cb) => sequence('clean:ignite-modules-temp', 'ignite:modules', cb));
 
 // Build + watch task.
 gulp.task('watch', ['build'], () => {
-    gulp.watch(jadePaths.concat(jadeModulePaths), ['jade']);
+    gulp.watch(jadeViewsPaths, ['jade:views']);
+    gulp.watch(jadeAppModulePaths.concat('./app/helpers/**/*.jade'), ['jade:app']);
+    gulp.watch(jadeModulePaths.concat('./app/helpers/**/*.jade'), ['jade:ignite_modules']);
     gulp.watch(resourcePaths, ['copy:resource:app']);
     gulp.watch(resourceModulePaths, ['copy:resource:ignite_modules']);
     gulp.watch(appModulePaths, ['watch:ignite-modules']);

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/gulpfile.babel.js/webpack/common.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/gulpfile.babel.js/webpack/common.js b/modules/web-console/frontend/gulpfile.babel.js/webpack/common.js
index e3d88b3..f6c2d87 100644
--- a/modules/web-console/frontend/gulpfile.babel.js/webpack/common.js
+++ b/modules/web-console/frontend/gulpfile.babel.js/webpack/common.js
@@ -43,7 +43,7 @@ try {
 }
 
 export default () => {
-    const assetsLoader = development ? 'url-loader' : 'file-loader';
+    const assetsLoader = 'file-loader';
 
     return {
         cache: true,

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/gulpfile.babel.js/webpack/environments/development.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/gulpfile.babel.js/webpack/environments/development.js b/modules/web-console/frontend/gulpfile.babel.js/webpack/environments/development.js
index 229760e..1550dfa 100644
--- a/modules/web-console/frontend/gulpfile.babel.js/webpack/environments/development.js
+++ b/modules/web-console/frontend/gulpfile.babel.js/webpack/environments/development.js
@@ -20,6 +20,10 @@ import webpack from 'webpack';
 
 import {destDir, rootDir, srcDir} from '../../paths';
 
+const devServerHost = 'localhost';
+const devServerPort = 9000;
+const devServerUrl = `http://${devServerHost}:${devServerPort}/`;
+
 export default () => {
     const plugins = [
         new webpack.HotModuleReplacementPlugin()
@@ -27,9 +31,12 @@ export default () => {
 
     return {
         entry: {
-            webpack: 'webpack-dev-server/client?http://localhost:9000/',
+            webpack: `webpack-dev-server/client?${devServerUrl}`,
             app: [path.join(srcDir, 'app.js'), 'webpack/hot/only-dev-server']
         },
+        output: {
+            publicPath: devServerUrl
+        },
         context: rootDir,
         debug: true,
         devtool: 'source-map',
@@ -60,10 +67,12 @@ export default () => {
                 aggregateTimeout: 1000,
                 poll: 2000
             },
-            stats: {colors: true},
-            port: 9000
+            stats: {
+                colors: true,
+                chunks: false
+            },
+            port: devServerPort
         },
-        stats: {colors: true},
         plugins
     };
 };

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/gulpfile.babel.js/webpack/environments/test.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/gulpfile.babel.js/webpack/environments/test.js b/modules/web-console/frontend/gulpfile.babel.js/webpack/environments/test.js
new file mode 100644
index 0000000..1c37196
--- /dev/null
+++ b/modules/web-console/frontend/gulpfile.babel.js/webpack/environments/test.js
@@ -0,0 +1,52 @@
+/*
+ * 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 webpack from 'webpack';
+
+const NODE_ENV = process.env.NODE_ENV || 'production';
+
+export default () => {
+
+    return {
+        cache: true,
+        node: {
+            fs: 'empty'
+        },
+
+        module: {
+            preLoaders: null
+        },
+
+        // Entry points.
+        entry: null,
+
+        // Output system.
+        output: null,
+        eslint: null,
+
+        // Load plugins.
+        plugins: [
+            new webpack.ProvidePlugin({
+                $: 'jquery',
+                jQuery: 'jquery',
+                _: 'lodash',
+                nv: 'nvd3'
+            }),
+            new webpack.DefinePlugin({NODE_ENV: JSON.stringify(NODE_ENV)})
+        ]
+    };
+};

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/gulpfile.babel.js/webpack/index.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/gulpfile.babel.js/webpack/index.js b/modules/web-console/frontend/gulpfile.babel.js/webpack/index.js
index 6682f9c..9b344dd 100644
--- a/modules/web-console/frontend/gulpfile.babel.js/webpack/index.js
+++ b/modules/web-console/frontend/gulpfile.babel.js/webpack/index.js
@@ -19,13 +19,15 @@ import _ from 'lodash';
 import commonConfig from './common';
 import devConfig from './environments/development';
 import prodConfig from './environments/production';
+import testConfig from './environments/test';
 
 const env = process.env.NODE_ENV || 'production';
 
 // Config by environments.
 const configs = {
     production: prodConfig,
-    development: devConfig
+    development: devConfig,
+    test: testConfig
 };
 
 // Load config file by environment

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/package.json
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/package.json b/modules/web-console/frontend/package.json
index 7ea2893..fe8c295 100644
--- a/modules/web-console/frontend/package.json
+++ b/modules/web-console/frontend/package.json
@@ -5,9 +5,9 @@
   "private": true,
   "scripts": {
     "dev": "cross-env NODE_ENV=development gulp watch",
-    "build": "cross-env NODE_ENV=production gulp build",
-    "test": "karma start ./test/karma.conf.js",
-    "eslint": "eslint --format node_modules/eslint-friendly-formatter gulpfile.babel.js/ app/ controllers/ generator/ ignite_modules/ ignite_modules_temp/ -- --eff-by-issue"
+    "build": "cross-env NODE_ENV=production gulp build --no-ll",
+    "test": "cross-env NODE_ENV=test karma start ./test/karma.conf.js",
+    "eslint": "eslint --format node_modules/eslint-friendly-formatter gulpfile.babel.js/ app/ controllers/ ignite_modules/ ignite_modules_temp/ -- --eff-by-issue"
   },
   "author": "",
   "contributors": [
@@ -57,7 +57,6 @@
     "jszip": "^3.0.0",
     "lodash": "^4.8.2",
     "nvd3": "^1.8.3",
-    "query-command-supported": "^1.0.0",
     "raleway-webfont": "^3.0.1",
     "roboto-font": "^0.1.0",
     "socket.io-client": "^1.4.6",
@@ -67,7 +66,7 @@
     "assets-webpack-plugin": "^3.2.0",
     "autoprefixer-core": "^6.0.1",
     "babel-core": "^6.7.6",
-    "babel-eslint": "^6.0.4",
+    "babel-eslint": "^7.0.0",
     "babel-loader": "^6.2.4",
     "babel-plugin-add-module-exports": "^0.2.1",
     "babel-plugin-transform-builtin-extend": "^1.1.0",
@@ -79,16 +78,17 @@
     "chai": "^3.5.0",
     "cross-env": "^1.0.7",
     "css-loader": "^0.23.0",
-    "eslint": "^2.9.0",
+    "eslint": "^3.0.0",
     "eslint-friendly-formatter": "^2.0.5",
     "eslint-loader": "^1.0.0",
     "expose-loader": "^0.7.1",
     "extract-text-webpack-plugin": "^1.0.1",
     "file-loader": "^0.9.0",
     "gulp": "^3.9.1",
-    "gulp-eslint": "^2.0.0",
+    "gulp-eslint": "^3.0.0",
     "gulp-inject": "^4.0.0",
     "gulp-jade": "^1.1.0",
+    "gulp-ll": "^1.0.4",
     "gulp-rimraf": "^0.2.0",
     "gulp-sequence": "^0.4.1",
     "gulp-util": "^3.0.7",
@@ -102,6 +102,7 @@
     "karma-babel-preprocessor": "^6.0.1",
     "karma-jasmine": "^1.0.2",
     "karma-mocha": "^1.0.1",
+    "karma-mocha-reporter": "^2.2.0",
     "karma-phantomjs-launcher": "^1.0.0",
     "karma-teamcity-reporter": "^1.0.0",
     "karma-webpack": "^1.7.0",
@@ -115,7 +116,6 @@
     "require-dir": "^0.3.0",
     "resolve-url-loader": "^1.4.3",
     "sass-loader": "^3.1.1",
-    "should": "^9.0.2",
     "style-loader": "^0.13.1",
     "url": "^0.11.0",
     "url-loader": "^0.5.6",

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/public/stylesheets/style.scss
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/public/stylesheets/style.scss b/modules/web-console/frontend/public/stylesheets/style.scss
index 0784560..0f8f49a 100644
--- a/modules/web-console/frontend/public/stylesheets/style.scss
+++ b/modules/web-console/frontend/public/stylesheets/style.scss
@@ -82,6 +82,11 @@ hr {
   vertical-align: middle;
 }
 
+.table .ui-grid-settings {
+    float: left;
+    padding-right: 10px;
+}
+
 ul.navbar-nav, .sidebar-nav {
     li.active > a {
         color: $link-color;
@@ -359,6 +364,13 @@ h1, h2, h3, h4, h5, h6 {
     margin-right: -2px;
 }
 
+// Modal icon
+.modal-header h4 > i.fa {
+    cursor: default;
+    float: left;
+    line-height: $modal-title-line-height;
+}
+
 .modal .modal-dialog {
     width: 650px;
 }
@@ -623,7 +635,7 @@ button.form-control {
         margin-top: 30px;
     }
 
-    .btn-group {
+    .btn-group:last-of-type {
         margin-right: 0;
     }
 
@@ -665,6 +677,16 @@ button.form-control {
         border-top: 1px solid $ignite-border-color;
 
         padding: 10px 10px;
+
+        input[type="checkbox"] {
+            line-height: 20px;
+            margin-right: 5px;
+        }
+
+        label {
+            line-height: 20px !important;
+            vertical-align: middle;
+        }
     }
 
     .sql-result {
@@ -686,6 +708,16 @@ button.form-control {
 
         .total {
             padding: 10px 10px;
+
+            input[type="checkbox"] {
+                line-height: 20px;
+                margin-right: 5px;
+            }
+
+            label {
+                line-height: 20px !important;
+                vertical-align: middle;
+            }
         }
 
         .table {
@@ -1318,12 +1350,6 @@ label {
     margin: 0 5px;
 }
 
-.fieldButton {
-    float: right;
-    margin-left: 5px;
-    margin-right: 0;
-}
-
 .fa {
     cursor: pointer;
 }
@@ -1639,13 +1665,18 @@ th[st-sort] {
     z-index: 900;
 
     a {
+        color: $input-color-placeholder;
         background-color: white;
         margin-left: 5px;
         font-size: 0.9em;
     }
 
-    .inactive {
-        color: $input-color-placeholder;
+    a + a {
+        margin-left: 10px
+    }
+
+    a.active {
+        color: $brand-primary;
     }
 }
 
@@ -2170,3 +2201,29 @@ html,body,.splash-screen {
         padding: 0;
     }
 }
+
+// Fix for incorrect tooltip placement after fast show|hide.
+.tooltip.ng-leave {
+    transition: none !important; /* Disable transitions. */
+    animation: none 0s !important; /* Disable keyframe animations. */
+}
+
+// Fix for incorrect dropdown placement.
+.select.dropdown-menu.ng-leave {
+    transition: none !important; /* Disable transitions. */
+    animation: none 0s !important; /* Disable keyframe animations. */
+}
+.disable-animations {
+    // Use this for transitions
+    &.ng-enter,
+    &.ng-leave,
+    &.ng-animate {
+        -webkit-transition: none !important;
+        transition: none !important;
+    }
+    // Use this for keyframe animations
+    &.ng-animate {
+        -webkit-animation: none 0s;
+        animation: none 0s;
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/test/karma.conf.babel.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/test/karma.conf.babel.js b/modules/web-console/frontend/test/karma.conf.babel.js
new file mode 100644
index 0000000..76a0ba0
--- /dev/null
+++ b/modules/web-console/frontend/test/karma.conf.babel.js
@@ -0,0 +1,91 @@
+/*
+ * 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 webpackConfig from '../gulpfile.babel.js/webpack';
+import path from 'path';
+
+const basePath = path.resolve('./');
+
+export default (config) => {
+    config.set({
+        // Base path that will be used to resolve all patterns (eg. files, exclude).
+        basePath: basePath,
+
+        // Frameworks to use available frameworks: https://npmjs.org/browse/keyword/karma-adapter
+        frameworks: ['mocha'],
+
+        // List of files / patterns to load in the browser.
+        files: [
+            'test/**/*.test.js'
+        ],
+
+        plugins: [
+            require('karma-phantomjs-launcher'),
+            require('karma-teamcity-reporter'),
+            require('karma-mocha-reporter'),
+            require('karma-webpack'),
+            require('karma-mocha')
+        ],
+
+        // Preprocess matching files before serving them to the browser
+        // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor.
+        preprocessors: {
+            'test/**/*.js': ['webpack']
+        },
+        webpack: webpackConfig,
+
+        webpackMiddleware: {
+            noInfo: true
+        },
+
+        // Test results reporter to use
+        // possible values: 'dots', 'progress'
+        // available reporters: https://npmjs.org/browse/keyword/karma-reporter.
+        reporters: ['mocha'],
+
+        // web server port
+        port: 9876,
+
+        // enable / disable colors in the output (reporters and logs)
+        colors: true,
+
+        // level of logging
+        // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
+        logLevel: config.LOG_INFO,
+
+        // enable / disable watching file and executing tests whenever any file changes
+        autoWatch: true,
+
+        // start these browsers
+        // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
+        browsers: ['PhantomJS'],
+
+        // Continuous Integration mode
+        // if true, Karma captures browsers, runs the tests and exits
+        singleRun: true,
+
+        // Concurrency level
+        // how many browser should be started simultaneous
+        concurrency: Infinity,
+
+        client: {
+            mocha: {
+                ui: 'tdd'
+            }
+        }
+    });
+};

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/test/karma.conf.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/test/karma.conf.js b/modules/web-console/frontend/test/karma.conf.js
index e13ba00..a8b1b11 100644
--- a/modules/web-console/frontend/test/karma.conf.js
+++ b/modules/web-console/frontend/test/karma.conf.js
@@ -15,99 +15,5 @@
  * limitations under the License.
  */
 
-const path = require('path');
-const webpack = require('webpack');
-
-const basePath = path.resolve('./');
-
-module.exports = function(config) {
-    config.set({
-        // Base path that will be used to resolve all patterns (eg. files, exclude).
-        basePath: basePath,
-
-        // Frameworks to use available frameworks: https://npmjs.org/browse/keyword/karma-adapter
-        frameworks: ['mocha'],
-
-        // List of files / patterns to load in the browser.
-        files: [
-            'test/**/*.test.js'
-        ],
-
-        plugins: [
-            require('karma-phantomjs-launcher'),
-            require('karma-teamcity-reporter'),
-            require('karma-webpack'),
-            require('karma-mocha')
-        ],
-
-        // Preprocess matching files before serving them to the browser
-        // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor.
-        preprocessors: {
-            'test/**/*.js': ['webpack']
-        },
-
-        webpack: {
-            module: {
-                loaders: [
-                    {
-                        test: /\.json$/,
-                        loader: 'json'
-                    },
-                    {
-                        test: /\.js$/,
-                        loader: 'babel',
-                        exclude: /node_modules/
-                    }
-                ]
-            },
-            resolve: {
-                extensions: ["", ".js"]
-            },
-            plugins: [
-                new webpack.ProvidePlugin({
-                    _: 'lodash'
-                })
-            ]
-        },
-
-        webpackMiddleware: {
-            noInfo: true
-        },
-
-        // Test results reporter to use
-        // possible values: 'dots', 'progress'
-        // available reporters: https://npmjs.org/browse/keyword/karma-reporter.
-        reporters: ['teamcity'],
-
-        // web server port
-        port: 9876,
-
-        // enable / disable colors in the output (reporters and logs)
-        colors: true,
-
-        // level of logging
-        // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
-        logLevel: config.LOG_INFO,
-
-        // enable / disable watching file and executing tests whenever any file changes
-        autoWatch: true,
-
-        // start these browsers
-        // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
-        browsers: ['PhantomJS'],
-
-        // Continuous Integration mode
-        // if true, Karma captures browsers, runs the tests and exits
-        singleRun: true,
-
-        // Concurrency level
-        // how many browser should be started simultaneous
-        concurrency: Infinity,
-
-        client: {
-            mocha: {
-                ui: 'tdd'
-            }
-        }
-    });
-};
+require('babel-core/register');
+module.exports = require('./karma.conf.babel.js').default;

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/test/unit/JavaTransformer.test.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/test/unit/JavaTransformer.test.js b/modules/web-console/frontend/test/unit/JavaTransformer.test.js
new file mode 100644
index 0000000..3f39000
--- /dev/null
+++ b/modules/web-console/frontend/test/unit/JavaTransformer.test.js
@@ -0,0 +1,57 @@
+/*
+ * 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 JavaTypes from '../../app/services/JavaTypes.service.js';
+
+import generator from '../../app/modules/configuration/generator/ConfigurationGenerator';
+import transformer from '../../app/modules/configuration/generator/JavaTransformer.service';
+
+import { assert } from 'chai';
+
+suite.skip('JavaTransformerTestsSuite', () => {
+    test('AtomicConfiguration', () => {
+        const ConfigurationGenerator = generator[1]();
+        const JavaTransformer = transformer[1][2](JavaTypes[1](), ConfigurationGenerator);
+
+        const acfg = {
+            atomicSequenceReserveSize: 1001,
+            backups: 1,
+            cacheMode: 'LOCAL'
+        };
+
+        const bean = ConfigurationGenerator.clusterAtomics(acfg);
+
+        console.log(JavaTransformer.generateSection(bean));
+    });
+
+    test('IgniteConfiguration', () => {
+        const ConfigurationGenerator = generator[1]();
+        const JavaTransformer = transformer[1][2](JavaTypes[1](), ConfigurationGenerator);
+
+        const clusterCfg = {
+            atomics: {
+                atomicSequenceReserveSize: 1001,
+                backups: 1,
+                cacheMode: 'LOCAL'
+            }
+        };
+
+        const bean = ConfigurationGenerator.igniteConfiguration(clusterCfg);
+
+        console.log(JavaTransformer.toClassFile(bean, 'config', 'ServerConfigurationFactory', null));
+    });
+});

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/test/unit/JavaTypes.test.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/test/unit/JavaTypes.test.js b/modules/web-console/frontend/test/unit/JavaTypes.test.js
index 7b12168..2df8c6a 100644
--- a/modules/web-console/frontend/test/unit/JavaTypes.test.js
+++ b/modules/web-console/frontend/test/unit/JavaTypes.test.js
@@ -17,7 +17,11 @@
 
 import JavaTypes from '../../app/services/JavaTypes.service.js';
 
-const INSTANCE = new JavaTypes();
+import ClusterDflts from '../../app/modules/configuration/generator/defaults/cluster.provider';
+import CacheDflts from '../../app/modules/configuration/generator/defaults/cache.provider';
+import IgfsDflts from '../../app/modules/configuration/generator/defaults/igfs.provider';
+
+const INSTANCE = new JavaTypes((new ClusterDflts()).$get[0](), (new CacheDflts()).$get[0](), (new IgfsDflts()).$get[0]());
 
 import { assert } from 'chai';
 
@@ -43,6 +47,23 @@ suite('JavaTypesTestsSuite', () => {
         assert.equal(INSTANCE.nonBuiltInClass('my.package.CustomClass'), true);
     });
 
+    test('nonEnum', () => {
+        assert.equal(INSTANCE.nonEnum('org.apache.ignite.cache.CacheMode'), false);
+        assert.equal(INSTANCE.nonEnum('org.apache.ignite.transactions.TransactionConcurrency'), false);
+        assert.equal(INSTANCE.nonEnum('org.apache.ignite.cache.CacheWriteSynchronizationMode'), false);
+        assert.equal(INSTANCE.nonEnum('org.apache.ignite.igfs.IgfsIpcEndpointType'), false);
+        assert.equal(INSTANCE.nonEnum('java.io.Serializable'), true);
+        assert.equal(INSTANCE.nonEnum('BigDecimal'), true);
+    });
+
+    test('shortClassName', () => {
+        assert.equal(INSTANCE.shortClassName('java.math.BigDecimal'), 'BigDecimal');
+        assert.equal(INSTANCE.shortClassName('int'), 'int');
+        assert.equal(INSTANCE.shortClassName('java.lang.Integer'), 'Integer');
+        assert.equal(INSTANCE.shortClassName('java.util.UUID'), 'UUID');
+        assert.equal(INSTANCE.shortClassName('Abstract'), 'Abstract');
+    });
+
     test('fullClassName', () => {
         assert.equal(INSTANCE.fullClassName('BigDecimal'), 'java.math.BigDecimal');
     });

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/test/unit/SharpTransformer.test.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/test/unit/SharpTransformer.test.js b/modules/web-console/frontend/test/unit/SharpTransformer.test.js
new file mode 100644
index 0000000..20de266
--- /dev/null
+++ b/modules/web-console/frontend/test/unit/SharpTransformer.test.js
@@ -0,0 +1,55 @@
+/*
+ * 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 generator from '../../app/modules/configuration/generator/PlatformGenerator';
+import transformer from '../../app/modules/configuration/generator/SharpTransformer.service';
+
+import { assert } from 'chai';
+
+suite.skip('SharpTransformerTestsSuite', () => {
+    test('AtomicConfiguration', () => {
+        const PlatformGenerator = generator[1]();
+        const SharpTransformer = transformer[1](PlatformGenerator);
+
+        const acfg = {
+            atomicSequenceReserveSize: 1001,
+            backups: 1,
+            cacheMode: 'LOCAL'
+        };
+
+        const bean = PlatformGenerator.clusterAtomics(acfg);
+
+        console.log(SharpTransformer.generateSection(bean));
+    });
+
+    test('IgniteConfiguration', () => {
+        const PlatformGenerator = generator[1]();
+        const SharpTransformer = transformer[1](PlatformGenerator);
+
+        const clusterCfg = {
+            atomics: {
+                atomicSequenceReserveSize: 1001,
+                backups: 1,
+                cacheMode: 'LOCAL'
+            }
+        };
+
+        const bean = PlatformGenerator.igniteConfiguration(clusterCfg);
+
+        console.log(SharpTransformer.toClassFile(bean, 'config', 'ServerConfigurationFactory', null));
+    });
+});

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/test/unit/SpringTransformer.test.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/test/unit/SpringTransformer.test.js b/modules/web-console/frontend/test/unit/SpringTransformer.test.js
new file mode 100644
index 0000000..7998f66
--- /dev/null
+++ b/modules/web-console/frontend/test/unit/SpringTransformer.test.js
@@ -0,0 +1,57 @@
+/*
+ * 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 JavaTypes from '../../app/services/JavaTypes.service.js';
+
+import generator from '../../app/modules/configuration/generator/ConfigurationGenerator';
+import transformer from '../../app/modules/configuration/generator/SpringTransformer.service';
+
+import { assert } from 'chai';
+
+suite.skip('SpringTransformerTestsSuite', () => {
+    test('AtomicConfiguration', () => {
+        const ConfigurationGenerator = generator[1]();
+        const SpringTransformer = transformer[1][2](JavaTypes[1](), ConfigurationGenerator);
+
+        const acfg = {
+            atomicSequenceReserveSize: 1001,
+            backups: 1,
+            cacheMode: 'LOCAL'
+        };
+
+        const bean = ConfigurationGenerator.clusterAtomics(acfg);
+
+        console.log(SpringTransformer.generateSection(bean));
+    });
+
+    test('IgniteConfiguration', () => {
+        const ConfigurationGenerator = generator[1]();
+        const SpringTransformer = transformer[1][2](JavaTypes[1](), ConfigurationGenerator);
+
+        const cfg = {
+            atomics: {
+                atomicSequenceReserveSize: 1001,
+                backups: 1,
+                cacheMode: 'LOCAL'
+            }
+        };
+
+        const bean = ConfigurationGenerator.igniteConfiguration(cfg);
+
+        console.log(SpringTransformer.generate(bean));
+    });
+});

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/test/unit/SqlTypes.test.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/test/unit/SqlTypes.test.js b/modules/web-console/frontend/test/unit/SqlTypes.test.js
index 3cfaafc..2d54bdf 100644
--- a/modules/web-console/frontend/test/unit/SqlTypes.test.js
+++ b/modules/web-console/frontend/test/unit/SqlTypes.test.js
@@ -15,23 +15,6 @@
  * limitations under the License.
  */
 
-/*
- * 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 SqlTypes from '../../app/services/SqlTypes.service.js';
 
 const INSTANCE = new SqlTypes();

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/test/unit/Version.test.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/test/unit/Version.test.js b/modules/web-console/frontend/test/unit/Version.test.js
new file mode 100644
index 0000000..a67fde8
--- /dev/null
+++ b/modules/web-console/frontend/test/unit/Version.test.js
@@ -0,0 +1,82 @@
+/*
+ * 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 VersionService from '../../app/modules/configuration/Version.service.js';
+
+const INSTANCE = new VersionService();
+
+import { assert } from 'chai';
+
+suite('VersionServiceTestsSuite', () => {
+    test('Check patch version', () => {
+        assert.equal(INSTANCE.compare('1.7.2', '1.7.1'), 1);
+    });
+
+    test('Check minor version', () => {
+        assert.equal(INSTANCE.compare('1.8.1', '1.7.1'), 1);
+    });
+
+    test('Check major version', () => {
+        assert.equal(INSTANCE.compare('2.7.1', '1.7.1'), 1);
+    });
+
+    test('Version a > b', () => {
+        assert.equal(INSTANCE.compare('1.7.0', '1.5.0'), 1);
+    });
+
+    test('Version a = b', () => {
+        assert.equal(INSTANCE.compare('1.7.0', '1.7.0'), 0);
+    });
+
+    test('Version a < b', () => {
+        assert.equal(INSTANCE.compare('1.5.1', '1.5.2'), -1);
+    });
+
+    test('Check since call', () => {
+        assert.equal(INSTANCE.since('1.6.0', '1.5.0'), true);
+    });
+
+    test('Check wrong since call', () => {
+        assert.equal(INSTANCE.since('1.3.0', '1.5.0'), false);
+    });
+
+    test('Parse 1.7.0-SNAPSHOT', () => {
+        const version = INSTANCE.parse('1.7.0-SNAPSHOT');
+        assert.equal(version.major, 1);
+        assert.equal(version.minor, 7);
+        assert.equal(version.maintenance, 0);
+        assert.equal(version.stage, 'SNAPSHOT');
+        assert.equal(version.revTs, 0);
+        assert.isNull(version.revHash);
+    });
+
+    test('Parse strip -DEV 1.7.0-DEV', () => {
+        const version = INSTANCE.parse('1.7.0-DEV');
+        assert.equal(version.major, 1);
+        assert.equal(version.minor, 7);
+        assert.equal(version.maintenance, 0);
+        assert.equal(version.stage, '');
+    });
+
+    test('Parse strip -n/a 1.7.0-n/a', () => {
+        const version = INSTANCE.parse('1.7.0-n/a');
+        assert.equal(version.major, 1);
+        assert.equal(version.minor, 7);
+        assert.equal(version.maintenance, 0);
+        assert.equal(version.stage, '');
+    });
+});

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/test/unit/defaultName.filter.test.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/test/unit/defaultName.filter.test.js b/modules/web-console/frontend/test/unit/defaultName.filter.test.js
new file mode 100644
index 0000000..5f28290
--- /dev/null
+++ b/modules/web-console/frontend/test/unit/defaultName.filter.test.js
@@ -0,0 +1,38 @@
+/*
+ * 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 defaultName from '../../app/filters/default-name.filter';
+
+import { assert } from 'chai';
+
+const INSTANCE = defaultName[0]();
+
+suite('defaultName', () => {
+    test('defaultName filter', () => {
+        assert.equal(INSTANCE(''), '<default>');
+        assert.equal(INSTANCE(null), '<default>');
+        assert.equal(INSTANCE(undefined), '<default>');
+        assert.equal(INSTANCE('', false), '<default>');
+        assert.equal(INSTANCE(null, false), '<default>');
+        assert.equal(INSTANCE(undefined, false), '<default>');
+        assert.equal(INSTANCE('', true), '&lt;default&gt;');
+        assert.equal(INSTANCE(null, true), '&lt;default&gt;');
+        assert.equal(INSTANCE(undefined, true), '&lt;default&gt;');
+        assert.equal(INSTANCE("name", false), 'name');
+        assert.equal(INSTANCE("name", true), 'name');
+    });
+});

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/views/configuration/caches.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/views/configuration/caches.jade b/modules/web-console/frontend/views/configuration/caches.jade
index a1218ec..74d5505 100644
--- a/modules/web-console/frontend/views/configuration/caches.jade
+++ b/modules/web-console/frontend/views/configuration/caches.jade
@@ -45,9 +45,10 @@ include ../../app/helpers/jade/mixins.jade
 
                         div(ng-show='ui.expanded')
                             include ../../app/modules/states/configuration/caches/concurrency.jade
+                            include ../../app/modules/states/configuration/caches/near-cache-client.jade
+                            include ../../app/modules/states/configuration/caches/near-cache-server.jade
                             include ../../app/modules/states/configuration/caches/node-filter.jade
                             include ../../app/modules/states/configuration/caches/rebalance.jade
-                            include ../../app/modules/states/configuration/caches/server-near-cache.jade
                             include ../../app/modules/states/configuration/caches/statistics.jade
 
                             +advanced-options-toggle-default

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/views/configuration/clusters.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/views/configuration/clusters.jade b/modules/web-console/frontend/views/configuration/clusters.jade
index b79b1ea..8a3a194 100644
--- a/modules/web-console/frontend/views/configuration/clusters.jade
+++ b/modules/web-console/frontend/views/configuration/clusters.jade
@@ -41,10 +41,10 @@ include ../../app/helpers/jade/mixins.jade
                         +advanced-options-toggle-default
 
                         div(ng-show='ui.expanded')
-                            
                             include ../../app/modules/states/configuration/clusters/atomic.jade
                             include ../../app/modules/states/configuration/clusters/binary.jade
                             include ../../app/modules/states/configuration/clusters/cache-key-cfg.jade
+                            include ../../app/modules/states/configuration/clusters/checkpoint.jade
                             include ../../app/modules/states/configuration/clusters/collision.jade
                             include ../../app/modules/states/configuration/clusters/communication.jade
                             include ../../app/modules/states/configuration/clusters/connector.jade
@@ -53,6 +53,7 @@ include ../../app/helpers/jade/mixins.jade
                             include ../../app/modules/states/configuration/clusters/events.jade
                             include ../../app/modules/states/configuration/clusters/failover.jade
                             include ../../app/modules/states/configuration/clusters/igfs.jade
+                            include ../../app/modules/states/configuration/clusters/load-balancing.jade
                             include ../../app/modules/states/configuration/clusters/logger.jade
                             include ../../app/modules/states/configuration/clusters/marshaller.jade
                             include ../../app/modules/states/configuration/clusters/metrics.jade

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/views/configuration/domains-import.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/views/configuration/domains-import.jade b/modules/web-console/frontend/views/configuration/domains-import.jade
index e2eaf97..99014bc 100644
--- a/modules/web-console/frontend/views/configuration/domains-import.jade
+++ b/modules/web-console/frontend/views/configuration/domains-import.jade
@@ -28,8 +28,10 @@ mixin td-ellipses-lbl(w, lbl)
         .modal-content(ignite-loading='importDomainFromDb' ignite-loading-text='{{importDomain.loadingOptions.text}}')
             #errors-container.modal-header.header
                 button.close(ng-click='$hide()' aria-hidden='true') &times;
-                h4.modal-title(ng-if='!importDomain.demo') Import domain models from database
-                h4.modal-title(ng-if='importDomain.demo') Import domain models from demo database
+                h4.modal-title() 
+                    i.fa.fa-database
+                    span(ng-if='!importDomain.demo') Import domain models from database
+                    span(ng-if='importDomain.demo') Import domain models from demo database
             .modal-body
                 .import-domain-model-wizard-page(ng-if='importDomain.action == "drivers" && !importDomain.jdbcDriversNotFound')
                 .import-domain-model-wizard-page(ng-if='importDomain.action == "drivers" && importDomain.jdbcDriversNotFound')
@@ -144,14 +146,16 @@ mixin td-ellipses-lbl(w, lbl)
                     -var form = 'optionsForm'
 
                     form.form-horizontal(name=form novalidate)
-                        .settings-row.settings-row_small-label
-                            +java-package('Package:', 'ui.packageName', '"domainPackageName"', true, true, 'Package that will be used for POJOs generation')(data-container='.modal-domain-import')
                         .settings-row
                             +checkbox('Use Java built-in types for keys', 'ui.builtinKeys', '"domainBuiltinKeys"', 'Use Java built-in types like "Integer", "Long", "String" instead of POJO generation in case when table primary key contains only one field')
                         .settings-row
                             +checkbox('Use primitive types for NOT NULL table columns', 'ui.usePrimitives', '"domainUsePrimitives"', 'Use primitive types like "int", "long", "double" for POJOs fields generation in case of NOT NULL columns')
                         .settings-row
                             +checkbox('Generate aliases for query fields', 'ui.generateAliases', '"domainGenerateAliases"', 'Generate aliases for query fields with database field names when database field name differ from Java field name')
+                        .settings-row
+                            +checkbox('Generate POJO classes', 'ui.generatePojo', '"domainGeneratePojo"', 'If selected then POJO classes will be generated from database tables')
+                        .settings-row.settings-row_small-label(ng-show='ui.generatePojo')
+                            +java-package('Package:', 'ui.packageName', '"domainPackageName"', true, true, 'Package that will be used for POJOs generation')(data-container='.modal-domain-import')
                         .settings-row.settings-row_small-label
                             +ignite-form-field-dropdown('Clusters:', 'ui.generatedCachesClusters', '"generatedCachesClusters"', false, false, true,
                                 'Choose clusters for generated caches', '', 'clusters',
@@ -160,4 +164,4 @@ mixin td-ellipses-lbl(w, lbl)
             .modal-footer
                 label(ng-hide='importDomain.action == "drivers" || (importDomain.action == "connect" && importDomain.demo)').labelField {{importDomain.info}}
                 a.btn.btn-primary(ng-hide='importDomain.action == "drivers" || importDomain.action == "connect"' ng-click='importDomainPrev()' bs-tooltip='' data-title='{{prevTooltipText()}}' data-placement='bottom') Prev
-                a.btn.btn-primary(ng-click='importDomainNext()' ng-disabled='!importDomainNextAvailable()' bs-tooltip='' data-title='{{nextTooltipText()}}' data-placement='bottom') {{importDomain.button}}
+                a.btn.btn-primary(ng-click='importDomainNext(optionsForm)' ng-disabled='!importDomainNextAvailable()' bs-tooltip='' data-title='{{nextTooltipText()}}' data-placement='bottom') {{importDomain.button}}

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/views/configuration/summary-project-structure.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/views/configuration/summary-project-structure.jade b/modules/web-console/frontend/views/configuration/summary-project-structure.jade
index aa09437..29d4538 100644
--- a/modules/web-console/frontend/views/configuration/summary-project-structure.jade
+++ b/modules/web-console/frontend/views/configuration/summary-project-structure.jade
@@ -19,7 +19,7 @@
         button.close(id='summary-project-structure-close' ng-click='$hide()') &times;
     .popover-content
         treecontrol.tree-classic(tree-model='projectStructure' options='projectStructureOptions' expanded-nodes='projectStructureExpanded')
-            span(ng-switch='' on='node.type')
+            span(ng-switch='node.type')
                 span(ng-switch-when='folder')
                     label {{node.name}}
                 span(ng-switch-when='file')

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/views/configuration/summary.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/views/configuration/summary.jade b/modules/web-console/frontend/views/configuration/summary.jade
index 0d30df8..d041fea 100644
--- a/modules/web-console/frontend/views/configuration/summary.jade
+++ b/modules/web-console/frontend/views/configuration/summary.jade
@@ -53,16 +53,16 @@ mixin hard-link(ref, txt)
                         label Server
 
                     .panel-collapse(id='server' role='tabpanel' bs-collapse-target)
-                        ignite-ui-ace-tabs.summary-tabs
+                        .summary-tabs(ignite-ui-ace-tabs)
                             div(bs-tabs data-bs-active-pane="tabsServer.activeTab" template='configuration/summary-tabs.html')
                                 div(bs-pane title='XML')
-                                    ignite-ui-ace-xml(ng-if='tabsServer.activeTab == 0 || tabsServer.init[0]' ng-init='tabsServer.init[0] = true' data-master='cluster' data-no-deep-watch)
+                                    ignite-ui-ace-spring(ng-if='tabsServer.activeTab == 0 || tabsServer.init[0]' ng-init='tabsServer.init[0] = true' data-master='cluster' data-generator='igniteConfiguration' data-no-deep-watch)
                                 div(bs-pane title='Java')
-                                    ignite-ui-ace-java(ng-if='tabsServer.activeTab == 1 || tabsServer.init[1]' ng-init='tabsServer.init[1] = true' data-master='cluster' data-no-deep-watch)
+                                    ignite-ui-ace-java(ng-if='tabsServer.activeTab == 1 || tabsServer.init[1]' ng-init='tabsServer.init[1] = true' data-master='cluster' data-generator='igniteConfiguration' data-no-deep-watch)
                                 div(bs-pane title='POM')
-                                    ignite-ui-ace-pom(ng-if='tabsServer.activeTab == 2 || tabsServer.init[2]' ng-init='tabsServer.init[2] = true' data-cluster='cluster' data-no-deep-watch)
+                                    ignite-ui-ace-pom(ng-if='tabsServer.activeTab == 2 || tabsServer.init[2]' ng-init='tabsServer.init[2] = true' data-cluster='cluster' data-generator='igniteConfiguration' data-no-deep-watch)
                                 div(bs-pane title='Dockerfile')
-                                    ignite-ui-ace-docker(ng-if='tabsServer.activeTab == 3 || tabsServer.init[3]' ng-init='tabsServer.init[3] = true' data-cluster='cluster' data-no-deep-watch ng-model='ctrl.data.docker')
+                                    ignite-ui-ace-docker(ng-if='tabsServer.activeTab == 3 || tabsServer.init[3]' ng-init='tabsServer.init[3] = true' data-cluster='cluster' data-generator='igniteConfiguration' data-no-deep-watch ng-model='ctrl.data.docker')
 
                 .panel.panel-default
                     .panel-heading(role='tab' bs-collapse-toggle)
@@ -70,53 +70,14 @@ mixin hard-link(ref, txt)
                         label Client
 
                     .panel-collapse(id='client' role='tabpanel' bs-collapse-target)
-                        -var form = 'clientForm'
-                        form(name=form novalidate)
-                            -var nearCfg = 'ctrl.cluster.clientNearCfg'
-                            -var nearCfgEvictionPolicy = nearCfg + '.nearEvictionPolicy[' + nearCfg + '.nearEvictionPolicy.kind]'
-
-                            .group-content
-                                .settings-row(ng-if='true')
-                                    .col-xs-8.col-sm-8.col-md-7
-                                        +ignite-form-field-number('Near cache start size:', nearCfg + '.nearStartSize', '"nearStartSize"', false, false, '375000', false, false, false, 'Initial cache size for near cache which will be used to pre-create internal hash table after start')
-
-                                .settings-row(ng-if='true')
-                                    .col-xs-8.col-sm-8.col-md-7
-                                        +ignite-form-field-dropdown('Near cache eviction policy', nearCfg + '.nearEvictionPolicy.kind', '"evictionPolicies"', false, false, false, 'Not set', false, '[\
-                                                {value: "LRU", label: "LRU"},\
-                                                {value: "FIFO", label: "FIFO"},\
-                                                {value: "SORTED", label: "Sorted"},\
-                                                {value: undefined, label: "Not set"}\
-                                            ]', 'Near cache eviction policy')
-
-                                    span(ng-if='#{nearCfg}.nearEvictionPolicy.kind')
-                                        a.customize(
-                                            ng-show='ctrl.__form.expanded'
-                                            ng-click='ctrl.__form.expanded = false'
-                                        ) Hide settings
-                                        a.customize(
-                                            ng-hide='ctrl.__form.expanded'
-                                            ng-click='ctrl.__form.expanded = true'
-                                        ) Show settings
-
-                                .settings-row
-                                    .panel-details.col-xs-12.col-sm-12.col-md-7(ng-if='ctrl.__form.expanded && #{nearCfg}.nearEvictionPolicy.kind')
-                                        .details-row
-                                            +ignite-form-field-number('Batch size:', nearCfgEvictionPolicy + '.batchSize', '"batchSize"', false, false, '1', false, false, false, 'Number of entries to remove on shrink')
-
-                                        .details-row
-                                            +ignite-form-field-number('Max memory size:', nearCfgEvictionPolicy + '.maxMemorySize', '"maxMemorySize"', false, false, '0', false, false, false, 'Maximum allowed cache size in bytes')
-
-                                        .details-row
-                                            +ignite-form-field-number('Max size:', nearCfgEvictionPolicy + '.maxSize', '"maxSize"', false, false, '100000', false, false, false, 'Maximum allowed size of cache before entry will start getting evicted')
-
                         .summary-tabs(ignite-ui-ace-tabs)
                             div(bs-tabs data-bs-active-pane="tabsClient.activeTab" template='configuration/summary-tabs.html')
                                 div(bs-pane title='XML')
-                                    ignite-ui-ace-xml(ng-if='tabsClient.activeTab == 0 || tabsClient.init[0]' ng-init='tabsClient.init[0] = true' data-master='cluster' data-no-deep-watch data-cluster-cfg='#{nearCfg}')
+                                    ignite-ui-ace-spring(ng-if='tabsClient.activeTab == 0 || tabsClient.init[0]' ng-init='tabsClient.init[0] = true' data-master='cluster' data-generator='igniteConfiguration' data-client='true' data-no-deep-watch)
                                 div(bs-pane title='Java')
-                                    ignite-ui-ace-java(ng-if='tabsClient.activeTab == 1 || tabsClient.init[1]' ng-init='tabsClient.init[1] = true' data-master='cluster' data-no-deep-watch data-cluster-cfg='#{nearCfg}')
+                                    ignite-ui-ace-java(ng-if='tabsClient.activeTab == 1 || tabsClient.init[1]' ng-init='tabsClient.init[1] = true' data-master='cluster' data-generator='igniteConfiguration' data-client='true' data-no-deep-watch)
                                 div(bs-pane title='POM')
-                                    ignite-ui-ace-pom(ng-if='tabsClient.activeTab == 2 || tabsClient.init[2]' ng-init='tabsClient.init[2] = true' data-cluster='cluster' data-no-deep-watch)
+                                    ignite-ui-ace-pom(ng-if='tabsClient.activeTab == 2 || tabsClient.init[2]' ng-init='tabsClient.init[2] = true' data-cluster='cluster' data-generator='igniteConfiguration' data-client='true' data-no-deep-watch)
                                 div(bs-pane title='POJO' ng-if='cluster | hasPojo')
                                     ignite-ui-ace-pojos(ng-if='tabsClient.activeTab == 3 || tabsClient.init[3]' ng-init='tabsClient.init[3] = true' data-cluster='cluster' data-no-deep-watch ng-model='ctrl.data.pojos')
+                        

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/views/sql/cache-metadata.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/views/sql/cache-metadata.jade b/modules/web-console/frontend/views/sql/cache-metadata.jade
index 450c178..385960a 100644
--- a/modules/web-console/frontend/views/sql/cache-metadata.jade
+++ b/modules/web-console/frontend/views/sql/cache-metadata.jade
@@ -21,7 +21,7 @@
             input.form-control(type='text' ng-model='metaFilter' placeholder='Filter metadata...')
     .popover-content(ng-if='metadata && metadata.length > 0')
         treecontrol.tree-classic(tree-model='metadata' options='metaOptions' filter-expression='metaFilter')
-            span(ng-switch='' on='node.type')
+            span(ng-switch='node.type')
                 span(ng-switch-when='type' ng-dblclick='dblclickMetadata(paragraph, node)')
                     i.fa.fa-table
                     label.clickable(ng-bind='node.displayName')

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/views/sql/notebook-new.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/views/sql/notebook-new.jade b/modules/web-console/frontend/views/sql/notebook-new.jade
index 09b2dae..8d9e8c4 100644
--- a/modules/web-console/frontend/views/sql/notebook-new.jade
+++ b/modules/web-console/frontend/views/sql/notebook-new.jade
@@ -19,7 +19,9 @@
         .modal-content
             .modal-header
                 button.close(ng-click='$hide()') &times;
-                h4.modal-title New SQL notebook
+                h4.modal-title
+                    i.fa.fa-file-o
+                    | New SQL notebook
             form.form-horizontal.modal-body.row(name='ui.inputForm' novalidate)
                 div
                     .col-sm-2

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/views/sql/sql.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/views/sql/sql.jade b/modules/web-console/frontend/views/sql/sql.jade
index 81acdfd..4a596b9 100644
--- a/modules/web-console/frontend/views/sql/sql.jade
+++ b/modules/web-console/frontend/views/sql/sql.jade
@@ -14,6 +14,8 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 
+include ../../app/directives/ui-grid-settings/ui-grid-settings.jade
+
 mixin btn-toolbar(btn, click, tip, focusId)
     i.btn.btn-default.fa(class=btn ng-click=click bs-tooltip='' data-title=tip ignite-on-click-focus=focusId data-trigger='hover' data-placement='bottom')
 
@@ -82,36 +84,70 @@ mixin paragraph-rename
         .input-tip
             input.form-control(id='paragraph-name-{{paragraph.id}}' ng-model='paragraph.editName' required ng-click='$event.stopPropagation();' ignite-on-enter='renameParagraph(paragraph, paragraph.editName)' ignite-on-escape='paragraph.edit = false')
 
+mixin query-settings
+    label.tipLabel Refresh rate:
+        button.btn.btn-default.fa.fa-clock-o.tipLabel(title='Click to show refresh rate dialog' 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.btn.btn-default.select-toggle.tipLabel(ng-model='paragraph.pageSize' bs-options='item for item in pageSizes' bs-select bs-tooltip data-placement='bottom-right' data-title='Max number of rows to show in query result as one page')
+    label.margin-left-dflt(title='Fetch first page of results only')
+        input(type='checkbox' ng-model='paragraph.firstPageOnly')
+        span Fetch first page only
+    label.margin-left-dflt(title='Execute query locally on selected node.\nNode selection dialog will be shown before query execution.')
+        input(type='checkbox' ng-model='paragraph.localQry')
+        span Local query
+
+mixin query-actions
+    .btn-group(bs-tooltip='' data-title='{{actionTooltip(paragraph, "execute", true)}}' data-placement='bottom')
+        button.btn.btn-primary(ng-disabled='!actionAvailable(paragraph, true)' ng-click='execute(paragraph)') Execute
+        button.btn.btn-primary.dropdown-toggle(
+            ng-disabled='!actionAvailable(paragraph, true)'
+            bs-dropdown=''
+            data-container='body'
+            data-placement='bottom-right'
+        )
+            span.caret
+        ul.dropdown-menu(role='menu')
+            li #[a(href='javascript:void(0)' ng-click='execute(paragraph)') Execute]
+            li #[a(href='javascript:void(0)' ng-if='nonCollocatedJoinsAvailable(paragraph)' ng-click='execute(paragraph, true)') Execute non collocated joins]
+    .btn-group(bs-tooltip='' data-title='{{actionTooltip(paragraph, "execute scan", false)}}' data-placement='bottom')
+        button.btn.btn-primary(ng-disabled='!actionAvailable(paragraph, false)' ng-click='scan(paragraph)') Scan
+        button.btn.btn-primary.dropdown-toggle(
+            ng-disabled='!actionAvailable(paragraph, false)'
+            bs-dropdown=''
+            data-container='body'
+            data-placement='bottom-right'
+        )
+            span.caret
+        ul.dropdown-menu(role='menu')
+            li #[a(href='javascript:void(0)' ng-click='scan(paragraph)') Scan]
+            li #[a(href='javascript:void(0)' ng-click='actionAvailable(paragraph, false) && scanWithFilter(paragraph)') Scan with filter]
+    a.btn.btn-default(ng-disabled='!actionAvailable(paragraph, true)' ng-click='explain(paragraph)' data-placement='bottom' bs-tooltip='' data-title='{{actionTooltip(paragraph, "explain", true)}}') Explain
+
 mixin query-controls
     .sql-controls
-        a.btn.btn-primary(ng-disabled='!actionAvailable(paragraph, true)' ng-click='execute(paragraph)' data-placement='bottom' bs-tooltip='' data-title='{{actionTooltip(paragraph, "execute", true)}}') Execute
-        a.btn.btn-primary(ng-disabled='!actionAvailable(paragraph, true)' ng-click='explain(paragraph)' data-placement='bottom' bs-tooltip='' data-title='{{actionTooltip(paragraph, "explain", true)}}') Explain
-        .btn-group(bs-tooltip='' data-title='{{actionTooltip(paragraph, "execute scan", false)}}' data-placement='bottom')
-            a.btn.btn-primary.fieldButton(ng-disabled='!actionAvailable(paragraph, false)' ng-click='scan(paragraph)') Scan
-            a.btn.btn-primary(ng-disabled='!actionAvailable(paragraph, false)' data-toggle='dropdown' data-container='body' bs-dropdown='[{ text: "Scan with filter", click: "actionAvailable(paragraph, false) && scanWithFilter(paragraph)" }]')
-                span.caret
-
+        +query-actions()
         .pull-right
-            label.tipLabel 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(title='Click to show refresh rate dialog' 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-placement='bottom-right' data-title='Max number of rows to show in query result as one page')
+            +query-settings()
 
 mixin table-result
     .total.row
         .col-xs-4
+            +ui-grid-settings
             label Page: #[b {{paragraph.page}}]
             label.margin-left-dflt Results so far: #[b {{paragraph.rows.length + paragraph.total}}]
             label.margin-left-dflt Duration: #[b {{paragraph.duration | duration}}]
         .col-xs-4
             +result-toolbar
         .col-xs-4
-            .btn-group.pull-right(ng-disabled='paragraph.loading')
-                button.btn.btn-primary.fieldButton(ng-click='exportCsv(paragraph)' bs-tooltip data-title='{{actionTooltip(paragraph, "export", false)}}') Export
-                button.btn.btn-primary(id='export-item-dropdown' data-toggle='dropdown' data-container='body' bs-dropdown='exportDropdown' data-placement='bottom-right')
-                    span.caret
+            .pull-right
+                label(style='margin-right: 10px;')
+                    input(type='checkbox' ng-model='paragraph.systemColumns' ng-change='toggleSystemColumns(paragraph)' ng-disabled='paragraph.disabledSystemColumns')
+                    span Show _KEY, _VAL columns
+                .btn-group(ng-disabled='paragraph.loading')
+                    button.btn.btn-primary(ng-click='exportCsv(paragraph)' bs-tooltip data-title='{{actionTooltip(paragraph, "export", false)}}') Export
+                    button.btn.btn-primary.dropdown-toggle(id='export-item-dropdown' data-toggle='dropdown' data-container='body' bs-dropdown='exportDropdown' data-placement='bottom-right')
+                        span.caret
+    
     .grid(ui-grid='paragraph.gridOptions' ui-grid-resize-columns ui-grid-exporter)
 
 mixin chart-result
@@ -161,15 +197,15 @@ mixin chart-result
                                 .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(title='Click to show cache types metadata dialog' bs-popover data-template-url='/sql/cache-metadata.html' data-placement='bottom' data-trigger='click' data-container='#{{ paragraph.id}}')
+                                        i.fa.fa-database.tipField(title='Click to show cache types metadata dialog' bs-popover data-template-url='/sql/cache-metadata.html' data-placement='bottom' data-trigger='click' data-container='#{{ paragraph.id }}')
                                         .input-tip
                                             input.form-control(type='text' st-search='label' placeholder='Filter caches...')
                                         table.links
                                             tbody.scrollable-y(style='max-height: 15em; display: block;')
                                                 tr(ng-repeat='cache in displayedCaches track by cache.name')
                                                     td(style='width: 100%')
-                                                        input.labelField(id='cache{{$index}}' type='radio' value='{{cache.name}}' ng-model='paragraph.cacheName')
-                                                        label(for='cache{{$index}}' ng-bind='cache.label')
+                                                        input.labelField(id='cache_{{ [paragraph.id, $index].join("_") }}' type='radio' value='{{cache.name}}' ng-model='paragraph.cacheName')
+                                                        label(for='cache_{{ [paragraph.id, $index].join("_") }} ' ng-bind='cache.label')
                                     .empty-caches(ng-show='displayedCaches.length == 0 && caches.length != 0')
                                         label Wrong caches filter
                                     .empty-caches(ng-show='caches.length == 0')
@@ -183,10 +219,10 @@ mixin chart-result
                                     +table-result
                                 .chart(ng-switch-when='chart')
                                     +chart-result
-                                .footer.clearfix(ng-show='paragraph.nonRefresh()')
+                                .footer.clearfix
                                     a.pull-left(ng-click='showResultQuery(paragraph)') Show query
 
-                                    -var nextVisibleCondition = 'paragraph.queryId && (paragraph.table() || paragraph.chart() && (paragraph.timeLineSupported() || !paragraph.chartTimeLineEnabled()))'
+                                    -var nextVisibleCondition = 'paragraph.resultType() != "error" && paragraph.queryId && paragraph.nonRefresh() && (paragraph.table() || paragraph.chart() && !paragraph.scanExplain())'
 
                                     .pull-right(ng-show=nextVisibleCondition ng-class='{disabled: paragraph.loading}' ng-click='!paragraph.loading && nextPage(paragraph)')
                                         i.fa.fa-chevron-circle-right

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/views/templates/agent-download.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/views/templates/agent-download.jade b/modules/web-console/frontend/views/templates/agent-download.jade
index 864694b..a6da3d1 100644
--- a/modules/web-console/frontend/views/templates/agent-download.jade
+++ b/modules/web-console/frontend/views/templates/agent-download.jade
@@ -18,8 +18,10 @@
     .modal-dialog
         .modal-content
             #errors-container.modal-header.header
-                h4.modal-title(ng-if='!hasAgents') Connection to Ignite Web Agent is not established
-                h4.modal-title(ng-if='hasAgents') Connection to Ignite Node is not established
+                h4.modal-title
+                    i.fa.fa-download
+                    span(ng-if='!hasAgents') Connection to Ignite Web Agent is not established
+                    span(ng-if='hasAgents') Connection to Ignite Node is not established
             .agent-download(ng-if='!hasAgents')
                 p Please download and run #[a(href='javascript:void(0)' ng-click='downloadAgent()') ignite-web-agent] in order to {{::agentGoal}}
                 p For run:

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/views/templates/batch-confirm.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/views/templates/batch-confirm.jade b/modules/web-console/frontend/views/templates/batch-confirm.jade
index 7451314..c5d3775 100644
--- a/modules/web-console/frontend/views/templates/batch-confirm.jade
+++ b/modules/web-console/frontend/views/templates/batch-confirm.jade
@@ -19,7 +19,9 @@
         .modal-content
             .modal-header
                 button.close(ng-click='cancel()' aria-hidden='true') &times;
-                h4.modal-title Confirmation
+                h4.modal-title 
+                    i.fa.fa-question
+                    | Confirmation
             .modal-body(ng-show='content')
                 p(ng-bind-html='content' style='text-align: center')
             .modal-footer

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/views/templates/clone.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/views/templates/clone.jade b/modules/web-console/frontend/views/templates/clone.jade
index d68bf45..6cf93ca 100644
--- a/modules/web-console/frontend/views/templates/clone.jade
+++ b/modules/web-console/frontend/views/templates/clone.jade
@@ -21,7 +21,9 @@ include ../../app/helpers/jade/mixins.jade
         .modal-content
             .modal-header
                 button.close(ng-click='$hide()') &times;
-                h4.modal-title Clone
+                h4.modal-title 
+                    i.fa.fa-clone
+                    | Clone
             form.form-horizontal.modal-body.row(name='ui.inputForm' novalidate)
                 div
                     .col-sm-2

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/views/templates/confirm.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/views/templates/confirm.jade b/modules/web-console/frontend/views/templates/confirm.jade
index 26af061..f9f966b 100644
--- a/modules/web-console/frontend/views/templates/confirm.jade
+++ b/modules/web-console/frontend/views/templates/confirm.jade
@@ -19,7 +19,9 @@
         .modal-content
             .modal-header
                 button.close(ng-click='confirmCancel()' aria-hidden='true') &times;
-                h4.modal-title Confirmation
+                h4.modal-title 
+                    i.fa.fa-question-circle-o
+                    | Confirmation
             .modal-body(ng-show='content')
                 p(ng-bind-html='content' style='text-align: center;')
             .modal-footer

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/views/templates/demo-info.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/views/templates/demo-info.jade b/modules/web-console/frontend/views/templates/demo-info.jade
index 100e806..44c091c 100644
--- a/modules/web-console/frontend/views/templates/demo-info.jade
+++ b/modules/web-console/frontend/views/templates/demo-info.jade
@@ -19,7 +19,9 @@
         .modal-content
             #errors-container.modal-header.header
                 button.close(ng-click='close()' aria-hidden='true') &times;
-                h4.modal-title {{title}}
+                h4.modal-title
+                    i.fa.fa-info-circle
+                    | {{title}}
             .modal-body
                 div(ng-bind-html='message')
                 div(ng-hide='hasAgents')

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/views/templates/getting-started.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/views/templates/getting-started.jade b/modules/web-console/frontend/views/templates/getting-started.jade
index 98bc265..3a89035 100644
--- a/modules/web-console/frontend/views/templates/getting-started.jade
+++ b/modules/web-console/frontend/views/templates/getting-started.jade
@@ -19,7 +19,9 @@
         .modal-content
             #errors-container.modal-header.header
                 button.close(ng-click='close()' aria-hidden='true') &times;
-                h4.modal-title {{title}}
+                h4.modal-title 
+                    i.fa.fa-book
+                    | {{title}}
             .getting-started
                 .col-xs-12(ng-bind-html='message')
             .modal-footer

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/views/templates/message.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/views/templates/message.jade b/modules/web-console/frontend/views/templates/message.jade
index 6dcf445..6eff74b 100644
--- a/modules/web-console/frontend/views/templates/message.jade
+++ b/modules/web-console/frontend/views/templates/message.jade
@@ -19,7 +19,9 @@
         .modal-content
             .modal-header
                 button.close(ng-click='$hide()' aria-hidden='true') &times;
-                h4.modal-title {{title}}
+                h4.modal-title
+                    i.fa.fa-info-circle
+                    | {{title}}
             .modal-body(ng-show='content')
                 p(ng-bind-html='content.join("<br/>")' style='text-align: left;')
             .modal-footer

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/frontend/views/templates/select.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/views/templates/select.jade b/modules/web-console/frontend/views/templates/select.jade
index 3feee61..5b6cc01 100644
--- a/modules/web-console/frontend/views/templates/select.jade
+++ b/modules/web-console/frontend/views/templates/select.jade
@@ -21,6 +21,6 @@ ul.select.dropdown-menu(tabindex='-1' ng-show='$isVisible()' role='select')
         hr(style='margin: 5px 0')
     li(role='presentation' ng-repeat='match in $matches')
         hr(ng-if='match.value == undefined' style='margin: 5px 0')
-        a(id='li-dropdown-item-{{$index}}'  role='menuitem' tabindex='-1' ng-class='{active: $isActive($index)}' ng-click='$select($index, $event)' bs-tooltip='widthIsSufficient && !widthIsSufficient("li-dropdown-item-{{$index}}", $index, match.label) ? match.label : ""' data-placement='bottom')
+        a(id='li-dropdown-item-{{$index}}'  role='menuitem' tabindex='-1' ng-class='{active: $isActive($index)}' ng-click='$select($index, $event)' bs-tooltip='widthIsSufficient && !widthIsSufficient("li-dropdown-item-{{$index}}", $index, match.label) ? match.label : ""' data-placement='right auto')
             i(class='{{$iconCheckmark}}' ng-if='$isActive($index)' ng-class='{active: $isActive($index)}')
             span(ng-bind='match.label')

http://git-wip-us.apache.org/repos/asf/ignite/blob/087f6405/modules/web-console/web-agent/src/main/java/org/apache/ignite/console/demo/AgentClusterDemo.java
----------------------------------------------------------------------
diff --git a/modules/web-console/web-agent/src/main/java/org/apache/ignite/console/demo/AgentClusterDemo.java b/modules/web-console/web-agent/src/main/java/org/apache/ignite/console/demo/AgentClusterDemo.java
index 09189b5..2fb9f56 100644
--- a/modules/web-console/web-agent/src/main/java/org/apache/ignite/console/demo/AgentClusterDemo.java
+++ b/modules/web-console/web-agent/src/main/java/org/apache/ignite/console/demo/AgentClusterDemo.java
@@ -333,7 +333,7 @@ public class AgentClusterDemo {
     private static  IgniteConfiguration igniteConfiguration(int gridIdx, boolean client) {
         IgniteConfiguration cfg = new IgniteConfiguration();
 
-        cfg.setGridName((client ? "demo-server-" : "demo-client-") + gridIdx);
+        cfg.setGridName((client ? "demo-client-" : "demo-server-" ) + gridIdx);
         cfg.setLocalHost("127.0.0.1");
         cfg.setIncludeEventTypes(EVTS_DISCOVERY);