diff --git a/config/webpack.config.js b/config/webpack.config.js
index 5f95255334ccabe2fd27b5e90f812a907cecdfb0..95fa79990e2264fc6251757c6afb31fce101e88b 100644
--- a/config/webpack.config.js
+++ b/config/webpack.config.js
@@ -1,5 +1,6 @@
 'use strict';
 
+var crypto = require('crypto');
 var fs = require('fs');
 var path = require('path');
 var webpack = require('webpack');
@@ -179,15 +180,34 @@ var config = {
       if (chunk.name) {
         return chunk.name;
       }
-      return chunk.mapModules((m) => {
+
+      const moduleNames = [];
+
+      function collectModuleNames(m) {
+        // handle ConcatenatedModule which does not have resource nor context set
+        if (m.modules) {
+          m.modules.forEach(collectModuleNames);
+          return;
+        }
+
         const pagesBase = path.join(ROOT_PATH, 'app/assets/javascripts/pages');
+
         if (m.resource.indexOf(pagesBase) === 0) {
-          return path.relative(pagesBase, m.resource)
+          moduleNames.push(path.relative(pagesBase, m.resource)
             .replace(/\/index\.[a-z]+$/, '')
-            .replace(/\//g, '__');
+            .replace(/\//g, '__'));
+        } else {
+          moduleNames.push(path.relative(m.context, m.resource));
         }
-        return path.relative(m.context, m.resource);
-      }).join('_');
+      }
+
+      chunk.forEachModule(collectModuleNames);
+
+      const hash = crypto.createHash('sha256')
+        .update(moduleNames.join('_'))
+        .digest('hex');
+
+      return `${moduleNames[0]}-${hash.substr(0, 6)}`;
     }),
 
     // create cacheable common library bundle for all vue chunks