diff --git a/xos/core/xoslib/xos-builder/.gitignore b/xos/core/xoslib/xos-builder/.gitignore
index 0d7b211..5157e54 100644
--- a/xos/core/xoslib/xos-builder/.gitignore
+++ b/xos/core/xoslib/xos-builder/.gitignore
@@ -1,2 +1,3 @@
 dist/
-src/vendor
\ No newline at end of file
+src/vendor
+.tmp
\ No newline at end of file
diff --git a/xos/core/xoslib/xos-builder/gulp/build.js b/xos/core/xoslib/xos-builder/gulp/build.js
index e9691ff..40136c8 100644
--- a/xos/core/xoslib/xos-builder/gulp/build.js
+++ b/xos/core/xoslib/xos-builder/gulp/build.js
@@ -23,11 +23,13 @@
 var TEMPLATE_HEADER = '/*This code is autogenerated from the templates files */ angular.module("<%= module %>"<%= standalone %>).run(["$templateCache", function($templateCache) {';
 
 module.exports = function(options){
-    
+  
+  // empty the dist folder
   gulp.task('clean', function(){
-    return del(['dist/**/*']);
+    return del([options.dist + '**/*']);
   });
 
+  // compile and minify scripts
   gulp.task('scripts', function() {
     return gulp.src([
         options.scripts + '**/*.js'
@@ -37,9 +39,10 @@
       .pipe(angularFilesort())
       .pipe(concat('xosContentProvider.js'))
       .pipe(uglify())
-      .pipe(gulp.dest('dist'));
+      .pipe(gulp.dest(options.dist));
   });
 
+  // set templates in cache
   gulp.task('templates', function(){
     return gulp.src("./src/templates/*.html")
       .pipe(templateCache({
@@ -50,24 +53,33 @@
       .pipe(gulp.dest(options.scripts));
   });
 
+  // copy js output to Django Folder
   gulp.task('copyJs', function(){
     return gulp.src('dist/xosContentProvider.js')
       .pipe(gulp.dest('../static/js/'))
   });
 
+  // copy vendor js output to Django Folder
   gulp.task('copyVendor', function(){
     return gulp.src('dist/xosNgVendor.js')
       .pipe(gulp.dest('../static/js/vendor/'));
   });
 
+  // minify vendor js files
   gulp.task('wiredep', function(){
     var bowerDeps = wiredep().js;
     return gulp.src(bowerDeps)
       .pipe(concat('xosNgVendor.js'))
       .pipe(uglify())
-      .pipe(gulp.dest('dist'));
+      .pipe(gulp.dest(options.dist));
   });
 
+  // TODO vendor
+  // - define a list of common components (eg: angular, angular-route, ...)
+  // - find the difference between local components e common components
+  // - minify only the local
+  // - unify wiredep, filter and copyVendor task
+
   gulp.task('build', function() {
     runSequence(
       'clean',
diff --git a/xos/core/xoslib/xos-builder/gulp/server.js b/xos/core/xoslib/xos-builder/gulp/server.js
index aeaa887..134fc62 100644
--- a/xos/core/xoslib/xos-builder/gulp/server.js
+++ b/xos/core/xoslib/xos-builder/gulp/server.js
@@ -3,19 +3,43 @@
 var gulp = require('gulp');
 var browserSync = require('browser-sync').create();
 var inject = require('gulp-inject');
+var runSequence = require('run-sequence');
+var angularFilesort = require('gulp-angular-filesort');
+var babel = require('gulp-babel');
 
 module.exports = function(options){
   gulp.task('browser', function() {
     browserSync.init({
       server: {
-          baseDir: "./src"
+          baseDir: options.src
       }
     });
   });
 
-  gulp.task('inject', function(){
-    return gulp.src('./src/index.html')
-      .pipe(inject(gulp.src('./src/js/**/*.js', {read: false})))
+  gulp.task('babel', function(){
+    return gulp.src(options.scripts + '**/*.js')
+      .pipe(babel({sourceMaps: true}))
+      .pipe(gulp.dest(options.tmp));
+  });
+
+  gulp.task('inject', ['babel'],function(){
+    return gulp.src(options.src + 'index.html')
+      .pipe(
+        inject(
+          gulp.src(options.tmp + '**/*.js')
+          .pipe(angularFilesort()),
+          {
+            ignorePath: options.src
+          }
+        )
+      )
       .pipe(gulp.dest('./src'));
   });
+
+  gulp.task('serve', function() {
+    runSequence(
+      'inject',
+      'browser'
+    );
+  });
 }
\ No newline at end of file
diff --git a/xos/core/xoslib/xos-builder/gulpfile.js b/xos/core/xoslib/xos-builder/gulpfile.js
index 85d20ee..df133b1 100644
--- a/xos/core/xoslib/xos-builder/gulpfile.js
+++ b/xos/core/xoslib/xos-builder/gulpfile.js
@@ -4,13 +4,14 @@
 var wrench = require('wrench');
 
 var options = {
+  src: 'src/',
   scripts: 'src/js/',
+  tmp: 'src/.tmp',
   dist: 'dist/'
 };
 
 wrench.readdirSyncRecursive('./gulp')
 .map(function(file) {
-  console.log(file);
   require('./gulp/' + file)(options);
 });
 
diff --git a/xos/core/xoslib/xos-builder/src/index.html b/xos/core/xoslib/xos-builder/src/index.html
index 887ed04..800ee7e 100644
--- a/xos/core/xoslib/xos-builder/src/index.html
+++ b/xos/core/xoslib/xos-builder/src/index.html
@@ -3,4 +3,6 @@
 </div>
 
 <!-- inject:js -->
+<script src="/.tmp/xosContentProvider.js"></script>
+<script src="/.tmp/templates.js"></script>
 <!-- endinject -->
