diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..94a25f7
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="$PROJECT_DIR$" vcs="Git" />
+  </component>
+</project>
\ No newline at end of file
diff --git a/index.html b/index.html
index aea2dad..1120cb5 100644
--- a/index.html
+++ b/index.html
@@ -11,6 +11,8 @@
         <link rel="stylesheet" type="text/css" href="vendor/bootstrap-slider/css/bootstrap-slider.min.css" />
         <link rel="stylesheet" type="text/css" href="vendor/bootstrap-colorpicker/css/bootstrap-colorpicker.min.css" />
         <link rel="stylesheet" type="text/css" href="css/main.css" />
+        <link rel="manifest" href="./manifest.json">
+
     </head>
     <body>
         <nav class="navbar navbar-inverse navbar-fixed-top">
@@ -366,7 +368,17 @@ <h3 class="panel-title">Colors</h3>
             <!-- <button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button> -->
             <p class="message">Alert message empty...</p>
         </div>
-
+        <script type="text/javascript">
+            if (navigator.serviceWorker) {
+                navigator.serviceWorker.register('sw.js', {scope: '/'}).then(function(reg) {
+                    // registration worked
+                    console.log('Registration succeeded. Scope is ' + reg.scope);
+                }).catch(function(error) {
+                    // registration failed
+                    console.log('Registration failed with ' + error);
+                });
+            }
+        </script>
         <script src="vendor/jquery-2.1.4.min.js" type="text/javascript"></script>
         <script src="vendor/jquery-ui/jquery-ui.min.js" type="text/javascript"></script>
         <script src="vendor/bootstrap/js/bootstrap.min.js" type="text/javascript"></script>
diff --git a/manifest.json b/manifest.json
new file mode 100644
index 0000000..f0d0ca7
--- /dev/null
+++ b/manifest.json
@@ -0,0 +1,8 @@
+{
+  "short_name": "SLAcer.js",
+  "name": "SLAcer.js (bêta)",
+  "description": "SLAcer.js (bêta)",
+  "start_url": "./index.html",
+  "display": "standalone",
+  "orientation": "landscape"
+}
\ No newline at end of file
diff --git a/sw.js b/sw.js
new file mode 100644
index 0000000..50995c8
--- /dev/null
+++ b/sw.js
@@ -0,0 +1,61 @@
+// Use a cacheName for cache versioning
+var cacheName = 'v1:static';
+var cacheFiles = [
+    './',
+    'index.html',
+    './index.html',
+    './css/main.css',
+    './js/main.js',
+    './js/loader/stl.js',
+    './js/slacer/mesh.js',
+    './js/slacer/settings.js',
+    './js/slacer/slicer.js',
+    './js/slacer/viewer.js',
+    './js/slacer/viewcontrols.js',
+    './js/slacer/viewer2d.js',
+    './js/slacer/viewer3d.js',
+    './vendor/jquery-ui/jquery-ui.min.css',
+    './vendor/bootstrap/css/bootstrap.min.css',
+    './vendor/bootstrap-slider/css/bootstrap-slider.min.css',
+    './vendor/bootstrap-colorpicker/css/bootstrap-colorpicker.min.css',
+    './vendor/jquery-2.1.4.min.js',
+    './vendor/jquery-ui/jquery-ui.min.js',
+    './vendor/bootstrap/js/bootstrap.min.js',
+    './vendor/bootstrap-slider/bootstrap-slider.min.js',
+    './vendor/bootstrap-colorpicker/js/bootstrap-colorpicker.min.js',
+    './vendor/lodash.min.js',
+    './vendor/three.min.js',
+    './vendor/earcut.js',
+    './vendor/triangulation.js',
+    './vendor/OrbitControls.js',
+    './vendor/FileSaver.min.js',
+    './vendor/jszip.min.js'
+];
+
+// During the installation phase, you'll usually want to cache static assets.
+self.addEventListener('install', function(e) {
+    // Once the service worker is installed, go ahead and fetch the resources to make this work offline.
+    console.log('install');
+    e.waitUntil(
+        caches.open(cacheName).then(function(cache) {
+            return cache.addAll(cacheFiles).then(function() {
+                self.skipWaiting();
+            });
+        })
+    );
+});
+
+// when the browser fetches a URL…
+self.addEventListener('fetch', function(event) {
+    // … either respond with the cached object or go ahead and fetch the actual URL
+    event.respondWith(
+        caches.match(event.request).then(function(resp) {
+            return resp || fetch(event.request).then(function(response) {
+                return caches.open(cacheName).then(function(cache) {
+                    cache.put(event.request, response.clone());
+                    return response;
+                });
+            });
+        })
+    );
+});
\ No newline at end of file
