diff --git a/app/controllers/studip_controller.php b/app/controllers/studip_controller.php
index d3a28ccdbecf1a6439072668b430d98b705cab2a..9e7b08eafb6ba60138710dbcb3cd77cdbd5293f6 100644
--- a/app/controllers/studip_controller.php
+++ b/app/controllers/studip_controller.php
@@ -275,6 +275,11 @@ abstract class StudipController extends Trails_Controller
             throw new InvalidArgumentException(__METHOD__ . ' cannot be used with absolute URLs');
         }
 
+        // Extract fragment (if any)
+        if (strpos($to, '#') !== false) {
+            list($args[0], $fragment) = explode('#', $to);
+        }
+
         // Extract parameters (if any)
         $params = [];
         if (is_array(end($args))) {
@@ -289,15 +294,9 @@ abstract class StudipController extends Trails_Controller
             return $arg;
         }, $args);
 
-        // Combine arguments to new $to string
-        $to = implode('/', $args);
-
-        //preserve fragment
-        [$to, $fragment] = explode('#', $to);
-
-        $url = parent::url_for($to);
+        $url = parent::url_for(...$args);
 
-        if ($fragment) {
+        if (isset($fragment)) {
             $url .= '#' . $fragment;
         }
         return URLHelper::getURL($url, $params);
diff --git a/tests/unit/lib/classes/StudipControllerTest.php b/tests/unit/lib/classes/StudipControllerTest.php
index 61ff2d999ed260b54e023b08482922f5e326f63d..a7009fe2aa504c4a8f23e662203e3ccd71f11d81 100644
--- a/tests/unit/lib/classes/StudipControllerTest.php
+++ b/tests/unit/lib/classes/StudipControllerTest.php
@@ -198,6 +198,10 @@ final class StudipControllerTest extends Codeception\Test\Unit
             '2-actions'                => ['dispatch.php/foo/bar', 'foo', 'bar'],
             '2-actions-and-parameter'  => ['dispatch.php/foo/bar?bar=42', 'foo', 'bar', ['bar' => 42]],
             '2-actions-and-parameters' => ['dispatch.php/foo/bar?bar=42&baz=23', 'foo', 'bar', ['bar' => 42, 'baz' => 23]],
+
+            'fragment'                 => ['dispatch.php/foo/bar/42/23#jump', 'foo/bar/42/23#jump'],
+            'fragment-and-parameters'  => ['dispatch.php/foo/bar/42/23#jump', 'foo/bar#jump', 42, 23],
+            'url-encoding-parameters'  => ['dispatch.php/foo/bar/%3Fabc/%2F', 'foo/bar', '?abc', '/'],
         ];
     }