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 2017/03/13 08:45:35 UTC

[14/50] [abbrv] ignite git commit: IGNITE-4659 Migration to Webpack 2. Upgrade template engine from jade to pug.

http://git-wip-us.apache.org/repos/asf/ignite/blob/1080e686/modules/web-console/frontend/app/services/Clone.service.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/services/Clone.service.js b/modules/web-console/frontend/app/services/Clone.service.js
index 52a4e4e..d079141 100644
--- a/modules/web-console/frontend/app/services/Clone.service.js
+++ b/modules/web-console/frontend/app/services/Clone.service.js
@@ -15,6 +15,8 @@
  * limitations under the License.
  */
 
+import templateUrl from 'views/templates/clone.tpl.pug';
+
 // Service for clone objects.
 export default ['IgniteClone', ['$rootScope', '$q', '$modal', ($root, $q, $modal) => {
     const scope = $root.$new();
@@ -36,7 +38,7 @@ export default ['IgniteClone', ['$rootScope', '$q', '$modal', ($root, $q, $modal
         return tmpName;
     }
 
-    const cloneModal = $modal({templateUrl: '/templates/clone.html', scope, placement: 'center', show: false});
+    const cloneModal = $modal({templateUrl, scope, placement: 'center', show: false});
 
     scope.ok = function(newName) {
         if (!_validator || _validator(newName)) {

http://git-wip-us.apache.org/repos/asf/ignite/blob/1080e686/modules/web-console/frontend/app/services/Confirm.service.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/services/Confirm.service.js b/modules/web-console/frontend/app/services/Confirm.service.js
index 8208ea2..0b5b9be 100644
--- a/modules/web-console/frontend/app/services/Confirm.service.js
+++ b/modules/web-console/frontend/app/services/Confirm.service.js
@@ -15,11 +15,13 @@
  * limitations under the License.
  */
 
+import templateUrl from 'views/templates/confirm.tpl.pug';
+
 // Confirm popup service.
 export default ['IgniteConfirm', ['$rootScope', '$q', '$modal', '$animate', ($root, $q, $modal, $animate) => {
     const scope = $root.$new();
 
-    const modal = $modal({templateUrl: '/templates/confirm.html', scope, placement: 'center', show: false, backdrop: true});
+    const modal = $modal({templateUrl, scope, placement: 'center', show: false, backdrop: true});
 
     const _hide = () => {
         $animate.enabled(modal.$element, false);

http://git-wip-us.apache.org/repos/asf/ignite/blob/1080e686/modules/web-console/frontend/app/services/ConfirmBatch.service.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/services/ConfirmBatch.service.js b/modules/web-console/frontend/app/services/ConfirmBatch.service.js
index ef66335..2fd55b7 100644
--- a/modules/web-console/frontend/app/services/ConfirmBatch.service.js
+++ b/modules/web-console/frontend/app/services/ConfirmBatch.service.js
@@ -15,12 +15,14 @@
  * limitations under the License.
  */
 
+import templateUrl from 'views/templates/batch-confirm.tpl.pug';
+
 // Service for confirm or skip several steps.
 export default ['IgniteConfirmBatch', ['$rootScope', '$q', '$modal', ($root, $q, $modal) => {
     const scope = $root.$new();
 
     scope.confirmModal = $modal({
-        templateUrl: '/templates/batch-confirm.html',
+        templateUrl,
         scope,
         placement: 'center',
         show: false,

http://git-wip-us.apache.org/repos/asf/ignite/blob/1080e686/modules/web-console/frontend/controllers/caches-controller.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/controllers/caches-controller.js b/modules/web-console/frontend/controllers/caches-controller.js
index e7521b5..b50fde3 100644
--- a/modules/web-console/frontend/controllers/caches-controller.js
+++ b/modules/web-console/frontend/controllers/caches-controller.js
@@ -15,6 +15,8 @@
  * limitations under the License.
  */
 
+import infoMessageTemplateUrl from 'views/templates/message.tpl.pug';
+
 // Controller for Caches screen.
 export default ['cachesController', [
     '$scope', '$http', '$state', '$filter', '$timeout', '$modal', 'IgniteLegacyUtils', 'IgniteMessages', 'IgniteConfirm', 'IgniteClone', 'IgniteLoading', 'IgniteModelNormalizer', 'IgniteUnsavedChangesGuard', 'IgniteConfigurationResource', 'IgniteErrorPopover', 'IgniteFormUtils', 'IgniteLegacyTable',
@@ -542,7 +544,7 @@ export default ['cachesController', [
                         ];
 
                         // Show a basic modal from a controller
-                        $modal({scope, template: '/templates/message.html', placement: 'center', show: true});
+                        $modal({scope, templateUrl: infoMessageTemplateUrl, placement: 'center', show: true});
                     }
 
                     save(item);

http://git-wip-us.apache.org/repos/asf/ignite/blob/1080e686/modules/web-console/frontend/controllers/domains-controller.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/controllers/domains-controller.js b/modules/web-console/frontend/controllers/domains-controller.js
index bfffe92..5c9e511 100644
--- a/modules/web-console/frontend/controllers/domains-controller.js
+++ b/modules/web-console/frontend/controllers/domains-controller.js
@@ -15,6 +15,8 @@
  * limitations under the License.
  */
 
+import templateUrl from 'views/configuration/domains-import.tpl.pug';
+
 // Controller for Domain model screen.
 export default ['domainsController', [
     '$rootScope', '$scope', '$http', '$state', '$filter', '$timeout', '$modal', 'IgniteLegacyUtils', 'IgniteMessages', 'IgniteFocus', 'IgniteConfirm', 'IgniteConfirmBatch', 'IgniteClone', 'IgniteLoading', 'IgniteModelNormalizer', 'IgniteUnsavedChangesGuard', 'IgniteAgentMonitor', 'IgniteLegacyTable', 'IgniteConfigurationResource', 'IgniteErrorPopover', 'IgniteFormUtils', 'JavaTypes', 'SqlTypes', 'IgniteActivitiesData',
@@ -409,7 +411,7 @@ export default ['domainsController', [
         $scope.$watch('importDomain.displayedTables', $scope.selectTable);
 
         // Pre-fetch modal dialogs.
-        const importDomainModal = $modal({scope: $scope, templateUrl: '/configuration/domains-import.html', show: false});
+        const importDomainModal = $modal({scope: $scope, templateUrl, show: false});
 
         const hideImportDomain = importDomainModal.hide;
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/1080e686/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 6ebfbad..627b2f9 100644
--- a/modules/web-console/frontend/gulpfile.babel.js/paths.js
+++ b/modules/web-console/frontend/gulpfile.babel.js/paths.js
@@ -24,33 +24,15 @@ 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 jadeViewsPaths = [
-    './views/**/*.jade',
-    '!./views/configuration/*.jade'
-];
-
-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 = [
-    igniteModulesDir + '/**/view/**/*.jade'
-];
-
 const appModulePaths = [
     igniteModulesDir + '/index.js',
     igniteModulesDir + '/**/main.js',
     igniteModulesDir + '/**/module.js',
     igniteModulesDir + '/**/app/modules/*.js',
     igniteModulesDir + '/**/app/modules/**/*.js',
-    igniteModulesDir + '/**/app/modules/**/*.jade',
+    igniteModulesDir + '/**/app/modules/**/*.pug',
+    igniteModulesDir + '/**/*.pug',
+    igniteModulesDir + '/**/*.tpl.pug',
     igniteModulesDir + '/**/app/**/*.css',
     igniteModulesDir + '/**/app/**/*.scss',
     igniteModulesDir + '/**/app/data/*.json'
@@ -73,10 +55,6 @@ export {
     igniteModulesDir,
     igniteModulesTemp,
 
-    jadeViewsPaths,
-    jadeAppModulePaths,
-    jadeModulePaths,
-
     resourcePaths,
     resourceModulePaths,
     appModulePaths

http://git-wip-us.apache.org/repos/asf/ignite/blob/1080e686/modules/web-console/frontend/gulpfile.babel.js/tasks/build.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/gulpfile.babel.js/tasks/build.js b/modules/web-console/frontend/gulpfile.babel.js/tasks/build.js
index 7d7401b..149b076 100644
--- a/modules/web-console/frontend/gulpfile.babel.js/tasks/build.js
+++ b/modules/web-console/frontend/gulpfile.babel.js/tasks/build.js
@@ -18,4 +18,4 @@
 import gulp from 'gulp';
 import sequence from 'gulp-sequence';
 
-gulp.task('build', (cb) => sequence(['clean', 'clean:ignite-modules-temp'], 'ignite:modules', ['copy:resource', 'jade'], 'bundle', cb));
+gulp.task('build', (cb) => sequence(['clean', 'clean:ignite-modules-temp'], 'ignite:modules', ['copy:resource'], 'bundle', cb));

http://git-wip-us.apache.org/repos/asf/ignite/blob/1080e686/modules/web-console/frontend/gulpfile.babel.js/tasks/bundle.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/gulpfile.babel.js/tasks/bundle.js b/modules/web-console/frontend/gulpfile.babel.js/tasks/bundle.js
index d3e8dca..ac3ac76 100644
--- a/modules/web-console/frontend/gulpfile.babel.js/tasks/bundle.js
+++ b/modules/web-console/frontend/gulpfile.babel.js/tasks/bundle.js
@@ -21,10 +21,14 @@ import webpackConfig from '../webpack';
 import WebpackDevServer from 'webpack-dev-server';
 
 gulp.task('bundle', (cb) => {
+    const devServerConfig = webpackConfig.devServer;
+
+    delete webpackConfig.devServer;
+
     if (process.env.NODE_ENV === 'development') {
         // Important! Call webpack and WebpackDevServer must be inline.
-        new WebpackDevServer(webpack(webpackConfig), webpackConfig.devServer)
-            .listen(webpackConfig.devServer.port, 'localhost', cb);
+        new WebpackDevServer(webpack(webpackConfig), devServerConfig)
+            .listen(devServerConfig.port, 'localhost', cb);
     }
     else
         webpack(webpackConfig, cb);

http://git-wip-us.apache.org/repos/asf/ignite/blob/1080e686/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
deleted file mode 100644
index 4935976..0000000
--- a/modules/web-console/frontend/gulpfile.babel.js/tasks/jade.js
+++ /dev/null
@@ -1,49 +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.
- */
-
-import gulp from 'gulp';
-import ll from 'gulp-ll';
-import jade from 'gulp-jade';
-
-import { jadeViewsPaths, jadeAppModulePaths, jadeModulePaths, destDir, rootDir } from '../paths';
-
-const jadeOptions = {
-    basedir: rootDir,
-    cache: true
-};
-
-ll.tasks(['jade:views', 'jade:app', 'jade:ignite_modules']);
-
-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))
-);
-
-gulp.task('jade:ignite_modules', () =>
-    gulp.src(jadeModulePaths)
-        .pipe(jade(jadeOptions))
-        .pipe(gulp.dest(`${destDir}/ignite_modules`))
-);

http://git-wip-us.apache.org/repos/asf/ignite/blob/1080e686/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 dfaa1a3..9a02b88 100644
--- a/modules/web-console/frontend/gulpfile.babel.js/tasks/watch.js
+++ b/modules/web-console/frontend/gulpfile.babel.js/tasks/watch.js
@@ -18,15 +18,12 @@
 import gulp from 'gulp';
 import sequence from 'gulp-sequence';
 
-import { jadeViewsPaths, jadeAppModulePaths, jadeModulePaths, resourcePaths, resourceModulePaths, appModulePaths } from '../paths';
+import { 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(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/1080e686/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 7360ac4..3d9616f 100644
--- a/modules/web-console/frontend/gulpfile.babel.js/webpack/common.js
+++ b/modules/web-console/frontend/gulpfile.babel.js/webpack/common.js
@@ -18,21 +18,22 @@
 import path from 'path';
 import fs from 'fs';
 import webpack from 'webpack';
-import autoprefixer from 'autoprefixer-core';
-import jade from 'jade';
+
 import ProgressBarPlugin from 'progress-bar-webpack-plugin';
 import eslintFormatter from 'eslint-friendly-formatter';
 
-import ExtractTextPlugin from 'extract-text-webpack-plugin';
 import HtmlWebpackPlugin from 'html-webpack-plugin';
 
+import ExtractTextPlugin from 'extract-text-webpack-plugin';
+
 import {srcDir, destDir, rootDir, igniteModulesDir} from '../paths';
 
+const viewsDir = path.resolve('views');
+const imagesDir = path.resolve('public/images');
+
 const NODE_ENV = process.env.NODE_ENV || 'production';
 const development = NODE_ENV === 'development';
 const node_modules_path = path.resolve('node_modules');
-const cssLoader = 'css-loader?sourceMap!postcss-loader';
-const stylesLoader = cssLoader + '!sass-loader?outputStyle=expanded&sourceMap=true&sourceMapContents=true';
 
 let favicon = 'build/ignite_modules/favicon.ico';
 
@@ -42,150 +43,155 @@ try {
     favicon = 'build/favicon.ico';
 }
 
-export default () => {
-    const assetsLoader = 'file-loader';
-
-    return {
-        cache: true,
-        node: {
-            fs: 'empty'
-        },
-
-        // Entry points.
-        entry: {
-            polyfill: 'babel-polyfill',
-            app: path.join(srcDir, 'app.js'),
-            vendor: path.join(srcDir, 'vendor.js')
-        },
-
-        // Output system.
-        output: {
-            path: destDir,
-            filename: '[name].js'
-        },
-
-        // Resolves modules.
-        resolve: {
-            extensions: [
-                '',
-                '.js'
-            ],
-            root: [rootDir],
-            modulesDirectories: [
-                node_modules_path,
-                './'
-            ]
-        },
-        jade: {
-            basedir: rootDir,
-            locals: {}
-        },
-        // Modules resolvers.
-        /* global require */
-        module: {
-            noParse: [],
-            preLoaders: [
-                {
-                    test: /\.js$/,
-                    exclude: [node_modules_path],
-                    loader: 'eslint-loader'
-                }
-            ],
-            loaders: [
-                {
-                    test: /\.json$/,
-                    loader: 'json-loader'
-                },
-                {
-                    test: /\.jade$/,
-                    loaders: [
-                        `ngtemplate-loader?relativeTo=${rootDir}`,
-                        'html-loader?attrs[]=img:src&attrs[]=img:data-src',
-                        'jade-html-loader'
-                    ]
-                },
-                {
-                    test: /\.js$/,
-                    exclude: [node_modules_path],
-                    loader: 'babel-loader',
-                    query: {
+export default {
+    cache: true,
+    node: {
+        fs: 'empty'
+    },
+    // Entry points.
+    entry: {
+        polyfill: 'babel-polyfill',
+        vendor: path.join(srcDir, 'vendor.js'),
+        app: path.join(srcDir, 'app.js')
+    },
+
+    // Output system.
+    output: {
+        path: destDir,
+        filename: '[name].js'
+    },
+
+    // Resolves modules.
+    resolve: {
+        extensions: [
+            '.js'
+        ],
+        modules: [
+            srcDir,
+            rootDir,
+            node_modules_path
+        ],
+        // A list of module source folders.
+        alias: {
+            app: srcDir,
+            views: viewsDir,
+            images: imagesDir
+        }
+    },
+
+    // Resolve loader use postfix.
+    resolveLoader: {
+        moduleExtensions: ['-loader']
+    },
+
+    module: {
+        rules: [
+            {
+                test: /\.json$/,
+                loader: 'json'
+            },
+
+            // Exclude tpl.pug files to import in bundle.
+            {
+                test: /^(?:(?!tpl\.pug$).)*\.pug$/, // TODO: check this regexp for correct.
+                loader: `pug-html?basedir=${rootDir}`
+            },
+
+            // Render .tpl.pug files to assets folder.
+            {
+                test: /\.tpl\.pug$/,
+                use: [
+                    'file?exports=false&name=assets/templates/[name].[hash].html',
+                    `pug-html?exports=false&basedir=${rootDir}`
+                ]
+            },
+            {
+                test: /\.js$/,
+                enforce: 'pre',
+                exclude: [node_modules_path],
+                use: [{
+                    loader: 'eslint',
+                    options: {
+                        failOnWarning: false,
+                        failOnError: false,
+                        formatter: eslintFormatter
+                    }
+                }]
+            },
+            {
+                test: /\.js$/,
+                exclude: [node_modules_path],
+                use: [{
+                    loader: 'babel',
+                    options: {
                         cacheDirectory: true,
                         plugins: [
                             'transform-runtime',
                             'add-module-exports'
                         ],
                         presets: ['angular']
-
                     }
-                },
-                {
-                    test: /\.css$/,
-                    loader: development ? `style-loader!${cssLoader}` : ExtractTextPlugin.extract('style-loader', cssLoader)
-                },
-                {
-                    test: /\.(scss|sass)$/,
-                    loader: development ? `style-loader!${stylesLoader}` : ExtractTextPlugin.extract('style-loader', stylesLoader)
-                },
-                {
-                    test: /\.(ttf|eot|svg|woff(2)?)(\?v=[\d.]+)?(\?[a-z0-9#-]+)?$/,
-                    loaders: [`${assetsLoader}?name=assets/fonts/[name].[ext]`]
-                },
-                {
-                    test: /\.(jpe?g|png|gif)$/i,
-                    loaders: [`${assetsLoader}?name=assets/images/[name]_[hash].[ext]`]
-                },
-                {
-                    test: require.resolve('jquery'),
-                    loaders: [
-                        'expose-loader?$',
-                        'expose-loader?jQuery'
-                    ]
-                },
-                {
-                    test: require.resolve('nvd3'),
-                    loaders: [
-                        'expose-loader?nv'
-                    ]
-                }
-            ]
-        },
-
-        // Postcss configuration.
-        postcss: [autoprefixer({browsers: ['last 2 versions']})],
-
-        // ESLint loader configuration.
-        eslint: {
-            failOnWarning: false,
-            failOnError: false,
-            formatter: eslintFormatter
-        },
-
-        // Load plugins.
-        plugins: [
-            new webpack.ProvidePlugin({
-                $: 'jquery',
-                jQuery: 'jquery',
-                _: 'lodash',
-                nv: 'nvd3'
-            }),
-            new webpack.DefinePlugin({NODE_ENV: JSON.stringify(NODE_ENV)}),
-            // new webpack.NoErrorsPlugin(),
-            new webpack.optimize.DedupePlugin(),
-            new webpack.optimize.CommonsChunkPlugin({
-                name: 'common',
-                chunks: ['vendor', 'app']
-            }),
-            new webpack.optimize.AggressiveMergingPlugin({moveToParents: true}),
-            new webpack.optimize.OccurenceOrderPlugin(),
-            new ExtractTextPlugin('assets/css/[name]' + (development ? '' : '.[chunkhash]') + '.css', {allChunks: true}),
-            new HtmlWebpackPlugin({
-                filename: 'index.html',
-                templateContent: () => {
-                    return jade.renderFile(path.join(rootDir, 'views', 'index.jade'));
-                },
-                favicon
-            }),
-            new ProgressBarPlugin()
+                }]
+            },
+            {
+                test: /\.css$/,
+                use: development ? ['style', 'css'] : ExtractTextPlugin.extract({
+                    fallback: 'style',
+                    use: ['css']
+                })
+            },
+            {
+                test: /\.scss$/,
+                use: development ? ['style', 'css', 'sass'] : ExtractTextPlugin.extract({
+                    fallback: 'style-loader',
+                    use: ['css', 'sass']
+                })
+            },
+            {
+                test: /\.(ttf|eot|svg|woff(2)?)(\?v=[\d.]+)?(\?[a-z0-9#-]+)?$/,
+                loader: 'file?name=assets/fonts/[name].[ext]'
+            },
+            {
+                test: /\.(jpe?g|png|gif)$/i,
+                loader: 'file?name=assets/images/[name]_[hash].[ext]'
+            },
+            {
+                test: require.resolve('jquery'),
+                use: [
+                    'expose-loader?$',
+                    'expose-loader?jQuery'
+                ]
+            },
+            {
+                test: require.resolve('nvd3'),
+                use: ['expose-loader?nv']
+            }
         ]
-    };
+    },
+
+    // Load plugins.
+    plugins: [
+        new webpack.LoaderOptionsPlugin({
+            options: {
+                pug: {
+                    basedir: rootDir
+                }
+            }
+        }),
+        new webpack.ProvidePlugin({
+            $: 'jquery',
+            jQuery: 'jquery',
+            _: 'lodash',
+            nv: 'nvd3'
+        }),
+        new webpack.DefinePlugin({NODE_ENV: JSON.stringify(NODE_ENV)}),
+        new webpack.optimize.CommonsChunkPlugin({name: 'vendor'}),
+        new webpack.optimize.AggressiveMergingPlugin({moveToParents: true}),
+        new HtmlWebpackPlugin({
+            template: './views/index.pug',
+            favicon
+        }),
+        new ExtractTextPlugin({filename: 'assets/css/[name].css', allChunks: true}),
+        new ProgressBarPlugin()
+    ]
 };

http://git-wip-us.apache.org/repos/asf/ignite/blob/1080e686/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 34e1f6a..c837c43 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
@@ -15,65 +15,47 @@
  * limitations under the License.
  */
 
-import path from 'path';
-import webpack from 'webpack';
-
-import {destDir, rootDir, srcDir} from '../../paths';
+import {destDir} from '../../paths';
 
 const backendPort = 3000;
 const devServerPort = 9000;
 
-export default () => {
-    const plugins = [
-        new webpack.HotModuleReplacementPlugin()
-    ];
-
-    return {
-        entry: {
-            app: [path.join(srcDir, 'app.js'), 'webpack/hot/only-dev-server']
-        },
-        output: {
-            publicPath: `http://localhost:${devServerPort}/`
-        },
-        context: rootDir,
-        debug: true,
-        devtool: 'source-map',
-        watch: true,
-        devServer: {
-            compress: true,
-            historyApiFallback: true,
-            contentBase: destDir,
-            hot: true,
-            inline: true,
-            proxy: {
-                '/socket.io': {
-                    target: `http://localhost:${backendPort}`,
-                    changeOrigin: true,
-                    ws: true
-                },
-                '/agents': {
-                    target: `http://localhost:${backendPort}`,
-                    changeOrigin: true,
-                    ws: true
-                },
-                '/api/v1/*': {
-                    target: `http://localhost:${backendPort}`,
-                    changeOrigin: true,
-                    pathRewrite: {
-                        '^/api/v1': ''
-                    }
-                }
+export default {
+    devtool: 'source-map',
+    watch: true,
+    devServer: {
+        compress: true,
+        historyApiFallback: true,
+        contentBase: destDir,
+        // hot: true,
+        inline: true,
+        proxy: {
+            '/socket.io': {
+                target: `http://localhost:${backendPort}`,
+                changeOrigin: true,
+                ws: true
             },
-            watchOptions: {
-                aggregateTimeout: 1000,
-                poll: 2000
+            '/agents': {
+                target: `http://localhost:${backendPort}`,
+                changeOrigin: true,
+                ws: true
             },
-            stats: {
-                colors: true,
-                chunks: false
-            },
-            port: devServerPort
+            '/api/v1/*': {
+                target: `http://localhost:${backendPort}`,
+                changeOrigin: true,
+                pathRewrite: {
+                    '^/api/v1': ''
+                }
+            }
+        },
+        watchOptions: {
+            aggregateTimeout: 1000,
+            poll: 2000
+        },
+        stats: {
+            colors: true,
+            chunks: false
         },
-        plugins
-    };
+        port: devServerPort
+    }
 };

http://git-wip-us.apache.org/repos/asf/ignite/blob/1080e686/modules/web-console/frontend/gulpfile.babel.js/webpack/environments/production.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/gulpfile.babel.js/webpack/environments/production.js b/modules/web-console/frontend/gulpfile.babel.js/webpack/environments/production.js
index 1194568..cbbe9ca 100644
--- a/modules/web-console/frontend/gulpfile.babel.js/webpack/environments/production.js
+++ b/modules/web-console/frontend/gulpfile.babel.js/webpack/environments/production.js
@@ -15,30 +15,27 @@
  * limitations under the License.
  */
 
+
 import webpack from 'webpack';
 
-import {destDir, rootDir} from '../../paths';
+import {destDir} from '../../paths';
 
-export default () => {
-    const plugins = [
-        new webpack.optimize.UglifyJsPlugin({
-            path: destDir,
-            minimize: true,
-            warnings: false,
-            sourceMap: false,
-            mangle: true
-        })
-    ];
+const plugins = [
+    new webpack.optimize.UglifyJsPlugin({
+        path: destDir,
+        minimize: true,
+        warnings: false,
+        sourceMap: false,
+        mangle: true
+    })
+];
 
-    return {
-        context: rootDir,
-        bail: true, // Cancel build on error.
-        debug: false,
-        devtool: 'cheap-source-map',
-        output: {
-            publicPath: '/',
-            filename: '[name].[chunkhash].js'
-        },
-        plugins
-    };
+export default {
+    bail: true, // Cancel build on error.
+    devtool: 'cheap-source-map',
+    output: {
+        publicPath: '/',
+        filename: '[name].[chunkhash].js'
+    },
+    plugins
 };

http://git-wip-us.apache.org/repos/asf/ignite/blob/1080e686/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
index 1c37196..0cb9b77 100644
--- a/modules/web-console/frontend/gulpfile.babel.js/webpack/environments/test.js
+++ b/modules/web-console/frontend/gulpfile.babel.js/webpack/environments/test.js
@@ -19,34 +19,26 @@ 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)})
-        ]
-    };
+export default {
+    cache: true,
+    node: {
+        fs: 'empty'
+    },
+
+    // Entry points.
+    entry: null,
+
+    // Output system.
+    output: 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/1080e686/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 9b344dd..3caf06c 100644
--- a/modules/web-console/frontend/gulpfile.babel.js/webpack/index.js
+++ b/modules/web-console/frontend/gulpfile.babel.js/webpack/index.js
@@ -19,6 +19,8 @@ import _ from 'lodash';
 import commonConfig from './common';
 import devConfig from './environments/development';
 import prodConfig from './environments/production';
+
+// TODO check test config
 import testConfig from './environments/test';
 
 const env = process.env.NODE_ENV || 'production';
@@ -31,4 +33,4 @@ const configs = {
 };
 
 // Load config file by environment
-export default _.merge(commonConfig(), configs[env]());
+export default _.merge(commonConfig, configs[env]);

http://git-wip-us.apache.org/repos/asf/ignite/blob/1080e686/modules/web-console/frontend/package.json
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/package.json b/modules/web-console/frontend/package.json
index 2d12655..b11f690 100644
--- a/modules/web-console/frontend/package.json
+++ b/modules/web-console/frontend/package.json
@@ -5,7 +5,7 @@
   "private": true,
   "scripts": {
     "dev": "cross-env NODE_ENV=development gulp watch",
-    "build": "cross-env NODE_ENV=production gulp build --no-ll",
+    "build": "cross-env NODE_ENV=production gulp build",
     "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"
   },
@@ -50,7 +50,7 @@
     "angular-ui-router": "0.4.2",
     "bootstrap-sass": "3.3.7",
     "brace": "0.8.0",
-    "es6-promise": "3.3.1",
+    "es6-promise": "4.0.5",
     "file-saver": "1.3.3",
     "font-awesome": "4.7.0",
     "glob": "7.1.1",
@@ -60,12 +60,12 @@
     "nvd3": "1.8.4",
     "raleway-webfont": "3.0.1",
     "roboto-font": "0.1.0",
-    "socket.io-client": "1.7.2",
+    "socket.io-client": "1.7.3",
     "ui-router-metatags": "1.0.3"
   },
   "devDependencies": {
     "assets-webpack-plugin": "3.5.1",
-    "autoprefixer-core": "6.0.1",
+    "autoprefixer": "6.7.5",
     "babel-core": "6.20.0",
     "babel-eslint": "7.0.0",
     "babel-loader": "6.2.10",
@@ -77,52 +77,50 @@
     "babel-preset-es2015": "6.18.0",
     "babel-runtime": "6.20.0",
     "chai": "3.5.0",
-    "cross-env": "1.0.8",
-    "css-loader": "0.26.1",
-    "eslint": "3.12.2",
+    "cross-env": "3.1.4",
+    "css-loader": "0.26.2",
+    "eslint": "3.16.1",
     "eslint-friendly-formatter": "2.0.7",
-    "eslint-loader": "1.6.1",
-    "expose-loader": "0.7.1",
-    "extract-text-webpack-plugin": "1.0.1",
-    "file-loader": "0.9.0",
+    "eslint-loader": "1.6.3",
+    "expose-loader": "0.7.3",
+    "extract-text-webpack-plugin": "2.0.0",
+    "file-loader": "0.10.1",
     "gulp": "3.9.1",
     "gulp-eslint": "3.0.1",
-    "gulp-inject": "4.1.0",
-    "gulp-jade": "1.1.0",
-    "gulp-ll": "1.0.4",
+    "gulp-inject": "4.2.0",
     "gulp-rimraf": "0.2.1",
     "gulp-sequence": "0.4.6",
     "gulp-util": "3.0.8",
-    "html-loader": "0.4.4",
-    "html-webpack-plugin": "2.24.1",
-    "jade": "1.11.0",
-    "jade-html-loader": "git://github.com/courcelan/jade-html-loader",
+    "html-loader": "0.4.5",
+    "html-webpack-plugin": "2.28.0",
     "jasmine-core": "2.5.2",
     "json-loader": "0.5.4",
-    "karma": "0.13.22",
+    "karma": "1.5.0",
     "karma-babel-preprocessor": "6.0.1",
     "karma-jasmine": "1.1.0",
     "karma-mocha": "1.3.0",
     "karma-mocha-reporter": "2.2.2",
     "karma-phantomjs-launcher": "1.0.2",
     "karma-teamcity-reporter": "1.0.0",
-    "karma-webpack": "1.8.1",
-    "mocha": "2.5.3",
+    "karma-webpack": "2.0.2",
+    "mocha": "3.2.0",
     "mocha-teamcity-reporter": "1.1.1",
-    "morgan": "1.7.0",
     "ngtemplate-loader": "1.3.1",
-    "node-sass": "3.13.1",
+    "node-sass": "4.5.0",
     "phantomjs-prebuilt": "2.1.14",
-    "postcss-loader": "0.9.1",
+    "postcss-loader": "1.3.2",
     "progress-bar-webpack-plugin": "1.9.3",
+    "pug-html-loader": "1.1.0",
+    "pug-loader": "2.3.0",
     "require-dir": "0.3.1",
-    "resolve-url-loader": "1.6.1",
-    "sass-loader": "3.2.2",
-    "style-loader": "0.13.1",
+    "resolve-url-loader": "2.0.0",
+    "sass-loader": "6.0.2",
+    "style-loader": "0.13.2",
     "url": "0.11.0",
-    "url-loader": "0.5.7",
-    "webpack": "1.14.0",
-    "webpack-dev-server": "1.16.3",
-    "worker-loader": "0.7.1"
+    "url-loader": "0.5.8",
+    "webpack": "2.2.1",
+    "webpack-dev-server": "2.4.1",
+    "webpack-stream": "3.2.0",
+    "worker-loader": "0.8.0"
   }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/1080e686/modules/web-console/frontend/test/e2e/exampe.test.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/test/e2e/exampe.test.js b/modules/web-console/frontend/test/e2e/exampe.test.js
index c778c79..00788bb 100644
--- a/modules/web-console/frontend/test/e2e/exampe.test.js
+++ b/modules/web-console/frontend/test/e2e/exampe.test.js
@@ -15,6 +15,8 @@
  * limitations under the License.
  */
 
+import { suite, test, setup } from 'mocha';
+
 suite('ExampleTestSuite', () => {
     setup(() => {
         // browser.get('http://localhost:9000/');
@@ -37,4 +39,4 @@ suite('ExampleTestSuite', () => {
 
         // element(by.model('ui.email')).sendKeys('jhon@doe.com');
     });
-});
\ No newline at end of file
+});

http://git-wip-us.apache.org/repos/asf/ignite/blob/1080e686/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
index 76a0ba0..992c4d0 100644
--- a/modules/web-console/frontend/test/karma.conf.babel.js
+++ b/modules/web-console/frontend/test/karma.conf.babel.js
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-import webpackConfig from '../gulpfile.babel.js/webpack';
+import webpack from '../gulpfile.babel.js/webpack';
 import path from 'path';
 
 const basePath = path.resolve('./');
@@ -23,7 +23,7 @@ const basePath = path.resolve('./');
 export default (config) => {
     config.set({
         // Base path that will be used to resolve all patterns (eg. files, exclude).
-        basePath: basePath,
+        basePath,
 
         // Frameworks to use available frameworks: https://npmjs.org/browse/keyword/karma-adapter
         frameworks: ['mocha'],
@@ -46,7 +46,8 @@ export default (config) => {
         preprocessors: {
             'test/**/*.js': ['webpack']
         },
-        webpack: webpackConfig,
+
+        webpack,
 
         webpackMiddleware: {
             noInfo: true

http://git-wip-us.apache.org/repos/asf/ignite/blob/1080e686/modules/web-console/frontend/test/protractor.conf.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/test/protractor.conf.js b/modules/web-console/frontend/test/protractor.conf.js
index 3386e66..4ee1c69 100644
--- a/modules/web-console/frontend/test/protractor.conf.js
+++ b/modules/web-console/frontend/test/protractor.conf.js
@@ -23,10 +23,10 @@
 // };
 
 exports.config = {
-  seleniumAddress: 'http://localhost:4444/wd/hub',
+    seleniumAddress: 'http://localhost:4444/wd/hub',
 
-  capabilities: {
-    'browserName': 'chrome'
+    capabilities: {
+        browserName: 'chrome'
     // 'browserName': 'phantomjs',
 
     // /*
@@ -40,11 +40,11 @@ exports.config = {
     //  * See https://github.com/detro/ghostdriver#faq
     //  */
     // 'phantomjs.ghostdriver.cli.args': ['--loglevel=DEBUG']
-  },
+    },
 
-  specs: ['test/e2e/*.js'],
+    specs: ['test/e2e/*.js'],
 
-  jasmineNodeOpts: {
-    showColors: true
-  }
+    jasmineNodeOpts: {
+        showColors: true
+    }
 };

http://git-wip-us.apache.org/repos/asf/ignite/blob/1080e686/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
index 3f39000..7dacc16 100644
--- a/modules/web-console/frontend/test/unit/JavaTransformer.test.js
+++ b/modules/web-console/frontend/test/unit/JavaTransformer.test.js
@@ -20,7 +20,7 @@ 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';
+import { suite, test } from 'mocha';
 
 suite.skip('JavaTransformerTestsSuite', () => {
     test('AtomicConfiguration', () => {

http://git-wip-us.apache.org/repos/asf/ignite/blob/1080e686/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 49e78cc..e42d687 100644
--- a/modules/web-console/frontend/test/unit/JavaTypes.test.js
+++ b/modules/web-console/frontend/test/unit/JavaTypes.test.js
@@ -21,113 +21,114 @@ import ClusterDflts from '../../app/modules/configuration/generator/defaults/Clu
 import CacheDflts from '../../app/modules/configuration/generator/defaults/Cache.service';
 import IgfsDflts from '../../app/modules/configuration/generator/defaults/IGFS.service';
 
-const INSTANCE = new JavaTypes(new ClusterDflts(), new CacheDflts(), new IgfsDflts());
+const instance = new JavaTypes(new ClusterDflts(), new CacheDflts(), new IgfsDflts());
 
+import { suite, test } from 'mocha';
 import { assert } from 'chai';
 
 suite('JavaTypesTestsSuite', () => {
     test('nonBuiltInClass', () => {
-        assert.equal(INSTANCE.nonBuiltInClass('BigDecimal'), false);
-        assert.equal(INSTANCE.nonBuiltInClass('java.math.BigDecimal'), false);
+        assert.equal(instance.nonBuiltInClass('BigDecimal'), false);
+        assert.equal(instance.nonBuiltInClass('java.math.BigDecimal'), false);
 
-        assert.equal(INSTANCE.nonBuiltInClass('String'), false);
-        assert.equal(INSTANCE.nonBuiltInClass('java.lang.String'), false);
+        assert.equal(instance.nonBuiltInClass('String'), false);
+        assert.equal(instance.nonBuiltInClass('java.lang.String'), false);
 
-        assert.equal(INSTANCE.nonBuiltInClass('Timestamp'), false);
-        assert.equal(INSTANCE.nonBuiltInClass('java.sql.Timestamp'), false);
+        assert.equal(instance.nonBuiltInClass('Timestamp'), false);
+        assert.equal(instance.nonBuiltInClass('java.sql.Timestamp'), false);
 
-        assert.equal(INSTANCE.nonBuiltInClass('Date'), false);
-        assert.equal(INSTANCE.nonBuiltInClass('java.sql.Date'), false);
+        assert.equal(instance.nonBuiltInClass('Date'), false);
+        assert.equal(instance.nonBuiltInClass('java.sql.Date'), false);
 
-        assert.equal(INSTANCE.nonBuiltInClass('Date'), false);
-        assert.equal(INSTANCE.nonBuiltInClass('java.util.Date'), false);
+        assert.equal(instance.nonBuiltInClass('Date'), false);
+        assert.equal(instance.nonBuiltInClass('java.util.Date'), false);
 
-        assert.equal(INSTANCE.nonBuiltInClass('CustomClass'), true);
-        assert.equal(INSTANCE.nonBuiltInClass('java.util.CustomClass'), true);
-        assert.equal(INSTANCE.nonBuiltInClass('my.package.CustomClass'), true);
+        assert.equal(instance.nonBuiltInClass('CustomClass'), true);
+        assert.equal(instance.nonBuiltInClass('java.util.CustomClass'), true);
+        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);
+        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('BigDecimal'), 'BigDecimal');
-        assert.equal(INSTANCE.shortClassName('int'), 'int');
-        assert.equal(INSTANCE.shortClassName('java.lang.Integer'), 'Integer');
-        assert.equal(INSTANCE.shortClassName('Integer'), 'Integer');
-        assert.equal(INSTANCE.shortClassName('java.util.UUID'), 'UUID');
-        assert.equal(INSTANCE.shortClassName('java.sql.Date'), 'Date');
-        assert.equal(INSTANCE.shortClassName('Date'), 'Date');
-        assert.equal(INSTANCE.shortClassName('com.my.Abstract'), 'Abstract');
-        assert.equal(INSTANCE.shortClassName('Abstract'), 'Abstract');
+        assert.equal(instance.shortClassName('java.math.BigDecimal'), 'BigDecimal');
+        assert.equal(instance.shortClassName('BigDecimal'), 'BigDecimal');
+        assert.equal(instance.shortClassName('int'), 'int');
+        assert.equal(instance.shortClassName('java.lang.Integer'), 'Integer');
+        assert.equal(instance.shortClassName('Integer'), 'Integer');
+        assert.equal(instance.shortClassName('java.util.UUID'), 'UUID');
+        assert.equal(instance.shortClassName('java.sql.Date'), 'Date');
+        assert.equal(instance.shortClassName('Date'), 'Date');
+        assert.equal(instance.shortClassName('com.my.Abstract'), 'Abstract');
+        assert.equal(instance.shortClassName('Abstract'), 'Abstract');
     });
 
     test('fullClassName', () => {
-        assert.equal(INSTANCE.fullClassName('BigDecimal'), 'java.math.BigDecimal');
+        assert.equal(instance.fullClassName('BigDecimal'), 'java.math.BigDecimal');
     });
 
     test('validIdentifier', () => {
-        assert.equal(INSTANCE.validIdentifier('myIdent'), true);
-        assert.equal(INSTANCE.validIdentifier('java.math.BigDecimal'), false);
-        assert.equal(INSTANCE.validIdentifier('2Demo'), false);
-        assert.equal(INSTANCE.validIdentifier('abra kadabra'), false);
-        assert.equal(INSTANCE.validIdentifier(undefined), false);
-        assert.equal(INSTANCE.validIdentifier(null), false);
-        assert.equal(INSTANCE.validIdentifier(''), false);
-        assert.equal(INSTANCE.validIdentifier(' '), false);
+        assert.equal(instance.validIdentifier('myIdent'), true);
+        assert.equal(instance.validIdentifier('java.math.BigDecimal'), false);
+        assert.equal(instance.validIdentifier('2Demo'), false);
+        assert.equal(instance.validIdentifier('abra kadabra'), false);
+        assert.equal(instance.validIdentifier(), false);
+        assert.equal(instance.validIdentifier(null), false);
+        assert.equal(instance.validIdentifier(''), false);
+        assert.equal(instance.validIdentifier(' '), false);
     });
 
     test('validClassName', () => {
-        assert.equal(INSTANCE.validClassName('java.math.BigDecimal'), true);
-        assert.equal(INSTANCE.validClassName('2Demo'), false);
-        assert.equal(INSTANCE.validClassName('abra kadabra'), false);
-        assert.equal(INSTANCE.validClassName(undefined), false);
-        assert.equal(INSTANCE.validClassName(null), false);
-        assert.equal(INSTANCE.validClassName(''), false);
-        assert.equal(INSTANCE.validClassName(' '), false);
+        assert.equal(instance.validClassName('java.math.BigDecimal'), true);
+        assert.equal(instance.validClassName('2Demo'), false);
+        assert.equal(instance.validClassName('abra kadabra'), false);
+        assert.equal(instance.validClassName(), false);
+        assert.equal(instance.validClassName(null), false);
+        assert.equal(instance.validClassName(''), false);
+        assert.equal(instance.validClassName(' '), false);
     });
 
     test('validPackage', () => {
-        assert.equal(INSTANCE.validPackage('java.math.BigDecimal'), true);
-        assert.equal(INSTANCE.validPackage('my.org.SomeClass'), true);
-        assert.equal(INSTANCE.validPackage('25'), false);
-        assert.equal(INSTANCE.validPackage('abra kadabra'), false);
-        assert.equal(INSTANCE.validPackage(''), false);
-        assert.equal(INSTANCE.validPackage(' '), false);
+        assert.equal(instance.validPackage('java.math.BigDecimal'), true);
+        assert.equal(instance.validPackage('my.org.SomeClass'), true);
+        assert.equal(instance.validPackage('25'), false);
+        assert.equal(instance.validPackage('abra kadabra'), false);
+        assert.equal(instance.validPackage(''), false);
+        assert.equal(instance.validPackage(' '), false);
     });
 
     test('packageSpecified', () => {
-        assert.equal(INSTANCE.packageSpecified('java.math.BigDecimal'), true);
-        assert.equal(INSTANCE.packageSpecified('BigDecimal'), false);
+        assert.equal(instance.packageSpecified('java.math.BigDecimal'), true);
+        assert.equal(instance.packageSpecified('BigDecimal'), false);
     });
 
     test('isKeyword', () => {
-        assert.equal(INSTANCE.isKeyword('abstract'), true);
-        assert.equal(INSTANCE.isKeyword('Abstract'), true);
-        assert.equal(INSTANCE.isKeyword('abra kadabra'), false);
-        assert.equal(INSTANCE.isKeyword(undefined), false);
-        assert.equal(INSTANCE.isKeyword(null), false);
-        assert.equal(INSTANCE.isKeyword(''), false);
-        assert.equal(INSTANCE.isKeyword(' '), false);
+        assert.equal(instance.isKeyword('abstract'), true);
+        assert.equal(instance.isKeyword('Abstract'), true);
+        assert.equal(instance.isKeyword('abra kadabra'), false);
+        assert.equal(instance.isKeyword(), false);
+        assert.equal(instance.isKeyword(null), false);
+        assert.equal(instance.isKeyword(''), false);
+        assert.equal(instance.isKeyword(' '), false);
     });
 
     test('isPrimitive', () => {
-        assert.equal(INSTANCE.isPrimitive('boolean'), true);
+        assert.equal(instance.isPrimitive('boolean'), true);
     });
 
     test('validUUID', () => {
-        assert.equal(INSTANCE.validUUID('123e4567-e89b-12d3-a456-426655440000'), true);
-        assert.equal(INSTANCE.validUUID('12345'), false);
-        assert.equal(INSTANCE.validUUID(undefined), false);
-        assert.equal(INSTANCE.validUUID(null), false);
-        assert.equal(INSTANCE.validUUID(''), false);
-        assert.equal(INSTANCE.validUUID(' '), false);
+        assert.equal(instance.validUUID('123e4567-e89b-12d3-a456-426655440000'), true);
+        assert.equal(instance.validUUID('12345'), false);
+        assert.equal(instance.validUUID(), false);
+        assert.equal(instance.validUUID(null), false);
+        assert.equal(instance.validUUID(''), false);
+        assert.equal(instance.validUUID(' '), false);
     });
 });

http://git-wip-us.apache.org/repos/asf/ignite/blob/1080e686/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
index 20de266..3fb9265 100644
--- a/modules/web-console/frontend/test/unit/SharpTransformer.test.js
+++ b/modules/web-console/frontend/test/unit/SharpTransformer.test.js
@@ -18,7 +18,7 @@
 import generator from '../../app/modules/configuration/generator/PlatformGenerator';
 import transformer from '../../app/modules/configuration/generator/SharpTransformer.service';
 
-import { assert } from 'chai';
+import { suite, test } from 'mocha';
 
 suite.skip('SharpTransformerTestsSuite', () => {
     test('AtomicConfiguration', () => {

http://git-wip-us.apache.org/repos/asf/ignite/blob/1080e686/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
index 7998f66..e96cab3 100644
--- a/modules/web-console/frontend/test/unit/SpringTransformer.test.js
+++ b/modules/web-console/frontend/test/unit/SpringTransformer.test.js
@@ -20,7 +20,7 @@ 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';
+import { suite, test } from 'mocha';
 
 suite.skip('SpringTransformerTestsSuite', () => {
     test('AtomicConfiguration', () => {

http://git-wip-us.apache.org/repos/asf/ignite/blob/1080e686/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 2d54bdf..17f899c 100644
--- a/modules/web-console/frontend/test/unit/SqlTypes.test.js
+++ b/modules/web-console/frontend/test/unit/SqlTypes.test.js
@@ -19,6 +19,7 @@ import SqlTypes from '../../app/services/SqlTypes.service.js';
 
 const INSTANCE = new SqlTypes();
 
+import { suite, test } from 'mocha';
 import { assert } from 'chai';
 
 suite('SqlTypesTestsSuite', () => {
@@ -27,7 +28,7 @@ suite('SqlTypesTestsSuite', () => {
         assert.equal(INSTANCE.validIdentifier('java.math.BigDecimal'), false);
         assert.equal(INSTANCE.validIdentifier('2Demo'), false);
         assert.equal(INSTANCE.validIdentifier('abra kadabra'), false);
-        assert.equal(INSTANCE.validIdentifier(undefined), false);
+        assert.equal(INSTANCE.validIdentifier(), false);
         assert.equal(INSTANCE.validIdentifier(null), false);
         assert.equal(INSTANCE.validIdentifier(''), false);
         assert.equal(INSTANCE.validIdentifier(' '), false);
@@ -38,7 +39,7 @@ suite('SqlTypesTestsSuite', () => {
         assert.equal(INSTANCE.isKeyword('Group'), true);
         assert.equal(INSTANCE.isKeyword('select'), true);
         assert.equal(INSTANCE.isKeyword('abra kadabra'), false);
-        assert.equal(INSTANCE.isKeyword(undefined), false);
+        assert.equal(INSTANCE.isKeyword(), false);
         assert.equal(INSTANCE.isKeyword(null), false);
         assert.equal(INSTANCE.isKeyword(''), false);
         assert.equal(INSTANCE.isKeyword(' '), false);
@@ -47,5 +48,5 @@ suite('SqlTypesTestsSuite', () => {
     test('findJdbcType', () => {
         assert.equal(INSTANCE.findJdbcType(0).dbName, 'NULL');
         assert.equal(INSTANCE.findJdbcType(5555).dbName, 'Unknown');
-    })
+    });
 });

http://git-wip-us.apache.org/repos/asf/ignite/blob/1080e686/modules/web-console/frontend/test/unit/UserAuth.test.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/test/unit/UserAuth.test.js b/modules/web-console/frontend/test/unit/UserAuth.test.js
index dbba1f6..7b6b24c 100644
--- a/modules/web-console/frontend/test/unit/UserAuth.test.js
+++ b/modules/web-console/frontend/test/unit/UserAuth.test.js
@@ -15,7 +15,9 @@
  * limitations under the License.
  */
 
-import AuthService from '../../app/modules/user/Auth.service';
+// import AuthService from '../../app/modules/user/Auth.service';
+
+import { suite, test } from 'mocha';
 
 suite('AuthServiceTestsSuite', () => {
     test('SignIn', (done) => {

http://git-wip-us.apache.org/repos/asf/ignite/blob/1080e686/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
index 72685ea..d8c8f65 100644
--- a/modules/web-console/frontend/test/unit/Version.test.js
+++ b/modules/web-console/frontend/test/unit/Version.test.js
@@ -19,6 +19,7 @@ import VersionService from '../../app/modules/configuration/Version.service';
 
 const INSTANCE = new VersionService();
 
+import { suite, test } from 'mocha';
 import { assert } from 'chai';
 
 suite('VersionServiceTestsSuite', () => {

http://git-wip-us.apache.org/repos/asf/ignite/blob/1080e686/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
index 5f28290..2eaf223 100644
--- a/modules/web-console/frontend/test/unit/defaultName.filter.test.js
+++ b/modules/web-console/frontend/test/unit/defaultName.filter.test.js
@@ -17,22 +17,25 @@
 
 import defaultName from '../../app/filters/default-name.filter';
 
+import { suite, test } from 'mocha';
 import { assert } from 'chai';
 
-const INSTANCE = defaultName[0]();
+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');
+        let undef;
+
+        assert.equal(instance(''), '<default>');
+        assert.equal(instance(null), '<default>');
+        assert.equal(instance(), '<default>');
+        assert.equal(instance('', false), '<default>');
+        assert.equal(instance(null, false), '<default>');
+        assert.equal(instance(undef, false), '<default>');
+        assert.equal(instance('', true), '&lt;default&gt;');
+        assert.equal(instance(null, true), '&lt;default&gt;');
+        assert.equal(instance(undef, 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/1080e686/modules/web-console/frontend/views/403.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/views/403.jade b/modules/web-console/frontend/views/403.jade
deleted file mode 100644
index 38d8bb5..0000000
--- a/modules/web-console/frontend/views/403.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.
-
-include includes/header
-
-.error-page
-    .container
-        h1.error-page__title 403
-        h2.error-page__description You are not authorized

http://git-wip-us.apache.org/repos/asf/ignite/blob/1080e686/modules/web-console/frontend/views/403.pug
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/views/403.pug b/modules/web-console/frontend/views/403.pug
new file mode 100644
index 0000000..38d8bb5
--- /dev/null
+++ b/modules/web-console/frontend/views/403.pug
@@ -0,0 +1,22 @@
+//-
+    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.
+
+include includes/header
+
+.error-page
+    .container
+        h1.error-page__title 403
+        h2.error-page__description You are not authorized

http://git-wip-us.apache.org/repos/asf/ignite/blob/1080e686/modules/web-console/frontend/views/404.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/views/404.jade b/modules/web-console/frontend/views/404.jade
deleted file mode 100644
index 7d2fc55..0000000
--- a/modules/web-console/frontend/views/404.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.
-
-include includes/header
-
-.error-page
-    .container
-        h1.error-page__title 404
-        h2.error-page__description Page not found

http://git-wip-us.apache.org/repos/asf/ignite/blob/1080e686/modules/web-console/frontend/views/404.pug
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/views/404.pug b/modules/web-console/frontend/views/404.pug
new file mode 100644
index 0000000..7d2fc55
--- /dev/null
+++ b/modules/web-console/frontend/views/404.pug
@@ -0,0 +1,22 @@
+//-
+    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.
+
+include includes/header
+
+.error-page
+    .container
+        h1.error-page__title 404
+        h2.error-page__description Page not found

http://git-wip-us.apache.org/repos/asf/ignite/blob/1080e686/modules/web-console/frontend/views/base.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/views/base.jade b/modules/web-console/frontend/views/base.jade
deleted file mode 100644
index a910d1b..0000000
--- a/modules/web-console/frontend/views/base.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.
-
-include includes/header
-
-.container.body-container
-    .main-content(ui-view='')
-
-include includes/footer

http://git-wip-us.apache.org/repos/asf/ignite/blob/1080e686/modules/web-console/frontend/views/base.pug
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/views/base.pug b/modules/web-console/frontend/views/base.pug
new file mode 100644
index 0000000..b05cdba
--- /dev/null
+++ b/modules/web-console/frontend/views/base.pug
@@ -0,0 +1,22 @@
+//-
+    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.
+
+include ./includes/header
+
+.container.body-container
+    .main-content(ui-view='')
+
+include ./includes/footer

http://git-wip-us.apache.org/repos/asf/ignite/blob/1080e686/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
deleted file mode 100644
index 73a6309..0000000
--- a/modules/web-console/frontend/views/configuration/caches.jade
+++ /dev/null
@@ -1,55 +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.
-
-include /app/helpers/jade/mixins.jade
-
-.docs-header
-    h1 Configure Ignite Caches
-.docs-body(ng-controller='cachesController')
-    ignite-information
-        ul
-            li Configure #[a(href='https://apacheignite.readme.io/docs/data-grid' target='_blank') memory] settings
-            li Configure persistence
-    div(ignite-loading='loadingCachesScreen' ignite-loading-text='Loading caches...' ignite-loading-position='top')
-        div(ng-show='ui.ready')
-            hr
-            +main-table('caches', 'caches', 'cacheName', 'selectItem(row)', '{{$index + 1}}) {{row.label}}', 'label')
-            .padding-top-dflt(bs-affix)
-                .panel-tip-container(data-placement='bottom' bs-tooltip='' data-title='Create new cache')
-                    button.btn.btn-primary(id='new-item' ng-click='createItem()') Add cache
-                +save-remove-clone-undo-buttons('cache')
-                hr
-            .bs-affix-fix
-            div(bs-collapse='' data-allow-multiple='true' ng-model='ui.activePanels')
-                form.form-horizontal(name='ui.inputForm' novalidate ng-if='contentVisible()')
-                    .panel-group
-                        include /app/modules/states/configuration/caches/general.jade
-                        include /app/modules/states/configuration/caches/memory.jade
-                        include /app/modules/states/configuration/caches/query.jade
-                        include /app/modules/states/configuration/caches/store.jade
-
-                        +advanced-options-toggle-default
-
-                        div(ng-show='ui.expanded')
-                            include /app/modules/states/configuration/caches/affinity.jade
-                            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/statistics.jade
-
-                            +advanced-options-toggle-default

http://git-wip-us.apache.org/repos/asf/ignite/blob/1080e686/modules/web-console/frontend/views/configuration/caches.tpl.pug
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/views/configuration/caches.tpl.pug b/modules/web-console/frontend/views/configuration/caches.tpl.pug
new file mode 100644
index 0000000..fca41a8
--- /dev/null
+++ b/modules/web-console/frontend/views/configuration/caches.tpl.pug
@@ -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.
+
+include /app/helpers/jade/mixins
+
+.docs-header
+    h1 Configure Ignite Caches
+.docs-body(ng-controller='cachesController')
+    ignite-information
+        ul
+            li Configure #[a(href='https://apacheignite.readme.io/docs/data-grid' target='_blank') memory] settings
+            li Configure persistence
+    div(ignite-loading='loadingCachesScreen' ignite-loading-text='Loading caches...' ignite-loading-position='top')
+        div(ng-show='ui.ready')
+            hr
+            +main-table('caches', 'caches', 'cacheName', 'selectItem(row)', '{{$index + 1}}) {{row.label}}', 'label')
+            .padding-top-dflt(bs-affix)
+                .panel-tip-container(data-placement='bottom' bs-tooltip='' data-title='Create new cache')
+                    button.btn.btn-primary(id='new-item' ng-click='createItem()') Add cache
+                +save-remove-clone-undo-buttons('cache')
+                hr
+            .bs-affix-fix
+            div(bs-collapse='' data-allow-multiple='true' ng-model='ui.activePanels')
+                form.form-horizontal(name='ui.inputForm' novalidate ng-if='contentVisible()')
+                    .panel-group
+                        include /app/modules/states/configuration/caches/general
+                        include /app/modules/states/configuration/caches/memory
+                        include /app/modules/states/configuration/caches/query
+                        include /app/modules/states/configuration/caches/store
+
+                        +advanced-options-toggle-default
+
+                        div(ng-show='ui.expanded')
+                            include /app/modules/states/configuration/caches/affinity
+                            include /app/modules/states/configuration/caches/concurrency
+                            include /app/modules/states/configuration/caches/near-cache-client
+                            include /app/modules/states/configuration/caches/near-cache-server
+                            include /app/modules/states/configuration/caches/node-filter
+                            include /app/modules/states/configuration/caches/rebalance
+                            include /app/modules/states/configuration/caches/statistics
+
+                            +advanced-options-toggle-default

http://git-wip-us.apache.org/repos/asf/ignite/blob/1080e686/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
deleted file mode 100644
index 7826464..0000000
--- a/modules/web-console/frontend/views/configuration/clusters.jade
+++ /dev/null
@@ -1,68 +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.
-
-include /app/helpers/jade/mixins.jade
-
-.docs-header
-    h1 Configure Ignite Clusters
-.docs-body(ng-controller='clustersController')
-    ignite-information
-        ul
-            li Configure #[a(href='https://apacheignite.readme.io/docs/clustering' target='_blank') clusters] properties
-            li Associate clusters with caches and in-memory file systems
-    div(ignite-loading='loadingClustersScreen' ignite-loading-text='Loading clusters...' ignite-loading-position='top')
-        div(ng-show='ui.ready')
-            hr
-            +main-table('clusters', 'clusters', 'clusterName', 'selectItem(row)', '{{$index + 1}}) {{row.label}}', 'label')
-            .padding-top-dflt(bs-affix)
-                .panel-tip-container(data-placement='bottom' bs-tooltip='' data-title='Create new cluster')
-                    button.btn.btn-primary(id='new-item' ng-click='createItem()') Add cluster
-                +save-remove-clone-undo-buttons('cluster')
-                hr
-            .bs-affix-fix
-            div(bs-collapse='' data-allow-multiple='true' ng-model='ui.activePanels')
-                form.form-horizontal(name='ui.inputForm' novalidate ng-if='contentVisible()')
-                    .panel-group
-                        include /app/modules/states/configuration/clusters/general.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
-                            include /app/modules/states/configuration/clusters/deployment.jade
-                            include /app/modules/states/configuration/clusters/discovery.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
-                            include /app/modules/states/configuration/clusters/odbc.jade
-                            include /app/modules/states/configuration/clusters/ssl.jade
-                            include /app/modules/states/configuration/clusters/swap.jade
-                            include /app/modules/states/configuration/clusters/thread.jade
-                            include /app/modules/states/configuration/clusters/time.jade
-                            include /app/modules/states/configuration/clusters/transactions.jade
-                            include /app/modules/states/configuration/clusters/attributes.jade
-
-                            +advanced-options-toggle-default

http://git-wip-us.apache.org/repos/asf/ignite/blob/1080e686/modules/web-console/frontend/views/configuration/clusters.tpl.pug
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/views/configuration/clusters.tpl.pug b/modules/web-console/frontend/views/configuration/clusters.tpl.pug
new file mode 100644
index 0000000..c979012
--- /dev/null
+++ b/modules/web-console/frontend/views/configuration/clusters.tpl.pug
@@ -0,0 +1,68 @@
+//-
+    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.
+
+include /app/helpers/jade/mixins
+
+.docs-header
+    h1 Configure Ignite Clusters
+.docs-body(ng-controller='clustersController')
+    ignite-information
+        ul
+            li Configure #[a(href='https://apacheignite.readme.io/docs/clustering' target='_blank') clusters] properties
+            li Associate clusters with caches and in-memory file systems
+    div(ignite-loading='loadingClustersScreen' ignite-loading-text='Loading clusters...' ignite-loading-position='top')
+        div(ng-show='ui.ready')
+            hr
+            +main-table('clusters', 'clusters', 'clusterName', 'selectItem(row)', '{{$index + 1}}) {{row.label}}', 'label')
+            .padding-top-dflt(bs-affix)
+                .panel-tip-container(data-placement='bottom' bs-tooltip='' data-title='Create new cluster')
+                    button.btn.btn-primary(id='new-item' ng-click='createItem()') Add cluster
+                +save-remove-clone-undo-buttons('cluster')
+                hr
+            .bs-affix-fix
+            div(bs-collapse='' data-allow-multiple='true' ng-model='ui.activePanels')
+                form.form-horizontal(name='ui.inputForm' novalidate ng-if='contentVisible()')
+                    .panel-group
+                        include /app/modules/states/configuration/clusters/general
+
+                        +advanced-options-toggle-default
+
+                        div(ng-show='ui.expanded')
+                            include /app/modules/states/configuration/clusters/atomic
+                            include /app/modules/states/configuration/clusters/binary
+                            include /app/modules/states/configuration/clusters/cache-key-cfg
+                            include /app/modules/states/configuration/clusters/checkpoint
+                            include /app/modules/states/configuration/clusters/collision
+                            include /app/modules/states/configuration/clusters/communication
+                            include /app/modules/states/configuration/clusters/connector
+                            include /app/modules/states/configuration/clusters/deployment
+                            include /app/modules/states/configuration/clusters/discovery
+                            include /app/modules/states/configuration/clusters/events
+                            include /app/modules/states/configuration/clusters/failover
+                            include /app/modules/states/configuration/clusters/igfs
+                            include /app/modules/states/configuration/clusters/load-balancing
+                            include /app/modules/states/configuration/clusters/logger
+                            include /app/modules/states/configuration/clusters/marshaller
+                            include /app/modules/states/configuration/clusters/metrics
+                            include /app/modules/states/configuration/clusters/odbc
+                            include /app/modules/states/configuration/clusters/ssl
+                            include /app/modules/states/configuration/clusters/swap
+                            include /app/modules/states/configuration/clusters/thread
+                            include /app/modules/states/configuration/clusters/time
+                            include /app/modules/states/configuration/clusters/transactions
+                            include /app/modules/states/configuration/clusters/attributes
+
+                            +advanced-options-toggle-default