diff --git a/resources/assets/javascripts/lib/url_helper.js b/resources/assets/javascripts/lib/url_helper.js
index c6c5660507962cf28d884f08696a52bbc65e0aea..0aa08c3539c5dee41ec90b661ea6b1b268cdc2c3 100644
--- a/resources/assets/javascripts/lib/url_helper.js
+++ b/resources/assets/javascripts/lib/url_helper.js
@@ -21,22 +21,6 @@ class URLHelper {
         this.parameters = parameters;
     }
 
-    /**
-     * method to extend short URLs like "dispatch.php/profile" to "http://.../dispatch.php/profile"
-     */
-    resolveURL(url) {
-        if (!_.isString(this.base_url) || url.match(/^[a-zA-Z][a-zA-Z0-9+-.]*:/) !== null || url.charAt(0) === '?') {
-            //this method cannot do any more:
-            return url;
-        }
-        var base_url = this.base_url;
-        if (url.charAt(0) === '/') {
-            var host = this.base_url.match(/^[a-zA-Z][a-zA-Z0-9+-.]*:\/\/[\w:.-]+/);
-            base_url = host ? host[0] : '';
-        }
-        return base_url + url;
-    }
-
     /**
      * returns a readily encoded URL with the mandatory parameters and additionally passed
      * parameters.
@@ -47,40 +31,31 @@ class URLHelper {
      * @return: url with all necessary and additional parameters, encoded
      */
     getURL(url, param_object, ignore_params) {
-        var params = _.defaults(param_object || {}, ignore_params ? {} : this.parameters),
-            tmp,
-            fragment,
-            query;
+        let result;
 
-        tmp = url.split('#');
-        url = tmp[0];
-        fragment = tmp[1];
-
-        tmp = url.split('?');
-        url = tmp[0];
-        query = tmp[1] || '';
-
-        if (url !== '') {
-            url = this.resolveURL(url);
+        if (url === '' || url.match(/^[?#]/)) {
+            result = new URL(url, location.href.replace(/\?.*/, ''));
+        } else {
+            result = new URL(url, this.base_url);
         }
-        query = decodeURIComponent(query);
-        // split query string and merge with param_object
-        _.each((query && query.split('&')) || [], function(e) {
-            var pair = e.split('=');
-            if (!(pair[0] in params)) {
-                params[pair[0]] = pair[1];
-            }
-        });
 
-        if (_.keys(params).length || url === '') {
-            url += '?' + jQuery.param(params);
+        if (!ignore_params) {
+            for (let key in this.parameters) {
+                if (!result.searchParams.has(key)) {
+                    result.searchParams.set(key, this.parameters[key]);
+                }
+            }
         }
 
-        if (fragment) {
-            url += '#' + fragment;
+        for (let key in param_object) {
+            if (param_object[key] !== null) {
+                result.searchParams.set(key, param_object[key]);
+            } else {
+                result.searchParams.delete(key);
+            }
         }
 
-        return url;
+        return result.href;
     }
 }
 
diff --git a/templates/start/_jstemplates.php b/templates/start/_jstemplates.php
index 7bccfe3e3af698ca65131b76005a756dfc897676..740b05a3462d01d895cb59f4cb70884a376c5b86 100644
--- a/templates/start/_jstemplates.php
+++ b/templates/start/_jstemplates.php
@@ -56,7 +56,7 @@
             </span>
             <div class="activity-heading">
             <% if (activity.actor.type !== 'anonymous') { %>
-                <a href="<%- STUDIP.URLHelper.resolveURL('dispatch.php/profile?username=' + activity.actor.details.name.username) %>">
+                <a href="<%- STUDIP.URLHelper.getURL('dispatch.php/profile?username=' + activity.actor.details.name.username) %>">
                     <img src="<%- activity.actor.details.avatar_medium  %>" class="activity-avatar">
                 </a>
             <% } %>