diff --git a/.gitattributes b/.gitattributes
index 09c78fbd5b4256062b4ffbe907ff92bbb800ba56..aaa918cb2e05d8337aaee3b358fe63bc06d7ec37 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -7,6 +7,8 @@
 /apps/files_versions/js/files_versions.js.map binary
 /apps/oauth2/js/oauth2.js binary
 /apps/oauth2/js/oauth2.js.map binary
+/apps/systemtags/js/systemtags.js binary
+/apps/systemtags/js/systemtags.js.map binary
 /apps/twofactor_backupcodes/js/*.js binary
 /apps/twofactor_backupcodes/js/*.js.map binary
 /apps/updatenotification/js/updatenotification.js binary
diff --git a/apps/systemtags/.l10nignore b/apps/systemtags/.l10nignore
new file mode 100644
index 0000000000000000000000000000000000000000..3fb1c8d4ad2473a97b2a6f4151f7bda6276144b4
--- /dev/null
+++ b/apps/systemtags/.l10nignore
@@ -0,0 +1,2 @@
+#webpack bundled files
+js/systemtags.js
diff --git a/apps/systemtags/appinfo/app.php b/apps/systemtags/appinfo/app.php
index 0fcf41348648e15697ec1118e9a2aa5aedaeb347..82eb2a29f4be6b872474c436ac88408ca55ada54 100644
--- a/apps/systemtags/appinfo/app.php
+++ b/apps/systemtags/appinfo/app.php
@@ -34,8 +34,7 @@ $eventDispatcher->addListener(
 	function() {
 		// FIXME: no public API for these ?
 		\OCP\Util::addScript('dist/systemtags');
-		\OCP\Util::addScript('systemtags', 'merged');
-		\OCP\Util::addStyle('systemtags', 'systemtagsfilelist');
+		\OCP\Util::addScript('systemtags', 'systemtags');
 	}
 );
 
diff --git a/apps/systemtags/js/merged.json b/apps/systemtags/js/merged.json
deleted file mode 100644
index 632abf6777e80d1a132125d938d707d951d391a5..0000000000000000000000000000000000000000
--- a/apps/systemtags/js/merged.json
+++ /dev/null
@@ -1,7 +0,0 @@
-[
-  "app.js",
-  "systemtagsfilelist.js",
-  "filesplugin.js",
-  "systemtagsinfoview.js",
-  "systemtagsinfoviewtoggleview.js"
-]
diff --git a/apps/systemtags/js/systemtags.js b/apps/systemtags/js/systemtags.js
new file mode 100644
index 0000000000000000000000000000000000000000..3b6c96483744aea5f1e9739310645e2dd71cb6d4
Binary files /dev/null and b/apps/systemtags/js/systemtags.js differ
diff --git a/apps/systemtags/js/systemtags.js.map b/apps/systemtags/js/systemtags.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..bc8398e1abecc0e634c6e0951578f0229c109850
Binary files /dev/null and b/apps/systemtags/js/systemtags.js.map differ
diff --git a/apps/systemtags/js/app.js b/apps/systemtags/src/app.js
similarity index 100%
rename from apps/systemtags/js/app.js
rename to apps/systemtags/src/app.js
diff --git a/apps/systemtags/css/systemtagsfilelist.scss b/apps/systemtags/src/css/systemtagsfilelist.scss
similarity index 100%
rename from apps/systemtags/css/systemtagsfilelist.scss
rename to apps/systemtags/src/css/systemtagsfilelist.scss
diff --git a/apps/systemtags/js/filesplugin.js b/apps/systemtags/src/filesplugin.js
similarity index 100%
rename from apps/systemtags/js/filesplugin.js
rename to apps/systemtags/src/filesplugin.js
diff --git a/apps/systemtags/src/systemtags.js b/apps/systemtags/src/systemtags.js
new file mode 100644
index 0000000000000000000000000000000000000000..265e41a21db8fc9a74720122c1296f872520867d
--- /dev/null
+++ b/apps/systemtags/src/systemtags.js
@@ -0,0 +1,8 @@
+import './app'
+import './systemtagsfilelist'
+import './filesplugin'
+import './systemtagsinfoview'
+import './systemtagsinfoviewtoggleview'
+import './css/systemtagsfilelist.scss'
+
+window.OCA.SystemTags = OCA.SystemTags;
diff --git a/apps/systemtags/js/systemtagsfilelist.js b/apps/systemtags/src/systemtagsfilelist.js
similarity index 100%
rename from apps/systemtags/js/systemtagsfilelist.js
rename to apps/systemtags/src/systemtagsfilelist.js
diff --git a/apps/systemtags/js/systemtagsinfoview.js b/apps/systemtags/src/systemtagsinfoview.js
similarity index 100%
rename from apps/systemtags/js/systemtagsinfoview.js
rename to apps/systemtags/src/systemtagsinfoview.js
diff --git a/apps/systemtags/js/systemtagsinfoviewtoggleview.js b/apps/systemtags/src/systemtagsinfoviewtoggleview.js
similarity index 100%
rename from apps/systemtags/js/systemtagsinfoviewtoggleview.js
rename to apps/systemtags/src/systemtagsinfoviewtoggleview.js
diff --git a/apps/systemtags/webpack.js b/apps/systemtags/webpack.js
new file mode 100644
index 0000000000000000000000000000000000000000..27f1b9032584adfe59126fb6cff2c489adbd4e60
--- /dev/null
+++ b/apps/systemtags/webpack.js
@@ -0,0 +1,37 @@
+const path = require('path');
+
+module.exports = {
+	entry: path.join(__dirname, 'src', 'systemtags.js'),
+	output: {
+		path: path.resolve(__dirname, './js'),
+		publicPath: '/js/',
+		filename: 'systemtags.js'
+	},
+	module: {
+		rules: [
+			{
+				test: /\.css$/,
+				use: ['style-loader', 'css-loader']
+			},
+			{
+				test: /\.scss$/,
+				use: ['style-loader', 'css-loader', 'sass-loader']
+			},
+			{
+				test: /\.js$/,
+				loader: 'babel-loader',
+				exclude: /node_modules/
+			},
+			{
+				test: /\.(png|jpg|gif|svg)$/,
+				loader: 'file-loader',
+				options: {
+					name: '[name].[ext]?[hash]'
+				}
+			}
+		]
+	},
+	resolve: {
+		extensions: ['*', '.js']
+	}
+};
diff --git a/webpack.common.js b/webpack.common.js
index f6a0d0213ae99dd33776abc6f3367808e6dc4c46..fd28e53b91b558037d4afc323c5045bc3eb12bbb 100644
--- a/webpack.common.js
+++ b/webpack.common.js
@@ -2,9 +2,12 @@ const core = require('./core/webpack');
 const files_trashbin = require('./apps/files_trashbin/webpack')
 const files_versions = require('./apps/files_versions/webpack');
 const oauth2 = require('./apps/oauth2/webpack')
+const systemtags = require('./apps/systemtags/webpack')
 
 module.exports = [].concat(
 	core,
 	files_trashbin,
 	files_versions,
-	oauth2);
+	oauth2,
+	systemtags
+);