diff --git a/apps/theming/appinfo/info.xml b/apps/theming/appinfo/info.xml
index ee3126c07819b91326005a3acfc5791e1bebc7de..883dfbbb2ec6ce30aa4b755b8fa1d56cd70f6a47 100644
--- a/apps/theming/appinfo/info.xml
+++ b/apps/theming/appinfo/info.xml
@@ -5,7 +5,7 @@
 	<description>Adjust the Nextcloud theme</description>
 	<licence>AGPL</licence>
 	<author>Nextcloud</author>
-	<version>1.4.0</version>
+	<version>1.4.1</version>
 	<namespace>Theming</namespace>
 	<category>other</category>
 
diff --git a/apps/theming/lib/IconBuilder.php b/apps/theming/lib/IconBuilder.php
index 83258341985f8b3d75bc17e8e64d39b7641c8943..ad44dd7ed6c44e04eb8ab0d35551a7f75a356bae 100644
--- a/apps/theming/lib/IconBuilder.php
+++ b/apps/theming/lib/IconBuilder.php
@@ -55,14 +55,38 @@ class IconBuilder {
 	 * @return string|false image blob
 	 */
 	public function getFavicon($app) {
+		if (!$this->themingDefaults->shouldReplaceIcons()) {
+			return false;
+		}
 		try {
-			$icon = $this->renderAppIcon($app, 32);
+			$favicon = new Imagick();
+			$favicon->setFormat("ico");
+			$icon = $this->renderAppIcon($app, 128);
 			if ($icon === false) {
 				return false;
 			}
 			$icon->setImageFormat("png32");
-			$data = $icon->getImageBlob();
+
+			$clone = clone $icon;
+			$clone->scaleImage(16,0);
+			$favicon->addImage($clone);
+
+			$clone = clone $icon;
+			$clone->scaleImage(32,0);
+			$favicon->addImage($clone);
+
+			$clone = clone $icon;
+			$clone->scaleImage(64,0);
+			$favicon->addImage($clone);
+
+			$clone = clone $icon;
+			$clone->scaleImage(128,0);
+			$favicon->addImage($clone);
+
+			$data = $favicon->getImagesBlob();
+			$favicon->destroy();
 			$icon->destroy();
+			$clone->destroy();
 			return $data;
 		} catch (\ImagickException $e) {
 			return false;
diff --git a/apps/theming/tests/IconBuilderTest.php b/apps/theming/tests/IconBuilderTest.php
index f25f76a8180c9c668cb6afb65b75a953009c9281..4f5078d4c5631885f067c004f63bd6d712113b5d 100644
--- a/apps/theming/tests/IconBuilderTest.php
+++ b/apps/theming/tests/IconBuilderTest.php
@@ -71,6 +71,9 @@ class IconBuilderTest extends TestCase {
 		if (count($checkImagick->queryFormats('SVG')) < 1) {
 			$this->markTestSkipped('No SVG provider present.');
 		}
+		if (count($checkImagick->queryFormats('PNG')) < 1) {
+			$this->markTestSkipped('No PNG provider present.');
+		}
 	}
 
 	public function dataRenderAppIcon() {
@@ -146,17 +149,23 @@ class IconBuilderTest extends TestCase {
 	 */
 	public function testGetFavicon($app, $color, $file) {
 		$this->checkImagick();
+		$this->themingDefaults->expects($this->once())
+			->method('shouldReplaceIcons')
+			->willReturn(true);
 		$this->themingDefaults->expects($this->once())
 			->method('getColorPrimary')
 			->willReturn($color);
 
 		$expectedIcon = new \Imagick(realpath(dirname(__FILE__)). "/data/" . $file);
+		$actualIcon = $this->iconBuilder->getFavicon($app);
+
 		$icon = new \Imagick();
-		$icon->readImageBlob($this->iconBuilder->getFavicon($app));
+		$icon->setFormat('ico');
+		$icon->readImageBlob($actualIcon);
 
 		$this->assertEquals(true, $icon->valid());
-		$this->assertEquals(32, $icon->getImageWidth());
-		$this->assertEquals(32, $icon->getImageHeight());
+		$this->assertEquals(128, $icon->getImageWidth());
+		$this->assertEquals(128, $icon->getImageHeight());
 		$icon->destroy();
 		$expectedIcon->destroy();
 		// FIXME: We may need some comparison of the generated and the test images
@@ -167,8 +176,12 @@ class IconBuilderTest extends TestCase {
 	 * @expectedException \PHPUnit_Framework_Error_Warning
 	 */
 	public function testGetFaviconNotFound() {
+		$this->checkImagick();
 		$util = $this->getMockBuilder(Util::class)->disableOriginalConstructor()->getMock();
 		$iconBuilder = new IconBuilder($this->themingDefaults, $util);
+		$this->themingDefaults->expects($this->once())
+			->method('shouldReplaceIcons')
+			->willReturn(true);
 		$util->expects($this->once())
 			->method('getAppIcon')
 			->willReturn('notexistingfile');
@@ -179,6 +192,7 @@ class IconBuilderTest extends TestCase {
 	 * @expectedException \PHPUnit_Framework_Error_Warning
 	 */
 	public function testGetTouchIconNotFound() {
+		$this->checkImagick();
 		$util = $this->getMockBuilder(Util::class)->disableOriginalConstructor()->getMock();
 		$iconBuilder = new IconBuilder($this->themingDefaults, $util);
 		$util->expects($this->once())
@@ -191,6 +205,7 @@ class IconBuilderTest extends TestCase {
 	 * @expectedException \PHPUnit_Framework_Error_Warning
 	 */
 	public function testColorSvgNotFound() {
+		$this->checkImagick();
 		$util = $this->getMockBuilder(Util::class)->disableOriginalConstructor()->getMock();
 		$iconBuilder = new IconBuilder($this->themingDefaults, $util);
 		$util->expects($this->once())