diff --git a/package-lock.json b/package-lock.json
index fca1da2c7c958a6e8877e4492e98628326e2520a..ffb0f5508c4a68e07e81536b805873a4cb938f3b 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,5 +1,5 @@
 {
-  "name": "hipla-react",
+  "name": "hipla-full-stack",
   "version": "0.0.1",
   "lockfileVersion": 1,
   "requires": true,
@@ -12709,7 +12709,6 @@
               "version": "1.1.11",
               "bundled": true,
               "dev": true,
-              "optional": true,
               "requires": {
                 "balanced-match": "^1.0.0",
                 "concat-map": "0.0.1"
@@ -12878,7 +12877,6 @@
               "version": "3.0.4",
               "bundled": true,
               "dev": true,
-              "optional": true,
               "requires": {
                 "brace-expansion": "^1.1.7"
               }
@@ -15324,6 +15322,15 @@
         "uuid": "^3.1.0"
       }
     },
+    "webpack-merge": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.1.2.tgz",
+      "integrity": "sha512-/0QYwW/H1N/CdXYA2PNPVbsxO3u2Fpz34vs72xm03SRfg6bMNGfMJIQEpQjKRvkG2JvT6oRJFpDtSrwbX8Jzvw==",
+      "dev": true,
+      "requires": {
+        "lodash": "^4.17.5"
+      }
+    },
     "webpack-sources": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz",
diff --git a/package.json b/package.json
index 0ac25db9d8d9a87ca4039a630f53329d61b4b399..f77fec8acd2dc34a85268179ea8ebeed0650a885 100644
--- a/package.json
+++ b/package.json
@@ -1,18 +1,20 @@
 {
-  "name": "hipla-react",
+  "name": "hipla-full-stack",
   "version": "0.0.1",
   "description": "",
   "private": true,
   "scripts": {
-    "start": "node src/server/index.js",
-    "build": "webpack --mode production",
-    "client": "webpack-dev-server --mode development --devtool inline-source-map --hot",
     "dev": "concurrently \"npm run server\" \"npm run client\"",
-    "server": "nodemon --exec babel-node src/server/index.js",
+    "build": "npm run build-client && npm run build-server",
+    "client": "webpack-dev-server --config webpack.client.dev.js",
+    "server": "nodemon src/server/index.js --exec babel-node ",
+    "build-client": "webpack --progress --config webpack.client.prod.js",
+    "build-server": "babel --no-babelrc --presets=es2015 -d ./dist/server ./src/server",
+    "serve": "NODE_ENV=production node dist/server/index.js",
     "test": "jest --watch"
   },
   "jest": {
-    "setupTestFrameworkScriptFile": "<rootDir>/src/setupTests.js"
+    "setupTestFrameworkScriptFile": "<rootDir>/src/client/setupTests.js"
   },
   "keywords": [],
   "author": "Esko Ikkala",
@@ -24,6 +26,7 @@
     "babel-jest": "^22.4.4",
     "babel-loader": "^7.1.4",
     "babel-preset-env": "^1.7.0",
+    "babel-preset-es2015": "^6.24.1",
     "babel-preset-react": "^6.24.1",
     "clean-webpack-plugin": "^0.1.19",
     "concurrently": "^3.5.1",
@@ -44,7 +47,8 @@
     "style-loader": "^0.20.3",
     "webpack": "^4.11.1",
     "webpack-cli": "^2.1.5",
-    "webpack-dev-server": "^3.1.4"
+    "webpack-dev-server": "^3.1.4",
+    "webpack-merge": "^4.1.2"
   },
   "dependencies": {
     "@material-ui/core": "^1.2.0",
diff --git a/webpack.client.common.js b/webpack.client.common.js
new file mode 100644
index 0000000000000000000000000000000000000000..90039411f8a3b5166c03a59299a66342cad265dd
--- /dev/null
+++ b/webpack.client.common.js
@@ -0,0 +1,54 @@
+const path = require('path');
+const HtmlWebpackPlugin = require('html-webpack-plugin');
+const CleanWebpackPlugin = require('clean-webpack-plugin');
+const webpack = require('webpack');
+
+const outputDirectory = 'dist/public';
+
+module.exports = {
+  entry: {
+    app: './src/client/index.js',
+  },
+  plugins: [
+    new CleanWebpackPlugin(['dist']),
+    new HtmlWebpackPlugin({
+      title: 'Hipla',
+      // Load a custom template
+      template: 'src/client/index.html',
+    }),
+    new webpack.NamedModulesPlugin(),
+    new webpack.HotModuleReplacementPlugin(),
+  ],
+  output: {
+    filename: '[name].bundle.js',
+    path: path.resolve(__dirname, outputDirectory),
+  },
+  module: {
+    rules: [
+      {
+        test: /\.js$/,
+        exclude: /node_modules/,
+        loader: 'babel-loader',
+        query: {
+          presets: ['es2015', 'react', 'stage-2']
+        },
+      },
+      {
+        test: /\.css$/,
+        use: [
+          'style-loader',
+          'css-loader',
+        ],
+      },
+      {
+        test: /\.(png|svg|jpg|gif)$/,
+        use: [
+          'file-loader',
+        ],
+      },
+    ],
+  },
+  resolve: {
+    extensions: ['.js', '.jsx'],
+  },
+};
diff --git a/webpack.client.dev.js b/webpack.client.dev.js
new file mode 100644
index 0000000000000000000000000000000000000000..422956d579cacb49e393f4fae81472cd35dd115e
--- /dev/null
+++ b/webpack.client.dev.js
@@ -0,0 +1,16 @@
+const merge = require('webpack-merge');
+const common = require('./webpack.client.common.js');
+
+module.exports = merge(common, {
+  mode: 'development',
+  devtool: 'inline-source-map',
+  devServer: {
+    contentBase: './dist',
+    hot: true,
+    port: 8080,
+    open: true,
+    proxy: {
+      '/api': 'http://localhost:3000'
+    }
+  }
+});
diff --git a/webpack.client.prod.js b/webpack.client.prod.js
new file mode 100644
index 0000000000000000000000000000000000000000..52a153eebda07f643a4e0bb0556d37beb37eb01e
--- /dev/null
+++ b/webpack.client.prod.js
@@ -0,0 +1,17 @@
+const webpack = require('webpack');
+const merge = require('webpack-merge');
+const UglifyJSPlugin = require('uglifyjs-webpack-plugin');
+const common = require('./webpack.client.common.js');
+
+module.exports = merge(common, {
+  mode: 'production',
+  devtool: 'source-map',
+  plugins: [
+    new UglifyJSPlugin({
+      sourceMap: true
+    }),
+    new webpack.DefinePlugin({
+      'process.env.NODE_ENV': JSON.stringify('production')
+    })
+  ]
+});