diff --git a/gulp_tasks/checkstyle.js b/gulp_tasks/checkstyle.js
new file mode 100644
index 0000000..bd76a8b
--- /dev/null
+++ b/gulp_tasks/checkstyle.js
@@ -0,0 +1,31 @@
+/*eslint-env node */
+/*global require: true, module: true */
+
+'use strict';
+
+var options = require('../gulp-options.js'),
+    gulp = require('gulp'),
+    clean = require('gulp-clean'),
+    eslint = require('gulp-eslint');
+
+var runSequence = require('run-sequence'),
+    fs = require('fs');
+
+gulp.task('checkstyle:clean', function () {
+    return gulp
+        .src([options.targetFolderPath + '/eslint-report-checkstyle.xml'], {'read': false})
+        .pipe(clean({'force': true}));
+});
+
+gulp.task('checkstyle:eslint', function () {
+    return gulp
+        .src([options.srcFolderPath + '/**/*.js', options.excludePath])
+        .pipe(eslint({'useEslintrc': true}))
+        .pipe(eslint.format('checkstyle', function (output) {
+            fs.writeFileSync(options.targetFolderPath + '/eslint-report-checkstyle.xml', output);
+        }));
+});
+
+module.exports = function (callback) {
+    return runSequence('checkstyle:clean', 'checkstyle:eslint', callback);
+};
diff --git a/gulp_tasks/distribution.js b/gulp_tasks/distribution.js
new file mode 100644
index 0000000..ec5aac0
--- /dev/null
+++ b/gulp_tasks/distribution.js
@@ -0,0 +1,45 @@
+/*eslint-env node */
+/*global require: true, module: true */
+
+'use strict';
+
+var options = require('../gulp-options.js'),
+    gulp = require('gulp'),
+    clean = require('gulp-clean'),
+    webapp = require('./webapp.js'),
+    imagemin = require('gulp-imagemin');
+
+var runSequence = require('run-sequence');
+
+gulp.task('webapp', function (callback) {
+    return webapp(callback);
+});
+
+gulp.task('distribution:clean', function () {
+    return gulp
+        .src([options.dirname + '/dist'], { 'read': false })
+        .pipe(clean({'force': true}));
+});
+
+gulp.task('distribution:copy', function () {
+    return gulp
+        .src(['**/*'], { 'cwd': options.targetFolderPath + '/webapp' })
+        .pipe(gulp.dest(options.dirname + '/dist'));
+});
+
+gulp.task('imagemin', () =>
+    gulp.src([options.dirname + '/app/assets/images/*'])
+        .pipe(imagemin({
+            optimizationLevel: 3,
+            progressive: true,
+            interlaced: false,
+            svgoPlugins: [{
+                removeViewBox: false
+            }]
+        }))
+        .pipe(gulp.dest('dist/assets/images'))
+);
+
+module.exports = function (callback) {
+    return runSequence('distribution:clean', 'webapp', 'distribution:copy', 'imagemin', callback);
+};
diff --git a/gulp_tasks/server.js b/gulp_tasks/server.js
new file mode 100644
index 0000000..b965786
--- /dev/null
+++ b/gulp_tasks/server.js
@@ -0,0 +1,32 @@
+var options = require('../gulp-options.js'),
+    gulp = require('gulp'),
+    connect = require('gulp-connect'),
+    distribution = require('./distribution.js');
+
+var runSequence = require('run-sequence');
+
+gulp.task('distribution', function (callback) {
+    return distribution(callback);
+});
+
+gulp.task('connect', function() {
+  connect.server({
+    root: 'dist',
+    livereload: true
+  });
+});
+
+gulp.task('livereload', function() {
+  gulp.src(['./dist/**/*.html','./dist/**/*.js','./dist/**/*.css'])
+    .pipe(connect.reload());
+});
+
+gulp.task('watch', function () {
+  gulp.watch('./app/**/*', function(callback){
+    return runSequence('distribution', 'livereload');
+  });
+});
+
+module.exports = function (callback) {
+    return runSequence('connect', 'watch', callback);
+};
\ No newline at end of file
diff --git a/gulp_tasks/webapp.js b/gulp_tasks/webapp.js
new file mode 100644
index 0000000..e514543
--- /dev/null
+++ b/gulp_tasks/webapp.js
@@ -0,0 +1,131 @@
+/*eslint-env node */
+/*global require: true, module: true */
+
+'use strict';
+
+var options = require('../gulp-options.js'),
+    gulp = require('gulp'),
+
+    // Base dependencies
+    clean = require('gulp-clean'),
+    rename = require('gulp-rename'),
+    util = require('gulp-util'),
+
+    // Angular gulp dependencies
+    ngTemplateCache = require('gulp-angular-templatecache'),
+    ngAnnotate = require('gulp-ng-annotate'),
+    ngConstant = require('gulp-ng-constant'),
+
+    // Classical gulp dependencies
+    stripDebug = require('gulp-strip-debug'),
+    uglify = require('gulp-uglify'),
+    sass = require('gulp-sass'),
+    cleanCss = require('gulp-clean-css'),
+    rev = require('gulp-rev'),
+    revReplace = require('gulp-rev-replace'),
+    gulpIf = require('gulp-if'),
+    useref = require('gulp-useref'),
+    jsoncombine = require('gulp-jsoncombine'),
+    htmlParser = require('gulp-htmlparser');
+
+
+var runSequence = require('run-sequence'),
+    es = require('event-stream');
+
+gulp.task('webapp:clean', function () {
+    return gulp
+        .src([options.targetFolderPath + '/webapp', options.dirname + '/.temp'], { 'read': false })
+        .pipe(clean({'force': true}));
+});
+
+gulp.task('webapp:sasscompile', function () {
+    return gulp
+        .src('app/styles/index.scss')
+        .pipe(sass.sync().on('error', util.log))
+        .pipe(gulp.dest(options.srcFolderPath + '/styles'))
+});
+
+// ----- To .temp from app
+gulp.task('webapp:copyjs', function () {
+    return gulp.src(options.srcFolderPath + '/**/*.js')
+        .pipe(ngAnnotate()) // Check angular dependencies injection
+        .pipe(stripDebug()) // Remove all logs
+        .pipe(uglify({ 'mangle': false }))
+        .pipe(gulp.dest(options.dirname + '/.temp'));
+});
+
+gulp.task('webapp:copyothers', function () {
+    return gulp.src(['**/*', '!**/*.js', '!**/*.css', '!**/*.scss'], { 'cwd': options.srcFolderPath }) // All except JS files
+        .pipe(gulp.dest(options.tempFolderPath));
+});
+
+gulp.task('webapp:copycss', function () {
+    return gulp
+        .src('app/styles/index.css')
+        .pipe(cleanCss())
+        .pipe(gulp.dest(options.tempFolderPath + '/styles'));
+});
+
+gulp.task('webapp:constants', function () {
+    return gulp
+        .src('environment-constants.json')
+        .pipe(ngConstant({
+            'name': 'app.constants',
+            'deps': false
+        }))
+        .pipe(rename('environment-constants.js'))
+        .pipe(gulp.dest(options.tempFolderPath + '/constants'));
+});
+
+// ----- To target/webapp from .temp and bower_components
+gulp.task('webapp:template', function () {
+    return gulp.src([options.srcFolderPath + '/**/*.html', '!' + options.srcFolderPath + '/index.html'])
+        .pipe(ngTemplateCache('templates.js', {
+            'module': 'app.templates',
+            'standalone': true
+        }))
+        .pipe(gulp.dest(options.tempFolderPath));
+});
+
+gulp.task('webapp:useref', function () {
+    var tasks = ['index.html'].map(function (indexPage) {
+        var assets = useref.assets({ });
+
+        return gulp.src(options.tempFolderPath + '/' + indexPage)
+            .pipe(assets)
+            .pipe(assets.restore())
+            .pipe(useref())
+            .pipe(revReplace()) // Force useref to apply the 'rev' method
+            .pipe(gulp.dest(options.targetFolderPath + '/webapp'));
+    });
+
+    return es.concat.apply(null, tasks);
+});
+
+gulp.task('webapp:copyresources', function () {
+    return gulp.src(['**/*.*', '!**/*.js', '!**/*.css', '!**/*.html', '!**/*.log'], { 'cwd': options.tempFolderPath })
+        .pipe(gulp.dest(options.targetFolderPath + '/webapp'));
+});
+
+module.exports = function (callback) {
+    return runSequence(
+        'webapp:clean',
+        'webapp:sasscompile',
+        [
+            'webapp:copyjs',
+            'webapp:copycss',
+            'webapp:copyothers'
+        ],
+        [
+            'webapp:constants',
+            'webapp:template'
+        ],
+        [
+            'webapp:useref'
+        ],
+        [
+            'webapp:copyresources'
+        ],
+        callback
+    );
+};
