diff --git a/lib/private/helper.php b/lib/private/helper.php
index 4058ec199a7f34964523dff94ad2794439ae340a..64da1f6fb12d0d73391c845724273fab4bd5c15f 100644
--- a/lib/private/helper.php
+++ b/lib/private/helper.php
@@ -78,7 +78,9 @@ class OC_Helper {
 	 * Returns a absolute url to the given app and file.
 	 */
 	public static function linkToAbsolute($app, $file, $args = array()) {
-		return self::linkTo($app, $file, $args);
+		return OC::$server->getURLGenerator()->getAbsoluteURL(
+			self::linkTo($app, $file, $args)
+		);
 	}
 
 	/**
@@ -112,8 +114,10 @@ class OC_Helper {
 	 * Returns a absolute url to the given service.
 	 */
 	public static function linkToRemote($service, $add_slash = true) {
-		return self::makeURLAbsolute(self::linkToRemoteBase($service))
-		. (($add_slash && $service[strlen($service) - 1] != '/') ? '/' : '');
+		return OC::$server->getURLGenerator()->getAbsoluteURL(
+			self::linkToRemoteBase($service)
+				. (($add_slash && $service[strlen($service) - 1] != '/') ? '/' : '')
+		);
 	}
 
 	/**
@@ -125,8 +129,12 @@ class OC_Helper {
 	 * Returns a absolute url to the given service.
 	 */
 	public static function linkToPublic($service, $add_slash = false) {
-		return self::linkToAbsolute('', 'public.php') . '?service=' . $service
-		. (($add_slash && $service[strlen($service) - 1] != '/') ? '/' : '');
+		return OC::$server->getURLGenerator()->getAbsoluteURL(
+			self::linkTo(
+				'', 'public.php') . '?service=' . $service
+				. (($add_slash && $service[strlen($service) - 1] != '/') ? '/' : ''
+			)
+		);
 	}
 
 	/**
diff --git a/tests/lib/helper.php b/tests/lib/helper.php
index 4aef4669cb3c17024d0c50b52f6b247b17f126e9..5663df7c9ae92e1f4619e03eaaef1da89ad1d982 100644
--- a/tests/lib/helper.php
+++ b/tests/lib/helper.php
@@ -279,4 +279,179 @@ class Test_Helper extends PHPUnit_Framework_TestCase {
 			array(3670, true, \OC::$SERVERROOT . '/tests/data/testimage.png', \OC::$SERVERROOT . '/tests/data/testimage-copy.png'),
 		);
 	}
+
+	// Url generator methods
+
+	/**
+	 * @small
+	 * @brief test absolute URL construction
+	 * @dataProvider provideDocRootURLs
+	 */
+	function testMakeAbsoluteURLDocRoot($url, $expectedResult) {
+		\OC::$WEBROOT = '';
+		$result = \OC_Helper::makeURLAbsolute($url);
+
+		$this->assertEquals($expectedResult, $result);
+	}
+
+	/**
+	 * @small
+	 * @brief test absolute URL construction
+	 * @dataProvider provideSubDirURLs
+	 */
+	function testMakeAbsoluteURLSubDir($url, $expectedResult) {
+		\OC::$WEBROOT = '/owncloud';
+		$result = \OC_Helper::makeURLAbsolute($url);
+
+		$this->assertEquals($expectedResult, $result);
+	}
+
+	public function provideDocRootURLs() {
+		return array(
+			array('index.php', 'http://localhost/index.php'),
+			array('/index.php', 'http://localhost/index.php'),
+			array('/apps/index.php', 'http://localhost/apps/index.php'),
+			array('apps/index.php', 'http://localhost/apps/index.php'),
+		);
+	}
+
+	public function provideSubDirURLs() {
+		return array(
+			array('index.php', 'http://localhost/owncloud/index.php'),
+			array('/index.php', 'http://localhost/owncloud/index.php'),
+			array('/apps/index.php', 'http://localhost/owncloud/apps/index.php'),
+			array('apps/index.php', 'http://localhost/owncloud/apps/index.php'),
+		);
+	}
+
+	/**
+	 * @small
+	 * @brief test linkTo URL construction
+	 * @dataProvider provideDocRootAppUrlParts
+	 */
+	public function testLinkToDocRoot($app, $file, $args, $expectedResult) {
+		\OC::$WEBROOT = '';
+		$result = \OC_Helper::linkTo($app, $file, $args);
+
+		$this->assertEquals($expectedResult, $result);
+	}
+
+	/**
+	 * @small
+	 * @brief test linkTo URL construction in sub directory
+	 * @dataProvider provideSubDirAppUrlParts
+	 */
+	public function testLinkToSubDir($app, $file, $args, $expectedResult) {
+		\OC::$WEBROOT = '/owncloud';
+		$result = \OC_Helper::linkTo($app, $file, $args);
+
+		$this->assertEquals($expectedResult, $result);
+	}
+
+	public function provideDocRootAppUrlParts() {
+		return array(
+			array('files', 'index.php', array(), '/index.php/apps/files'),
+			array('files', 'index.php', array('trut' => 'trat', 'dut' => 'dat'), '/index.php/apps/files?trut=trat&dut=dat'),
+			array('', 'index.php', array('trut' => 'trat', 'dut' => 'dat'), '/index.php?trut=trat&dut=dat'),
+		);
+	}
+
+	public function provideSubDirAppUrlParts() {
+		return array(
+			array('files', 'index.php', array(), '/owncloud/index.php/apps/files'),
+			array('files', 'index.php', array('trut' => 'trat', 'dut' => 'dat'), '/owncloud/index.php/apps/files?trut=trat&dut=dat'),
+			array('', 'index.php', array('trut' => 'trat', 'dut' => 'dat'), '/owncloud/index.php?trut=trat&dut=dat'),
+		);
+	}
+
+	/**
+	 * @small
+	 * @brief test linkToAbsolute URL construction
+	 * @dataProvider provideDocRootAppAbsoluteUrlParts
+	 */
+	public function testLinkToAbsoluteDocRoot($app, $file, $args, $expectedResult) {
+		\OC::$WEBROOT = '';
+		$result = \OC_Helper::linkToAbsolute($app, $file, $args);
+
+		$this->assertEquals($expectedResult, $result);
+	}
+
+	/**
+	 * @small
+	 * @brief test linkToAbsolute URL construction in sub directory
+	 * @dataProvider provideSubDirAppAbsoluteUrlParts
+	 */
+	public function testLinkToAbsoluteSubDir($app, $file, $args, $expectedResult) {
+		\OC::$WEBROOT = '/owncloud';
+		$result = \OC_Helper::linkToAbsolute($app, $file, $args);
+
+		$this->assertEquals($expectedResult, $result);
+	}
+
+	public function provideDocRootAppAbsoluteUrlParts() {
+		return array(
+			array('files', 'index.php', array(), 'http://localhost/index.php/apps/files'),
+			array('files', 'index.php', array('trut' => 'trat', 'dut' => 'dat'), 'http://localhost/index.php/apps/files?trut=trat&dut=dat'),
+			array('', 'index.php', array('trut' => 'trat', 'dut' => 'dat'), 'http://localhost/index.php?trut=trat&dut=dat'),
+		);
+	}
+
+	public function provideSubDirAppAbsoluteUrlParts() {
+		return array(
+			array('files', 'index.php', array(), 'http://localhost/owncloud/index.php/apps/files'),
+			array('files', 'index.php', array('trut' => 'trat', 'dut' => 'dat'), 'http://localhost/owncloud/index.php/apps/files?trut=trat&dut=dat'),
+			array('', 'index.php', array('trut' => 'trat', 'dut' => 'dat'), 'http://localhost/owncloud/index.php?trut=trat&dut=dat'),
+		);
+	}
+
+	/**
+	 * @small
+	 * @brief test linkToRemoteBase URL construction
+	 */
+	public function testLinkToRemoteBase() {
+		\OC::$WEBROOT = '';
+		$result = \OC_Helper::linkToRemoteBase('webdav');
+		$this->assertEquals('/remote.php/webdav', $result);
+
+		\OC::$WEBROOT = '/owncloud';
+		$result = \OC_Helper::linkToRemoteBase('webdav');
+		$this->assertEquals('/owncloud/remote.php/webdav', $result);
+	}
+
+	/**
+	 * @small
+	 * @brief test linkToRemote URL construction
+	 */
+	public function testLinkToRemote() {
+		\OC::$WEBROOT = '';
+		$result = \OC_Helper::linkToRemote('webdav');
+		$this->assertEquals('http://localhost/remote.php/webdav/', $result);
+		$result = \OC_Helper::linkToRemote('webdav', false);
+		$this->assertEquals('http://localhost/remote.php/webdav', $result);
+
+		\OC::$WEBROOT = '/owncloud';
+		$result = \OC_Helper::linkToRemote('webdav');
+		$this->assertEquals('http://localhost/owncloud/remote.php/webdav/', $result);
+		$result = \OC_Helper::linkToRemote('webdav', false);
+		$this->assertEquals('http://localhost/owncloud/remote.php/webdav', $result);
+	}
+
+	/**
+	 * @small
+	 * @brief test linkToPublic URL construction
+	 */
+	public function testLinkToPublic() {
+		\OC::$WEBROOT = '';
+		$result = \OC_Helper::linkToPublic('files');
+		$this->assertEquals('http://localhost/public.php?service=files', $result);
+		$result = \OC_Helper::linkToPublic('files', false);
+		$this->assertEquals('http://localhost/public.php?service=files', $result);
+
+		\OC::$WEBROOT = '/owncloud';
+		$result = \OC_Helper::linkToPublic('files');
+		$this->assertEquals('http://localhost/owncloud/public.php?service=files', $result);
+		$result = \OC_Helper::linkToPublic('files', false);
+		$this->assertEquals('http://localhost/owncloud/public.php?service=files', $result);
+	}
+
 }
diff --git a/tests/lib/urlgenerator.php b/tests/lib/urlgenerator.php
index 8e605d88f32f26b13f275ca1dbe39d95e709a23c..65c7fb569433d87031e7dbc7477077109de89b1c 100644
--- a/tests/lib/urlgenerator.php
+++ b/tests/lib/urlgenerator.php
@@ -8,6 +8,49 @@
 
 class Test_Urlgenerator extends PHPUnit_Framework_TestCase {
 
+	/**
+	 * @small
+	 * @brief test linkTo URL construction
+	 * @dataProvider provideDocRootAppUrlParts
+	 */
+	public function testLinkToDocRoot($app, $file, $args, $expectedResult) {
+		\OC::$WEBROOT = '';
+		$config = $this->getMock('\OCP\IConfig');
+		$urlGenerator = new \OC\URLGenerator($config);
+		$result = $urlGenerator->linkTo($app, $file, $args);
+
+		$this->assertEquals($expectedResult, $result);
+	}
+
+	/**
+	 * @small
+	 * @brief test linkTo URL construction in sub directory
+	 * @dataProvider provideSubDirAppUrlParts
+	 */
+	public function testLinkToSubDir($app, $file, $args, $expectedResult) {
+		\OC::$WEBROOT = '/owncloud';
+		$config = $this->getMock('\OCP\IConfig');
+		$urlGenerator = new \OC\URLGenerator($config);
+		$result = $urlGenerator->linkTo($app, $file, $args);
+
+		$this->assertEquals($expectedResult, $result);
+	}
+
+	public function provideDocRootAppUrlParts() {
+		return array(
+			array('files', 'index.php', array(), '/index.php/apps/files'),
+			array('files', 'index.php', array('trut' => 'trat', 'dut' => 'dat'), '/index.php/apps/files?trut=trat&dut=dat'),
+			array('', 'index.php', array('trut' => 'trat', 'dut' => 'dat'), '/index.php?trut=trat&dut=dat'),
+		);
+	}
+
+	public function provideSubDirAppUrlParts() {
+		return array(
+			array('files', 'index.php', array(), '/owncloud/index.php/apps/files'),
+			array('files', 'index.php', array('trut' => 'trat', 'dut' => 'dat'), '/owncloud/index.php/apps/files?trut=trat&dut=dat'),
+			array('', 'index.php', array('trut' => 'trat', 'dut' => 'dat'), '/owncloud/index.php?trut=trat&dut=dat'),
+		);
+	}
 
 	/**
 	 * @small