diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..37badcac6f61764acd079cd5ce173b2cf48e01b4
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,15 @@
+client
+vas
+conf/closure
+conf/properties.json
+src/vitis/vas/log/
+src/vitis/vas/public/
+src/vitis/vas/server/
+src/vitis/vas/ws_data/
+src/vitis/vas/tmp/
+src/vitis/client/modules/
+! src/vitis/client/modules/vitis/
+src/vitis/vas/rest/ws/*
+! src/vitis/vas/rest/ws/vitis/
+src/vitis/vas/sql/*
+! src/vitis/vas/sql/sqlQueries.xml
diff --git a/README.md b/README.md
index 86577064ea078e83dc9b6c75d582d57a178b66d6..94f05888fa860b6399ea6045cc6b8a0ca402eb43 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,9 @@
 # GTF
 
-Application GTF
\ No newline at end of file
+## Install dev version (linux)
+
+To install the dev version of this project run the following steps:
+
+- Clone the repo on your local storage
+- Run install.sh to build your tree structure
+- Run `git pull` and `git push` to update/post the project and his dependencies
diff --git a/conf/Gruntfile.js b/conf/Gruntfile.js
new file mode 100755
index 0000000000000000000000000000000000000000..95716ae2485614a779893df11b2b4b12bd9d1da4
--- /dev/null
+++ b/conf/Gruntfile.js
@@ -0,0 +1,144 @@
+module.exports = function (grunt) {
+
+    var compilerPackage = require('google-closure-compiler');
+    compilerPackage.grunt(grunt);
+
+    var sHome = '../';
+    var sClosureDepsHome = '../../../../../';
+
+    // Project configuration. 
+    grunt.initConfig({
+        'closure-compiler': {
+            GTF: {
+                files: {
+                    '../javascript/gtf.min.js': [
+                        // Fichiers Vitis
+                        sHome + 'javascript/require/*.js',
+                        sHome + 'javascript/app/**/*.js',
+                        sHome + 'javascript/externs/formReader/**/*.js',
+                        sHome + 'javascript/externs/mapJSON/**/*.js',
+                        sHome + 'modules/vitis/javascript/**/*.js',
+                        // OpenLayers
+                        sHome + 'javascript/externs/openLayers/**/*.js',
+                        // Fichiers GTF
+                        sHome + 'conf/requires/*.js',
+                        sHome + 'modules/gtf/javascript/**/*.js',
+                        // Fichiers Studio
+                        sHome + 'javascript/externs/studio/properties/properties.js',
+                        sHome + 'javascript/externs/studio/javascript/app/**/*.js'
+                    ]
+                },
+                options: {
+                    js: [
+                        'node_modules/google-closure-library/closure/goog/**.js',
+                        '!node_modules/google-closure-library/closure/goog/**_test.js'
+                    ],
+                    externs: [
+                        'closure/externs/angular-1.3.js',
+                        'closure/externs/bingmaps.js',
+                        'closure/externs/jquery-1.9.js',
+                        'closure/externs/bootstrap.js',
+                        'closure/externs/geojson.js',
+                        'closure/externs/jspdf.js',
+                        'closure/externs/html2canvas.js',
+                        'closure/externs/vmap.js'
+                    ],
+                    compilation_level: 'ADVANCED',
+                    manage_closure_dependencies: true,
+                    generate_exports: true,
+                    angular_pass: true,
+                    debug: false,
+                    language_in: 'ECMASCRIPT5',
+                    language_out: 'ECMASCRIPT5',
+                    closure_entry_point: ['vitis.gtf', 'vitis', 'oVFB'],
+                    create_source_map: '../javascript/gtf.min.js.map',
+                    output_wrapper: '(function(){\n%output%\n}).call(this)\n//# sourceMappingURL=../javascript/gtf.min.js.map'
+                }
+            },
+            widget: {
+                files: {
+                    '../javascript/widget.min.js': [
+                        // Fichiers Vitis
+                        sHome + 'modules/gtf/javascript/widget/deps.js',
+                        sHome + 'javascript/app/app.js',
+                        sHome + 'javascript/app/loadExternalFiles.js',
+                        //sHome + 'javascript/app/*.js',
+                        sHome + 'javascript/app/services/*.js',
+                        sHome + 'javascript/app/controllers/htmlFormCtrl.js',
+                        sHome + 'javascript/app/directives/htmlFormDrtv.js',
+                        //sHome + 'javascript/externs/formReader/*.js',
+                        //sHome + 'modules/vitis/javascript/**/*.js',
+                        sHome + 'javascript/externs/formReader/**/*.js',
+                        sHome + 'javascript/externs/mapJSON/**/*.js',
+                        // OpenLayers
+                        sHome + 'javascript/externs/openLayers/**/*.js',
+                        // Fichiers Widget
+                        sHome + 'modules/gtf/javascript/widget/widgetMod.js',
+                        sHome + 'modules/gtf/javascript/widget/script_widget.js'
+                    ]
+                },
+                options: {
+                    js: [
+                        'node_modules/google-closure-library/closure/goog/**.js',
+                        '!node_modules/google-closure-library/closure/goog/**_test.js'
+                    ],
+                    externs: [
+                        'closure/externs/angular-1.3.js',
+                        'closure/externs/bingmaps.js',
+                        'closure/externs/jquery-1.9.js',
+                        'closure/externs/bootstrap.js',
+                        'closure/externs/geojson.js',
+                        'closure/externs/jspdf.js',
+                        'closure/externs/html2canvas.js',
+                        'closure/externs/vmap.js'
+                    ],
+                    compilation_level: 'ADVANCED',
+                    manage_closure_dependencies: true,
+                    generate_exports: true,
+                    angular_pass: true,
+                    debug: false,
+                    language_in: 'ECMASCRIPT5',
+                    language_out: 'ECMASCRIPT5',
+                    closure_entry_point: ['vitis.gtf.widget', 'vitis'],
+                    create_source_map: '../javascript/widget.min.js.map',
+                    output_wrapper: '(function(){\n%output%\n}).call(this)\n//# sourceMappingURL=../javascript/widget.min.js.map'
+                }
+            }
+        },
+        'closureDepsWriter': {
+            options: {
+                depswriter: 'closure/depswriter/depswriter.py',
+                root_with_prefix: [
+                    // Fichiers Vitis
+                    '"' + sHome + 'javascript/app ' + sClosureDepsHome + 'javascript/app"',
+                    '"' + sHome + 'modules/vitis/javascript ' + sClosureDepsHome + 'modules/vitis/javascript"',
+                    '"' + sHome + 'javascript/externs/formReader ' + sClosureDepsHome + 'javascript/externs/formReader"',
+                    '"' + sHome + 'conf/requires ' + sClosureDepsHome + 'conf/requires"',
+                    '"' + sHome + 'javascript/externs/mapJSON ' + sClosureDepsHome + 'javascript/externs/mapJSON"',                    
+                    // Fichiers gtf
+                    '"' + sHome + 'modules/gtf/javascript ' + sClosureDepsHome + 'modules/gtf/javascript"',
+                    // OpenLayers
+                    '"' + sHome + 'javascript/externs/openLayers ' + sClosureDepsHome + 'javascript/externs/openLayers"',
+                    // Fichiers Studio
+                    '"' + sHome + 'javascript/externs/studio/properties ' + sClosureDepsHome + 'javascript/externs/studio/properties"',
+                    '"' + sHome + 'javascript/externs/studio/javascript/app ' + sClosureDepsHome + 'javascript/externs/studio/javascript/app"',
+                    // Closure library
+                    '"' + sHome + 'conf/node_modules/google-closure-library/closure/goog ' + sClosureDepsHome + 'conf/node_modules/google-closure-library/closure/goog"'
+                ]
+            },
+            targetName: {
+                dest: '../javascript/gtf.deps.js'
+            }
+        }
+    });
+
+    grunt.loadNpmTasks('grunt-closure-tools');
+
+    // Tache par défaut 
+    // cmd: grunt
+    grunt.registerTask('default', ['closureDepsWriter', 'closure-compiler:GTF', 'closure-compiler:widget']);
+    // cmd: grunt generate-deps
+    grunt.registerTask('generate-deps', ['closureDepsWriter']);
+    // cmd: grunt compile
+    grunt.registerTask('compile', ['closure-compiler:GTF', 'closure-compiler:widget']);
+};
\ No newline at end of file
diff --git a/conf/_install/apache.conf b/conf/_install/apache.conf
new file mode 100755
index 0000000000000000000000000000000000000000..35d1cb25404651f4cc9556423314ef648ed98135
--- /dev/null
+++ b/conf/_install/apache.conf
@@ -0,0 +1,6 @@
+Alias /gtf[ENV] "[APPDIRECTORY]"
+	<Directory "[APPDIRECTORY]">
+		AllowOverride FileInfo
+		Options FollowSymLinks
+		Require all granted
+	</Directory>
\ No newline at end of file
diff --git a/conf/_install/dependency.xml b/conf/_install/dependency.xml
new file mode 100755
index 0000000000000000000000000000000000000000..681b76e2ba4bd036824d25667aa21801fbb58496
--- /dev/null
+++ b/conf/_install/dependency.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Application -->
+<installer>
+	<dependenciesCollection>
+		<dependency>
+			<nature>modules</nature>
+			<name>gtf</name>
+			<version>2018.01.00</version>
+		</dependency>
+	</dependenciesCollection>
+</installer>
\ No newline at end of file
diff --git a/conf/_install/fileToDelete.txt b/conf/_install/fileToDelete.txt
new file mode 100755
index 0000000000000000000000000000000000000000..5b05a50a454c651556fd9d44df2c88b53b1caf05
--- /dev/null
+++ b/conf/_install/fileToDelete.txt
@@ -0,0 +1,2 @@
+package.json
+Gruntfile.js
\ No newline at end of file
diff --git a/conf/_install/folderToDelete.txt b/conf/_install/folderToDelete.txt
new file mode 100755
index 0000000000000000000000000000000000000000..3ff9591f1c764874b1d17e92491d955cff82fb9f
--- /dev/null
+++ b/conf/_install/folderToDelete.txt
@@ -0,0 +1 @@
+requires
\ No newline at end of file
diff --git a/conf/credits.json b/conf/credits.json
new file mode 100755
index 0000000000000000000000000000000000000000..a817926a959caa2cabc8bfb312355c506734622c
--- /dev/null
+++ b/conf/credits.json
@@ -0,0 +1,150 @@
+[
+    {
+        "label": "CREDITS_SOFTWARE",
+        "rows": [
+            {
+                "type": "text",
+                "value": "GTF"
+            }
+        ]
+    },
+    {
+        "label": "CREDITS_VERSION",
+        "rows": [
+            {
+                "type": "text",
+                "value": "CREDITS_VERSION_CONTENT"
+            }
+        ]
+    },
+    {
+        "label": "CREDITS_DATE",
+        "rows": [
+            {
+                "type": "text",
+                "value": "CREDITS_DATE_CONTENT"
+            }
+        ]
+    },
+    {
+        "label": "CREDITS_EDITOR",
+        "rows": [
+            {
+                "type": "link",
+                "value": "Veremes",
+                "url": "http://www.veremes.com"
+            }
+        ]
+    },
+    {
+        "label": "CREDITS_AUTHOR",
+        "rows": [
+            {
+                "type": "text",
+                "value": "Armand Bahi"
+            },
+            {
+                "type": "text",
+                "value": "Alexandre Bizien"
+            },
+            {
+                "type": "text",
+                "value": "Anthony Borghi"
+            },
+            {
+                "type": "text",
+                "value": "Frédéric Carretero"
+            },
+            {
+                "type": "text",
+                "value": "Marguerite Espada"
+            },
+            {
+                "type": "text",
+                "value": "Olivier Gayte"
+            },
+            {
+                "type": "text",
+                "value": "Sébastien Legrand"
+            },
+            {
+                "type": "text",
+                "value": "Yoann Perollet"
+            }
+        ]
+    },
+    {
+        "label": "CREDITS_GRAPHICS",
+        "rows": [
+            {
+                "type": "link",
+                "value": "Nematis",
+                "url": "http://www.nematis.com"
+            }
+        ]
+    },
+    {
+        "label": "CREDITS_LIBRARIES",
+        "rows": [
+            {
+                "type": "link",
+                "value": "Bootstrap",
+                "url": "http://getbootstrap.com"
+            },
+            {
+                "type": "link",
+                "value": "AngularJS",
+                "url": "https://angularjs.org"
+            },
+            {
+                "type": "link",
+                "value": "Google Closure",
+                "url": "https://developers.google.com/closure"
+            },
+            {
+                "type": "link",
+                "value": "jQuery",
+                "url": "http://jquery.com"
+            },
+            {
+                "type": "link",
+                "value": "Rgraph",
+                "url": "http://www.rgraph.net"
+            },
+            {
+                "type": "link",
+                "value": "CodeMirror",
+                "url": "http://codemirror.net"
+            },
+            {
+                "type": "link",
+                "value": "TinyMCE",
+                "url": "https://www.tinymce.com"
+            }
+        ]
+    },
+    {
+        "label": "CREDITS_CONTACT",
+        "rows": [
+            {
+                "type": "link",
+                "value": "www.veremes.com",
+                "url": "http://www.veremes.com"
+            },
+            {
+                "type": "link",
+                "value": "www.veremes.com/nous-contacter#1",
+                "url": "http://www.veremes.com/nous-contacter#1"
+            }
+        ]
+    },
+    {
+        "label": "CREDITS_LICENSE",
+        "rows": [
+            {
+                "type": "text",
+                "value": "© Veremes"
+            }
+        ]
+    }
+]
diff --git a/conf/less/variables.less b/conf/less/variables.less
new file mode 100755
index 0000000000000000000000000000000000000000..c19f042d9b30e0fa2d435566246e46c214b3b734
--- /dev/null
+++ b/conf/less/variables.less
@@ -0,0 +1,35 @@
+
+// user colors
+@user-color-theme-1: #23282D;
+@user-color-theme-2: #6F8456;
+
+
+// Veremes colors
+@veremes-gtf-color: #39468A;
+@veremes-majic-color: #CF461F;
+@veremes-qualigeo-color: #832C7A;
+@veremes-wab-color: #198D9F;
+/*@veremes-vmap-color: #CB0650;*/
+@veremes-vmap-color: #198D9F;
+
+@veremes-map-backgroud-color: #020237;
+@veremes-gray-backgroud-color: #3A3A3A;
+@veremes-light-gray-backgroud-color: #9A9A9A;
+
+
+// Application colors
+@application-color-theme: @veremes-gtf-color; // <- Change this color
+
+@application-lighen-color-theme: lighten(@application-color-theme, 20%);
+@application-darken-color-theme: darken(@application-color-theme, 10%);
+
+@application-action-1-color: #337ab7; // blue bootstrap
+@application-action-2-color: #5cb85c; // green bootstrap
+
+// Other variables
+@ui-grid-bg-image: "../images/ui-grid/wbg.gif";
+@font-color-purple: #020237;
+
+// Dimension des vignettes dans les listes.
+@ui-grid-thumbnail-width: 100px;
+@ui-grid-thumbnail-heigth: 60px;
\ No newline at end of file
diff --git a/conf/package.json b/conf/package.json
new file mode 100755
index 0000000000000000000000000000000000000000..5b5091d40728e547f4c50369734cf88ed10edef1
--- /dev/null
+++ b/conf/package.json
@@ -0,0 +1,4 @@
+{
+  "name": "Vitis",
+  "version": "0.1.0"
+}
diff --git a/conf/requires/config.js b/conf/requires/config.js
new file mode 100755
index 0000000000000000000000000000000000000000..080178f2943fca9ced75a7aa115a711f8528d91f
--- /dev/null
+++ b/conf/requires/config.js
@@ -0,0 +1,64 @@
+'use strict';
+
+goog.provide('vitis.application.config');
+goog.require('oVFB');
+
+// Fichiers js et css à charger pour l'application Gtf.
+var oApplicationFiles = {
+    'css': [
+        // Vitis
+        'css/lib/bootstrap/css/bootstrap.min.css',
+        'css/lib/jquery/plugins/bootstrap-datepicker/bootstrap-datepicker3.min.css',
+        'css/lib/jquery/plugins/bootstrap-fileinput/css/fileinput.min.css',
+        'css/lib/ui-grid/ui-grid.min.css',
+        'css/lib/jquery/plugins/bootstrap-colorpicker/css/bootstrap-colorpicker.min.css',
+        'css/lib/bootstrap-checkbox/build.css',
+        'css/lib/bootstrap-checkbox/font-awesome.css',
+        'css/lib/jquery/plugins/bootstrap-slider/bootstrap-slider.min.css',
+        'css/lib/jquery/plugins/malihu-custom-scrollbar/jquery.mCustomScrollbar.min.css',
+        'css/lib/ui-grid/plugins/draggable-rows.less',
+        'less/main.less',
+        // App
+        'css/lib/openlayers/ol.css',
+        'javascript/externs/studio/less/studio.less',
+        'modules/vitis/less/main.less',
+        'modules/gtf/less/main.less',
+        'css/lib/codemirror/codemirror.css',
+        'css/lib/codemirror/codemirror_foldgutter.css',
+        'javascript/externs/studio/less/CodeMirror.less',
+        'css/lib/jquery/plugins/bootstrap-treeview/bootstrap-treeview.min.css',
+        'css/lib/jquery/plugins/bootstrap-tagsinput/bootstrap-tagsinput.css',
+        'css/lib/jquery/plugins/bootstrap-colorpicker/css/bootstrap-colorpicker.min.css'
+    ],
+    'js': {
+        'externs': [
+            'javascript/externs/bootbox/bootbox.min.js',
+            'javascript/externs/codemirror/codemirror.min.js',
+            'javascript/externs/codemirror/htmlmixed.js',
+            'javascript/externs/codemirror/css.js',
+            'javascript/externs/codemirror/javascript.js',
+            'javascript/externs/codemirror/clike.js',
+            'javascript/externs/codemirror/php.js',
+            'javascript/externs/codemirror/xml.js',
+            'javascript/externs/codemirror/addon/fold/foldcode.js',
+            'javascript/externs/codemirror/addon/fold/foldgutter.js',
+            'javascript/externs/codemirror/addon/fold/brace-fold.js',
+            'javascript/externs/codemirror/addon/fold/xml-fold.js',
+            'javascript/externs/angular/modules/ui-codemirror/ui-codemirror.min.js',
+            'javascript/externs/tinymce/tinymce.min.js',
+            'javascript/externs/angular/modules/ui-tinymce/tinymce.js',
+            'javascript/externs/jquery/plugins/bootstrap-treeview/bootstrap-treeview.js',
+            'javascript/externs/jquery/plugins/bootstrap-tagsinput/bootstrap-tagsinput.min.js',
+            'javascript/externs/scripts_cryptage.js',
+            'javascript/externs/moment/moment.min.js',
+            'javascript/externs/moment/min/moment-with-locales.min.js',
+            'javascript/externs/jquery/plugins/notify/notify.js',
+            'javascript/externs/jquery/plugins/bootstrap-colorpicker/bootstrap-colorpicker.min.js',
+            'javascript/externs/jquery/plugins/bootstrap-confirmation/bootstrap-confirmation.min.js',
+            'javascript/externs/jquery/plugins/bootstrap-datetimepicker/bootstrap-datetimepicker.min.js',
+            'javascript/externs/alasql/alasql.min.js',
+            'javascript/externs/alasql/xlsx.core.min.js'
+        ]
+    },
+    'vitisModuleDependencies': ['ui.codemirror', 'ui.tinymce', 'vfb', 'ui.grid.draggable-rows']
+};
\ No newline at end of file
diff --git a/conf/requires/requiresApp.js b/conf/requires/requiresApp.js
new file mode 100755
index 0000000000000000000000000000000000000000..326072fabf92eb37353f3605b913529400c58e33
--- /dev/null
+++ b/conf/requires/requiresApp.js
@@ -0,0 +1,13 @@
+/* global goog */
+
+/**
+ * Ce fichier permet de charger les fichiers de l'applicaiton
+ * de façon non compilée
+ * @author: Armand Bahi
+ */
+
+goog.provide('vitis.application.requires');
+goog.require('vitis.application.config');
+
+goog.require('vitis.gtf');
+goog.require('vitis.gtf.script_module');
diff --git a/install.sh b/install.sh
new file mode 100755
index 0000000000000000000000000000000000000000..b5ceb92ab36c08371f45820bd7101ca44e16108d
--- /dev/null
+++ b/install.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+#
+#
+# 	Script d'initialisation d'un dépot vMap versionné sous git
+#	Initislise l'ensemble des dépendances sous forme de subtrees
+#   Crée des symlinks pour re-créer l'arborescence de l'application
+#
+#
+
+if [ `whoami` == "root" ]; then
+    echo "Please, do not run this script as sudo"
+else
+    cd utils/
+    ./init_symlinks.sh
+    ./pull_subtrees.sh
+    ./copy_hooks.sh
+fi
diff --git a/utils/copy_hooks.sh b/utils/copy_hooks.sh
new file mode 100755
index 0000000000000000000000000000000000000000..f5bed2f2552ef3440e7e9589197c0922a1875927
--- /dev/null
+++ b/utils/copy_hooks.sh
@@ -0,0 +1,14 @@
+#!/bin/bash
+#
+#
+# 	Script de mise à jour des hooks client
+#
+#
+#
+
+
+if [ -d "githooks" ]; then
+	if [ -d "../.git/hooks" ]; then
+	    cp -f githooks/* ../.git/hooks/
+	fi
+fi
diff --git a/utils/get_deps.sh b/utils/get_deps.sh
new file mode 100755
index 0000000000000000000000000000000000000000..92b0273980ef5ae8db6eea7268fd3a5c406243b9
--- /dev/null
+++ b/utils/get_deps.sh
@@ -0,0 +1,48 @@
+#!/bin/bash
+#
+#	Récupère l'ensemble des dépendances depuis conf/_install/dependency.xml
+#	Nécessite xmllint : sudo apt install libxml2-utils
+#
+#
+#
+#
+
+
+if [ "../conf/_install/dependency.xml" ]; then
+
+	let depsCount=$(xmllint --xpath 'count(//dependenciesCollection/dependency/name)' ../conf/_install/dependency.xml)
+	declare -A aDeps
+	vitisVersion=master
+
+	for (( i=1; i <= $depsCount; i++ )); do
+
+		sName="$(xmllint --xpath 'string(//dependenciesCollection/dependency['$i']/name)' ../conf/_install/dependency.xml)"
+		sVersion="$(xmllint --xpath 'string(//dependenciesCollection/dependency['$i']/version)' ../conf/_install/dependency.xml)"
+		sNature="$(xmllint --xpath 'string(//dependenciesCollection/dependency['$i']/nature)' ../conf/_install/dependency.xml)"
+
+		if [ $sName == "vitis" ]; then
+			vitisVersion=$sVersion
+		fi
+		if [ $sNature == "modules" ] || [ $sNature == "web_services" ] || [ $sName == "vitis" ]; then
+			aDeps[$i, name]=$sName
+			aDeps[$i, version]=$sVersion
+			aDeps[$i, nature]=$sNature
+		fi
+
+	done
+
+	echo "[INFO] dependencies:"
+	echo "vitis : $vitisVersion"
+	for (( i=1; i <= $depsCount; i++ )); do
+
+		echo "name: ${aDeps[$i, name]}"
+		echo "version: ${aDeps[$i, version]}"
+
+	done
+
+	export vitisVersion
+	export depsCount
+	export aDeps
+else
+	echo "[ERROR] ../conf/_install/dependency.xml not found"
+fi
diff --git a/utils/githooks/post-merge b/utils/githooks/post-merge
new file mode 100755
index 0000000000000000000000000000000000000000..548e6ae56f6a55c2d1acab88308e336c06e71616
--- /dev/null
+++ b/utils/githooks/post-merge
@@ -0,0 +1,18 @@
+#!/bin/sh
+#
+#   Hook qui permet de pull toutes les dépendances
+#   quand on fait un pull sur l'application
+#
+#
+#
+#
+#
+
+echo "****** Post-merge Hook ******"
+echo "****** Pull subtrees ******"
+echo "$(pwd)"
+
+if [ -d "$(pwd)/utils" ]; then
+    cd utils
+    ./pull_subtrees.sh
+fi
diff --git a/utils/githooks/pre-push b/utils/githooks/pre-push
new file mode 100755
index 0000000000000000000000000000000000000000..50401f9e2df8033763628124e1445afe66e9bad5
--- /dev/null
+++ b/utils/githooks/pre-push
@@ -0,0 +1,21 @@
+#!/bin/sh
+#
+#   Hook qui permet de push toutes les dépendances
+#   quand on fait un push sur l'application
+#
+#
+#
+#
+#
+
+remote="$1"
+url="$2"
+if [ $remote != $url ]; then
+
+    echo "****** Pre-push Hook ******"
+    echo "****** Push subtrees ******"
+    if [ -d "$(pwd)/utils" ]; then
+        cd utils
+        ./push_subtrees.sh
+    fi
+fi
diff --git a/utils/init_subtrees.sh b/utils/init_subtrees.sh
new file mode 100755
index 0000000000000000000000000000000000000000..7f9c2abf14978552d1ae88ca6b9b119d51c71578
--- /dev/null
+++ b/utils/init_subtrees.sh
@@ -0,0 +1,48 @@
+#!/bin/bash
+#
+#
+# 	Script d'initialisation d'un dépot vMap versionné sous git
+#	Initislise l'ensemble des dépendances sous forme de subtrees
+#
+#	Nécessite xmllint : sudo apt install libxml2-utils
+#
+
+
+APP_NAME="vmap"
+
+# Récupère la liste des dépendances
+. ./get_deps.sh
+
+cd ..
+if [ -d "$(pwd)/client" ]; then
+	rm client
+fi
+if [ -d "$(pwd)/vas" ]; then
+	rm vas
+fi
+if [ -d "$(pwd)/src" ]; then
+	git rm -r src
+	git commit -a -m "Reset sources"
+fi
+mkdir src
+
+if [[ $depsCount > 0 ]]; then
+
+	# Vitis
+	echo "---- Init vitis ----"
+	git subtree add --squash -m "add subtree" --prefix src/vitis "git@gitlab.veremes.net:Development/vitis_apps/sources/vitis.git" $vitisVersion
+
+	echo "---- Init conf ----"
+	git subtree add --squash -m "add subtree" --prefix src/closure "git@gitlab.veremes.net:Development/vitis_apps/sources/closure.git" master
+
+	# Modules
+	for (( i=1; i <= $depsCount; i++ )); do
+		if [ ${aDeps[$i, nature]} == "modules" ]; then
+			echo "---- Init ${aDeps[$i, name]} : ${aDeps[$i, version]}----"
+
+		    # Ajoute le dépôt
+			git subtree add --squash -m "add subtree" --prefix src/${aDeps[$i, name]} "git@gitlab.veremes.net:Development/vitis_apps/sources/${aDeps[$i, name]}.git" ${aDeps[$i, version]}
+		fi
+	done
+
+fi
diff --git a/utils/init_symlinks.sh b/utils/init_symlinks.sh
new file mode 100755
index 0000000000000000000000000000000000000000..11be3da0b1d9b0ff5260d10a621fbe4f2e9992dc
--- /dev/null
+++ b/utils/init_symlinks.sh
@@ -0,0 +1,128 @@
+#!/bin/bash
+#
+#
+# 	Script d'initialisation d'un dépot vMap versionné sous git
+#
+#   Split repo
+#   git subtree split -P module/ -b module_split_branch
+#
+#   Add subtree
+#   git subtree add --prefix vmap "git@gitlab.veremes.net:Development/vitis_apps/sources/Vitis.git" master
+#
+#
+
+echo -n "Existing app path (path/empty)? "
+read APP_EXISTING_PATH
+
+# Récupère la liste des dépendances
+. ./get_deps.sh
+
+cd ..
+
+# Vitis
+echo "---- Link vitis ----"
+if ! [ -e "$(pwd)/client" ]; then
+	echo "---- Link vitis 2 ----"
+	ln -rsf src/vitis/client client
+fi
+if ! [ -e "$(pwd)/vas" ]; then
+	ln -rsf src/vitis/vas vas
+fi
+
+# Conf
+echo "---- Link conf ----"
+if ! [ -e "src/vitis/client/conf" ]; then
+	ln -rsf conf src/vitis/client/conf
+fi
+if ! [ -e "conf/closure" ]; then
+	ln -rsf src/closure/conf conf/closure
+fi
+
+# Modules
+if [[ $depsCount > 0 ]]; then
+	for (( i=1; i <= $depsCount; i++ )); do
+		if [ ${aDeps[$i, nature]} == "modules" ]; then
+			if [ ${aDeps[$i, name]:0:7} == "module_" ]; then
+				module=${aDeps[$i, name]:7}
+				echo "---- Link module_${module} ----"
+				if [ -d "$(pwd)/src/module_${module}/module" ]; then
+					if ! [ -e "src/vitis/client/modules/${module}" ]; then
+						ln -rsf src/module_${module}/module src/vitis/client/modules/${module}
+					fi
+				fi
+				if [ -d "$(pwd)/src/module_${module}/web_service/ws" ]; then
+					if ! [ -e "src/vitis/vas/rest/ws/${module}" ]; then
+						ln -rsf src/module_${module}/web_service/ws src/vitis/vas/rest/ws/${module}
+					fi
+				fi
+				if [ -d "$(pwd)/src/module_${module}/web_service/conf" ]; then
+					if ! [ -e "src/vitis/vas/rest/conf/${module}" ]; then
+						ln -rsf src/module_${module}/web_service/conf src/vitis/vas/rest/conf/${module}
+					fi
+				fi
+				if [ -d "$(pwd)/src/module_${module}/web_service/sql" ]; then
+					if ! [ -e "src/vitis/vas/sql/${module}" ]; then
+						ln -rsf src/module_${module}/web_service/sql src/vitis/vas/sql/${module}
+					fi
+				fi
+				if [ -d "$(pwd)/src/module_${module}/web_service/class" ]; then
+					for class_dir in $( ls "$(pwd)/src/module_${module}/web_service/class"); do
+						if [ -d "$(pwd)/src/module_${module}/web_service/class/${class_dir}" ]; then
+							echo "---- Link module_${module}/${class_dir} ----"
+							if ! [ -e "src/vitis/vas/rest/class/${class_dir}" ]; then
+								ln -rsf src/module_${module}/web_service/class/${class_dir} src/vitis/vas/rest/class/${class_dir}
+							fi
+						fi
+					done
+				fi
+			fi
+		fi
+	done
+
+	# Utilisation d'une install déjà existante
+	if [ -d "${APP_EXISTING_PATH}" ]; then
+		echo "---- Link exixting app ${APP_EXISTING_PATH} ----"
+
+		declare -a existing_folders_path=("vas/server"
+		                "vas/log"
+						"vas/public"
+						"vas/shared"
+						"vas/tmp"
+						"vas/upload"
+		                "vas/ws_data")
+		for folder_path in "${existing_folders_path[@]}"; do
+			if [ -d "${APP_EXISTING_PATH}/$folder_path" ]; then
+				echo "copy $folder_path"
+				cp -Rf "${APP_EXISTING_PATH}/$folder_path" "$(pwd)/$folder_path"
+			fi
+		done
+
+		declare -a existing_files_path=("client/conf/properties.json"
+										"vas/rest/conf/properties.inc"
+										"vas/rest/conf/properties_domain.inc"
+										"vas/rest/conf/properties_post.inc"
+										"vas/rest/conf/properties_server.inc"
+										"vas/rest/conf/version.inc"
+										"vas/rest/.htaccess")
+		for file_path in "${existing_files_path[@]}"; do
+			if [ -f "${APP_EXISTING_PATH}/$file_path" ]; then
+				echo "copy $file_path"
+				cp -f "${APP_EXISTING_PATH}/$file_path" "$(pwd)/$file_path"
+			fi
+		done
+
+		for properties_dir in $( ls "${APP_EXISTING_PATH}/vas/rest/conf"); do
+			if [ -d "${APP_EXISTING_PATH}/vas/rest/conf/${properties_dir}" ]; then
+				if [ -d "$(pwd)/vas/rest/conf/${properties_dir}" ]; then
+					for properties_file in $( ls "${APP_EXISTING_PATH}/vas/rest/conf/${properties_dir}"); do
+						# if [ ${properties_file:0:10}=="properties"  ||  ${properties_file}=="version.inc" ]; then
+						if [[ $properties_file == "properties"* ]] || [[ $properties_file == "version.inc" ]]; then
+							echo "copy vas/rest/conf/${properties_dir}/${properties_file}"
+							cp -f "${APP_EXISTING_PATH}/vas/rest/conf/${properties_dir}/${properties_file}" "$(pwd)/vas/rest/conf/${properties_dir}/${properties_file}"
+						fi
+					done
+				fi
+			fi
+		done
+	fi
+fi
diff --git a/utils/pull_subtrees.sh b/utils/pull_subtrees.sh
new file mode 100755
index 0000000000000000000000000000000000000000..f8ba5fc59f9144fa65801add6c1625c77e45371f
--- /dev/null
+++ b/utils/pull_subtrees.sh
@@ -0,0 +1,45 @@
+#!/bin/bash
+#
+#
+# 	Script d'initialisation d'un dépot vMap versionné sous git
+#	Initislise l'ensemble des dépendances sous forme de subtrees
+#
+#
+#
+
+
+APP_NAME="vmap"
+
+# Récupère la liste des dépendances
+. ./get_deps.sh
+
+cd ..
+
+# Vitis
+echo "---- Pull vitis ----"
+git subtree pull --prefix src/vitis --squash -m "pull subtree"  "git@gitlab.veremes.net:Development/vitis_apps/sources/vitis.git" master
+
+# fichiers à ignorer
+git update-index --assume-unchanged conf/properties.json
+git update-index --assume-unchanged src/vitis/vas/rest/.htaccess
+git update-index --assume-unchanged src/vitis/vas/rest/conf/properties.inc
+git update-index --assume-unchanged src/vitis/vas/rest/conf/properties_domain.inc
+git update-index --assume-unchanged src/vitis/vas/rest/conf/properties_post.inc
+git update-index --assume-unchanged src/vitis/vas/rest/conf/properties_server.inc
+git update-index --assume-unchanged src/vitis/vas/rest/conf/version.inc
+
+# Modules
+if [[ $depsCount > 0 ]]; then
+	for (( i=1; i <= $depsCount; i++ )); do
+		if [ ${aDeps[$i, nature]} == "modules" ]; then
+			echo "---- Pull ${aDeps[$i, name]} ----"
+
+			# Ajoute le dépôt
+			git subtree pull --prefix src/${aDeps[$i, name]} --squash -m "pull subtree" "git@gitlab.veremes.net:Development/vitis_apps/sources/${aDeps[$i, name]}.git" master
+			# fichiers à ignorer
+			git update-index --assume-unchanged src/${aDeps[$i, name]}/web_service/conf/properties.inc
+			git update-index --assume-unchanged src/${aDeps[$i, name]}/web_service/conf/properties_server.inc
+			git update-index --assume-unchanged src/${aDeps[$i, name]}/web_service/conf/version.inc
+		fi
+	done
+fi
diff --git a/utils/push_subtrees.sh b/utils/push_subtrees.sh
new file mode 100755
index 0000000000000000000000000000000000000000..fb430d5f9da57f08c7c52810b31bbfe400b18eae
--- /dev/null
+++ b/utils/push_subtrees.sh
@@ -0,0 +1,32 @@
+#!/bin/bash
+#
+#
+# 	Script d'initialisation d'un dépot vMap versionné sous git
+#	Initislise l'ensemble des dépendances sous forme de subtrees
+#
+#
+#
+
+
+APP_NAME="vmap"
+
+# Récupère la liste des dépendances
+. ./get_deps.sh
+
+cd ..
+
+# Vitis
+echo "---- Push vitis ----"
+git subtree push --prefix src/vitis "git@gitlab.veremes.net:Development/vitis_apps/sources/vitis.git" master
+
+# Modules
+if [[ $depsCount > 0 ]]; then
+	for (( i=1; i <= $depsCount; i++ )); do
+		if [ ${aDeps[$i, nature]} == "modules" ]; then
+			echo "---- Push ${aDeps[$i, name]} ----"
+
+			# Push le dépôt
+			git subtree push --prefix src/${aDeps[$i, name]} "git@gitlab.veremes.net:Development/vitis_apps/sources/${aDeps[$i, name]}.git" master
+		fi
+	done
+fi