diff --git a/app/helpers.php b/app/helpers.php
new file mode 100644
index 000000000..f25a8f765
--- /dev/null
+++ b/app/helpers.php
@@ -0,0 +1,30 @@
+<?php
+
+if (! function_exists('versioned_asset')) {
+    /**
+     * Get the path to a versioned file.
+     *
+     * @param  string  $file
+     * @return string
+     *
+     * @throws \InvalidArgumentException
+     */
+    function versioned_asset($file)
+    {
+        static $manifest = null;
+
+        if (is_null($manifest)) {
+            $manifest = json_decode(file_get_contents(public_path('build/manifest.json')), true);
+        }
+
+        if (isset($manifest[$file])) {
+            return '/' . $manifest[$file];
+        }
+
+        if (file_exists(public_path($file))) {
+            return '/' . $file;
+        }
+
+        throw new InvalidArgumentException("File {$file} not defined in asset manifest.");
+    }
+}
\ No newline at end of file
diff --git a/composer.json b/composer.json
index 7865be636..748ff68f7 100644
--- a/composer.json
+++ b/composer.json
@@ -25,7 +25,10 @@
         ],
         "psr-4": {
             "BookStack\\": "app/"
-        }
+        },
+        "files": [
+            "app/helpers.php"
+        ]
     },
     "autoload-dev": {
         "classmap": [
diff --git a/gulpfile.js b/gulpfile.js
index 621e665be..439618739 100644
--- a/gulpfile.js
+++ b/gulpfile.js
@@ -1,8 +1,26 @@
 var elixir = require('laravel-elixir');
 
+// Custom extensions
+var gulp = require('gulp');
+var Task = elixir.Task;
+var fs = require('fs');
+
+elixir.extend('queryVersion', function(inputFiles) {
+     new Task('queryVersion', function() {
+         var manifestObject = {};
+         var uidString = Date.now().toString(16).slice(4);
+         for (var i = 0; i < inputFiles.length; i++) {
+             var file = inputFiles[i];
+             manifestObject[file] = file + '?version=' + uidString;
+         }
+         var fileContents = JSON.stringify(manifestObject, null, 1);
+         fs.writeFileSync('public/build/manifest.json', fileContents);
+     }).watch(['./public/css/*.css', './public/js/*.js']);
+});
+
 elixir(function(mix) {
     mix.sass('styles.scss')
         .sass('print-styles.scss')
         .browserify(['jquery-extensions.js', 'global.js'], 'public/js/common.js')
-        .version(['css/styles.css', 'css/print-styles.css', 'js/common.js']);
+        .queryVersion(['css/styles.css', 'css/print-styles.css', 'js/common.js']);
 });
diff --git a/package.json b/package.json
index af2cbae58..e33ad170e 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
 {
   "private": true,
   "devDependencies": {
-    "gulp": "^3.8.8",
+    "gulp": "^3.9.0",
     "insert-css": "^0.2.0"
   },
   "dependencies": {
diff --git a/resources/views/base.blade.php b/resources/views/base.blade.php
index 9c3ddbf91..553c634cb 100644
--- a/resources/views/base.blade.php
+++ b/resources/views/base.blade.php
@@ -9,8 +9,8 @@
     <meta charset="utf-8">
 
     <!-- Styles and Fonts -->
-    <link rel="stylesheet" href="{{ elixir('css/styles.css') }}">
-    <link rel="stylesheet" media="print" href="{{ elixir('css/print-styles.css') }}">
+    <link rel="stylesheet" href="{{ versioned_asset('css/styles.css') }}">
+    <link rel="stylesheet" media="print" href="{{ versioned_asset('css/print-styles.css') }}">
     <link href='//fonts.googleapis.com/css?family=Roboto:400,400italic,500,500italic,700,700italic,300italic,100,300' rel='stylesheet' type='text/css'>
     <link rel="stylesheet" href="/libs/material-design-iconic-font/css/material-design-iconic-font.min.css">
 
@@ -79,6 +79,6 @@
     </section>
 
 @yield('bottom')
-<script src="{{ elixir('js/common.js') }}"></script>
+<script src="{{ versioned_asset('js/common.js') }}"></script>
 </body>
 </html>