diff --git a/package.json b/package.json
index 10b2c077..163a6b85 100644
--- a/package.json
+++ b/package.json
@@ -22,7 +22,7 @@
   },
   "devDependencies": {
     "async": "2.6.0",
-    "copy-webpack-plugin": "4.0.1",
+    "copy-webpack-plugin": "^4.5.1",
     "eslint": "^4.16",
     "event-stream": "3.3.4",
     "exports-loader": "0.6.3",
@@ -35,7 +35,9 @@
     "json": "9.0.4",
     "rimraf": "2.6.2",
     "travis-after-all": "1.4.4",
+    "uglifyjs-webpack-plugin": "^1.2.5",
     "webdriverio": "4.8.0",
-    "webpack": "1.13.2"
+    "webpack": "^4.8.0",
+    "webpack-cli": "^2.0.15"
   }
 }
diff --git a/shim/blockly_compressed_horizontal-blocks_compressed.js b/shim/blockly_compressed_horizontal-blocks_compressed.js
index 71a555c6..32675cc4 100644
--- a/shim/blockly_compressed_horizontal-blocks_compressed.js
+++ b/shim/blockly_compressed_horizontal-blocks_compressed.js
@@ -1 +1 @@
-module.exports = require('imports?Blockly=./shim/blockly_compressed_horizontal.Blockly!exports?Blockly!../blocks_compressed');
+module.exports = require('imports-loader?Blockly=./shim/blockly_compressed_horizontal.Blockly!exports-loader?Blockly!../blocks_compressed');
diff --git a/shim/blockly_compressed_horizontal.js b/shim/blockly_compressed_horizontal.js
index 94ea0f52..ed83a674 100644
--- a/shim/blockly_compressed_horizontal.js
+++ b/shim/blockly_compressed_horizontal.js
@@ -1 +1 @@
-module.exports = require('imports?this=>window!exports?Blockly&goog!../blockly_compressed_horizontal');
+module.exports = require('imports-loader?this=>window!exports-loader?Blockly&goog!../blockly_compressed_horizontal');
diff --git a/shim/blockly_compressed_vertical-blocks_compressed.js b/shim/blockly_compressed_vertical-blocks_compressed.js
index 1aec6dee..8eec1f68 100644
--- a/shim/blockly_compressed_vertical-blocks_compressed.js
+++ b/shim/blockly_compressed_vertical-blocks_compressed.js
@@ -1 +1 @@
-module.exports = require('imports?Blockly=./shim/blockly_compressed_vertical.Blockly!exports?Blockly!../blocks_compressed');
+module.exports = require('imports-loader?Blockly=./shim/blockly_compressed_vertical.Blockly!exports-loader?Blockly!../blocks_compressed');
diff --git a/shim/blockly_compressed_vertical.js b/shim/blockly_compressed_vertical.js
index 22a28cfb..dce46a9d 100644
--- a/shim/blockly_compressed_vertical.js
+++ b/shim/blockly_compressed_vertical.js
@@ -1 +1 @@
-module.exports = require('imports?this=>window!exports?Blockly&goog!../blockly_compressed_vertical');
+module.exports = require('imports-loader?this=>window!exports-loader?Blockly&goog!../blockly_compressed_vertical');
diff --git a/shim/blocks_compressed_horizontal.js b/shim/blocks_compressed_horizontal.js
index 2d68d047..0c4272ae 100644
--- a/shim/blocks_compressed_horizontal.js
+++ b/shim/blocks_compressed_horizontal.js
@@ -1 +1 @@
-module.exports = require('imports?Blockly=./shim/blockly_compressed_horizontal-blocks_compressed!exports?Blockly!../blocks_compressed_horizontal');
+module.exports = require('imports-loader?Blockly=./shim/blockly_compressed_horizontal-blocks_compressed!exports-loader?Blockly!../blocks_compressed_horizontal');
diff --git a/shim/blocks_compressed_vertical.js b/shim/blocks_compressed_vertical.js
index 5938d38e..3368c09d 100644
--- a/shim/blocks_compressed_vertical.js
+++ b/shim/blocks_compressed_vertical.js
@@ -1 +1 @@
-module.exports = require('imports?goog=./shim/blockly_compressed_vertical.goog,Blockly=./shim/blockly_compressed_vertical-blocks_compressed!exports?Blockly!../blocks_compressed_vertical');
+module.exports = require('imports-loader?goog=./shim/blockly_compressed_vertical.goog,Blockly=./shim/blockly_compressed_vertical-blocks_compressed!exports-loader?Blockly!../blocks_compressed_vertical');
diff --git a/shim/gh-pages.js b/shim/gh-pages.js
new file mode 100644
index 00000000..36db4933
--- /dev/null
+++ b/shim/gh-pages.js
@@ -0,0 +1 @@
+// intentionally left empty
diff --git a/shim/horizontal.js b/shim/horizontal.js
index 73970e92..db666d06 100644
--- a/shim/horizontal.js
+++ b/shim/horizontal.js
@@ -1 +1 @@
-module.exports = require('imports?Blockly=../shim/blocks_compressed_horizontal,goog=../shim/blockly_compressed_horizontal.goog!exports?Blockly!../msg/messages');
\ No newline at end of file
+module.exports = require('imports-loader?Blockly=../shim/blocks_compressed_horizontal,goog=../shim/blockly_compressed_horizontal.goog!exports-loader?Blockly!../msg/messages');
\ No newline at end of file
diff --git a/shim/vertical.js b/shim/vertical.js
index dcba342d..998b465f 100644
--- a/shim/vertical.js
+++ b/shim/vertical.js
@@ -1 +1 @@
-module.exports = require('imports?Blockly=../shim/blocks_compressed_vertical,goog=../shim/blockly_compressed_vertical.goog!exports?Blockly!../msg/messages');
\ No newline at end of file
+module.exports = require('imports-loader?Blockly=../shim/blocks_compressed_vertical,goog=../shim/blockly_compressed_vertical.goog!exports-loader?Blockly!../msg/messages');
\ No newline at end of file
diff --git a/webpack.config.js b/webpack.config.js
index c74854d4..6d3be1d1 100644
--- a/webpack.config.js
+++ b/webpack.config.js
@@ -5,8 +5,10 @@ gracefulFs.gracefulify(realFs);
 
 var CopyWebpackPlugin = require('copy-webpack-plugin');
 var path = require('path');
+var UglifyJsPlugin = require('uglifyjs-webpack-plugin');
 
 module.exports = [{
+  mode: process.env.NODE_ENV === 'production' ? 'production' : 'development',
   entry: {
     horizontal: './shim/horizontal.js',
     vertical: './shim/vertical.js'
@@ -16,8 +18,15 @@ module.exports = [{
     libraryTarget: 'commonjs2',
     path: path.resolve(__dirname, 'dist'),
     filename: '[name].js'
+  },
+  optimization: {
+    minimize: false
+  },
+  performance: {
+    hints: false
   }
 }, {
+  mode: process.env.NODE_ENV === 'production' ? 'production' : 'development',
   entry: {
     horizontal: './shim/horizontal.js',
     vertical: './shim/vertical.js'
@@ -27,13 +36,31 @@ module.exports = [{
     libraryTarget: 'umd',
     path: path.resolve(__dirname, 'dist', 'web'),
     filename: '[name].js'
-  }
+  },
+  optimization: {
+    minimizer: [
+      new UglifyJsPlugin({
+        uglifyOptions: {
+          mangle: false
+        }
+      })
+    ]
+  },
+  plugins: []
 },
 {
+  mode: process.env.NODE_ENV === 'production' ? 'production' : 'development',
+  entry: './shim/gh-pages.js',
   output: {
     filename: '[name].js',
     path: path.resolve(__dirname, 'gh-pages')
   },
+  optimization: {
+    minimize: false
+  },
+  performance: {
+    hints: false
+  },
   plugins: [
       new CopyWebpackPlugin([{
         from: 'node_modules/google-closure-library',