diff --git a/tools/gui/gulp-tasks/bundles/bundle-js/index.js b/tools/gui/gulp-tasks/bundles/bundle-js/index.js
index 7b05051..212034a 100644
--- a/tools/gui/gulp-tasks/bundles/bundle-js/index.js
+++ b/tools/gui/gulp-tasks/bundles/bundle-js/index.js
@@ -45,13 +45,8 @@
 }
 
 const tasks = function () {
-    // gulp.task('bundle-vendor', () => bundle(vendor, 'vendor.js'));
+    gulp.task('bundle-vendor', () => bundle(vendor, 'vendor.js'));
     gulp.task('bundle-js', () => bundle(bundleFiles, 'onos.js'));
-    gulp.task('watch-js', () => {
-        gulp.watch([GUI_BASE + '**/*.js', `!${GUI_BASE}/dist/**/*`], ['bundle-js']);
-    }).on('change', (event) => {
-        console.log('File ' + event.path + ' was ' + event.type + ', running tasks...');
-    });
 };
 
 export default tasks();
\ No newline at end of file
diff --git a/tools/gui/gulp-tasks/dev-server/index.js b/tools/gui/gulp-tasks/dev-server/index.js
deleted file mode 100644
index f0dddf7..0000000
--- a/tools/gui/gulp-tasks/dev-server/index.js
+++ /dev/null
@@ -1,69 +0,0 @@
-import gulp from 'gulp';
-import browserSync from 'browser-sync';
-import fs from 'fs';
-import webserver from 'gulp-webserver';
-import proxy from 'http-proxy-middleware';
-
-console.log(proxy)
-
-let external_apps;
-
-const files = ['../../web/gui/src/main/webapp/**/*.js'];
-const defaultViews = fs.readdirSync('../../web/gui/src/main/webapp/app/view/');
-const viewNameMatcher = new RegExp(/\/onos\/ui\/app\/view\/(.+)\/.+\.(?:js|css|html)/);
-
-if (process.env.ONOS_EXTERNAL_APP_DIRS) {
-    let external_apps = process.env.ONOS_EXTERNAL_APP_DIRS.replace(/\s/,'').split(',');
-
-    external_apps = external_apps.reduce(function (dict, app) {
-        const pieces = app.split(':');
-        const appName = pieces[0];
-        const appPath = pieces[1];
-        dict[appName] = appPath;
-        return dict;
-    }, {});
-}
-
-const checkExternalApp = (url) => {
-    if(external_apps){
-        for(let i = 0; i < Object.keys(external_apps).length; i++){
-            const key = Object.keys(external_apps)[i];
-            if (url.indexOf(key) !== -1) {
-                return key;
-            }
-        }
-    }
-    return false;
-};
-
-const serve = () => {
-    browserSync.init({
-        proxy: {
-            target: 'http://localhost:8181',
-            ws: true,
-            middleware: [
-                proxy(['**/*.js', '!/onos/ui/onos.js'], { target: 'http://localhost:8189' }),
-                proxy('**/*.js.map', {
-                    target: 'http://localhost:8189',
-                    changeOrigin: true,
-                    logLevel: 'debug'
-                })
-            ]
-        }
-    });
-};
-
-const tasks = () => {
-    gulp.task('serve', ['bundle-js', 'proxy-server'], serve);
-    gulp.task('proxy-server', function() {
-        gulp.src('../../web/gui/src/main/webapp')
-            .pipe(webserver({
-                port: 8189,
-                path: '/onos/ui/'
-            }));
-    });
-};
-
-export default tasks();
-
-
diff --git a/tools/gui/gulp-tasks/index.js b/tools/gui/gulp-tasks/index.js
index 2f2019b..3bef084 100644
--- a/tools/gui/gulp-tasks/index.js
+++ b/tools/gui/gulp-tasks/index.js
@@ -1,5 +1,2 @@
 export { default as BundleJS } from './bundles/bundle-js';
-export { default as BundleCSS } from './bundles/bundle-css';
-export { default as Lint } from './lint';
-export { default as DevServer } from './dev-server';
-// export { default as Tests } from './unit-tests';
\ No newline at end of file
+export { default as BundleCSS } from './bundles/bundle-css';
\ No newline at end of file
diff --git a/tools/gui/gulp-tasks/lint/esconfig.json b/tools/gui/gulp-tasks/lint/esconfig.json
deleted file mode 100644
index 7ce1a78..0000000
--- a/tools/gui/gulp-tasks/lint/esconfig.json
+++ /dev/null
@@ -1,27 +0,0 @@
-{
-    "extends": "google",
-    "globals": {
-        "angular": true,
-        "d3": true,
-        "_": true
-    },
-    "rules": {
-        "prefer-spread": 0,
-        "prefer-rest-params": 0,
-        "no-var": 0,
-        "comma-dangle": 1,
-        "brace-style": 0,
-        "no-void": 0,
-        "require-jsdoc": 0,
-        "padded-blocks": 0,
-        "quote-props": 0,
-        "no-warning-comments": 0,
-        "object-curly-spacing": ["error", "always"],
-        "indent": 0,
-        "one-var": 0,
-        "block-spacing": ["error", "always"],
-        "space-before-function-paren": ["error", { "anonymous": "always", "named": "never" }],
-        "max-len": ["error", 120],
-        "no-invalid-this": 0
-    }
-}
diff --git a/tools/gui/gulp-tasks/lint/index.js b/tools/gui/gulp-tasks/lint/index.js
deleted file mode 100644
index 8dabc49..0000000
--- a/tools/gui/gulp-tasks/lint/index.js
+++ /dev/null
@@ -1,33 +0,0 @@
-import gulp from 'gulp';
-import eslint from 'gulp-eslint';
-import gulpIf from 'gulp-if';
-import path from 'path';
-
-const files = [
-    '../../web/gui/src/main/webapp/app/**/*.js'
-];
-
-function isFixed(file) {
-    // Has ESLint fixed the file contents?
-    return file.eslint != null && file.eslint.fixed;
-}
-
-const lint = () => {
-    return gulp.src(files)
-        .pipe(eslint({
-            configFile: path.join(__dirname, 'esconfig.json'),
-            useEslintrc: false,
-            // Automatically fix trivial issues
-            fix: true,
-        }))
-        .pipe(eslint.format())
-        .pipe(gulpIf(isFixed,
-            gulp.dest('../../web/gui/src/main/webapp/app')
-        ));
-};
-
-const tasks = () => {
-    gulp.task('lint', () => lint());
-};
-
-export default tasks();
\ No newline at end of file
diff --git a/tools/gui/gulpfile.babel.js b/tools/gui/gulpfile.babel.js
index 59726cc..7c5056d 100644
--- a/tools/gui/gulpfile.babel.js
+++ b/tools/gui/gulpfile.babel.js
@@ -1,7 +1,9 @@
 import gulp from 'gulp';
 import * as Tasks from './gulp-tasks/';
 
-gulp.task('build', ['bundle-css', 'bundle-js']);
+gulp.task('build', ['bundle-css', 'bundle-vendor', 'bundle-js']);
 gulp.task('tests', ['test']);
 
-gulp.task('default', ['bundle-js', 'serve', 'watch-js']);
\ No newline at end of file
+gulp.task('default', function() {
+    // Do stuff
+});
\ No newline at end of file
diff --git a/tools/gui/package.json b/tools/gui/package.json
index a6a79f2..4c2aeb0 100644
--- a/tools/gui/package.json
+++ b/tools/gui/package.json
@@ -14,18 +14,11 @@
     "babel": "^6.23.0",
     "babel-core": "^6.25.0",
     "babel-preset-es2015": "^6.24.1",
-    "browser-sync": "^2.18.12",
-    "eslint": "^4.2.0",
-    "eslint-config-google": "^0.9.1",
     "gulp": "^3.9.1",
     "gulp-concat": "^2.6.1",
-    "gulp-eslint": "3.0.1",
-    "gulp-if": "^2.0.2",
     "gulp-sourcemaps": "^2.6.0",
     "gulp-strip-comments": "^2.4.5",
     "gulp-uglify": "^3.0.0",
-    "gulp-webserver": "^0.9.1",
-    "http-proxy-middleware": "^0.17.4",
     "jasmine-core": "^2.6.4",
     "karma": "^1.7.0",
     "karma-babel-preprocessor": "^6.0.1",
