diff --git a/core/js/dist/login.js b/core/js/dist/login.js
index 4a1b9de83664c3d8accc594eb1f05910669f3eca..41fa6875853e1c83a22a9f638d6de488a03bb8a0 100644
Binary files a/core/js/dist/login.js and b/core/js/dist/login.js differ
diff --git a/core/js/dist/login.js.map b/core/js/dist/login.js.map
index 072b4cce99e91ea118325c3111fcc784bdbe0196..af3a89264da3078850ec6f4fbd6df7478d3fcc56 100644
Binary files a/core/js/dist/login.js.map and b/core/js/dist/login.js.map differ
diff --git a/core/js/dist/main.js b/core/js/dist/main.js
index f8d2b5c7ace935585b3a812cb655805bcf606777..5befe512f499e265fd04c153a527bad6fdac64a8 100644
Binary files a/core/js/dist/main.js and b/core/js/dist/main.js differ
diff --git a/core/js/dist/main.js.map b/core/js/dist/main.js.map
index 3cae82bd5a3e5542db203fb4ad32f37a6e4fd405..c7f422c15532e5143e4c20b8d506856b271d6f37 100644
Binary files a/core/js/dist/main.js.map and b/core/js/dist/main.js.map differ
diff --git a/core/js/js.js b/core/js/js.js
index 4301298645e9e472533f132b180bf70fa40865d9..cca8da8e7bef92360e37a41635c7f761ea6754e2 100644
--- a/core/js/js.js
+++ b/core/js/js.js
@@ -7,77 +7,6 @@ var OCP = Object.assign({}, window.OCP);
 Object.assign(window.OC, {
 	/* jshint camelcase: false */
 
-	/**
-	 * Parses a URL query string into a JS map
-	 * @param {string} queryString query string in the format param1=1234&param2=abcde&param3=xyz
-	 * @return {Object.<string, string>} map containing key/values matching the URL parameters
-	 */
-	parseQueryString:function(queryString){
-		var parts,
-			pos,
-			components,
-			result = {},
-			key,
-			value;
-		if (!queryString){
-			return null;
-		}
-		pos = queryString.indexOf('?');
-		if (pos >= 0){
-			queryString = queryString.substr(pos + 1);
-		}
-		parts = queryString.replace(/\+/g, '%20').split('&');
-		for (var i = 0; i < parts.length; i++){
-			// split on first equal sign
-			var part = parts[i];
-			pos = part.indexOf('=');
-			if (pos >= 0) {
-				components = [
-					part.substr(0, pos),
-					part.substr(pos + 1)
-				];
-			}
-			else {
-				// key only
-				components = [part];
-			}
-			if (!components.length){
-				continue;
-			}
-			key = decodeURIComponent(components[0]);
-			if (!key){
-				continue;
-			}
-			// if equal sign was there, return string
-			if (components.length > 1) {
-				result[key] = decodeURIComponent(components[1]);
-			}
-			// no equal sign => null value
-			else {
-				result[key] = null;
-			}
-		}
-		return result;
-	},
-
-	/**
-	 * Builds a URL query from a JS map.
-	 * @param {Object.<string, string>} params map containing key/values matching the URL parameters
-	 * @return {string} String containing a URL query (without question) mark
-	 */
-	buildQueryString: function(params) {
-		if (!params) {
-			return '';
-		}
-		return $.map(params, function(value, key) {
-			var s = encodeURIComponent(key);
-			if (value !== null && typeof(value) !== 'undefined') {
-				s += '=' + encodeURIComponent(value);
-			}
-			return s;
-		}).join('&');
-	},
-
 	/**
 	 * Opens a popup with the setting for an app.
 	 * @param {string} appid The ID of the app e.g. 'calendar', 'contacts' or 'files'.
diff --git a/core/src/OC/index.js b/core/src/OC/index.js
index ea217edaf8834bcfa7c08cdf7b7ae7ae4c4a1002..4a2f2c3d803ef7915fb2177f44876cff8c20b160 100644
--- a/core/src/OC/index.js
+++ b/core/src/OC/index.js
@@ -31,6 +31,10 @@ import {
 	isSamePath,
 	joinPaths,
 } from './path'
+import {
+	build as buildQueryString,
+	parse as parseQueryString,
+} from './query-string'
 import Config from './config'
 import {
 	coreApps,
@@ -198,6 +202,12 @@ export default {
 	 */
 	addTranslations: L10N.load,
 
+	/**
+	 * Query string helpers
+	 */
+	buildQueryString,
+	parseQueryString,
+
 	msg,
 	Notification,
 	PasswordConfirmation,
diff --git a/core/src/OC/query-string.js b/core/src/OC/query-string.js
new file mode 100644
index 0000000000000000000000000000000000000000..973412de5793e614092357180dd54f308963c3c4
--- /dev/null
+++ b/core/src/OC/query-string.js
@@ -0,0 +1,89 @@
+/*
+ * @copyright 2019 Christoph Wurst <christoph@winzerhof-wurst.at>
+ *
+ * @author 2019 Christoph Wurst <christoph@winzerhof-wurst.at>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * Parses a URL query string into a JS map
+ * @param {string} queryString query string in the format param1=1234&param2=abcde&param3=xyz
+ * @return {Object.<string, string>} map containing key/values matching the URL parameters
+ */
+export const parse = queryString => {
+	let parts,
+		pos,
+		components,
+		result = {},
+		key,
+		value
+	if (!queryString) {
+		return null
+	}
+	pos = queryString.indexOf('?')
+	if (pos >= 0) {
+		queryString = queryString.substr(pos + 1)
+	}
+	parts = queryString.replace(/\+/g, '%20').split('&')
+	for (let i = 0; i < parts.length; i++) {
+		// split on first equal sign
+		var part = parts[i]
+		pos = part.indexOf('=')
+		if (pos >= 0) {
+			components = [
+				part.substr(0, pos),
+				part.substr(pos + 1)
+			]
+		} else {
+			// key only
+			components = [part]
+		}
+		if (!components.length) {
+			continue
+		}
+		key = decodeURIComponent(components[0])
+		if (!key) {
+			continue
+		}
+		// if equal sign was there, return string
+		if (components.length > 1) {
+			result[key] = decodeURIComponent(components[1])
+		} else {
+			// no equal sign => null value
+			result[key] = null
+		}
+	}
+	return result
+}
+
+/**
+ * Builds a URL query from a JS map.
+ * @param {Object.<string, string>} params map containing key/values matching the URL parameters
+ * @return {string} String containing a URL query (without question) mark
+ */
+export const build = params => {
+	if (!params) {
+		return ''
+	}
+	return $.map(params, function (value, key) {
+		var s = encodeURIComponent(key)
+		if (value !== null && typeof (value) !== 'undefined') {
+			s += '=' + encodeURIComponent(value)
+		}
+		return s
+	}).join('&')
+}