diff --git a/lib/private/installer.php b/lib/private/installer.php
index 36fda28cd27ae5a5833d01a4f288f7dfbd6292f3..c026383e26e3d0cb92402d78952d691cc7660fa0 100644
--- a/lib/private/installer.php
+++ b/lib/private/installer.php
@@ -526,8 +526,12 @@ class OC_Installer{
 	 * Installs shipped apps
 	 *
 	 * This function installs all apps found in the 'apps' directory that should be enabled by default;
+	 * @param bool $softErrors When updating we ignore errors and simply log them, better to have a
+	 *                         working ownCloud at the end instead of an aborted update.
+	 * @return array Array of error messages (appid => Exception)
 	 */
-	public static function installShippedApps() {
+	public static function installShippedApps($softErrors = false) {
+		$errors = [];
 		foreach(OC::$APPSROOTS as $app_dir) {
 			if($dir = opendir( $app_dir['path'] )) {
 				while( false !== ( $filename = readdir( $dir ))) {
@@ -538,7 +542,16 @@ class OC_Installer{
 								$enabled = isset($info['default_enable']);
 								if (($enabled || in_array($filename, \OC::$server->getAppManager()->getAlwaysEnabledApps()))
 									  && \OC::$server->getConfig()->getAppValue($filename, 'enabled') !== 'no') {
-									OC_Installer::installShippedApp($filename);
+									if ($softErrors) {
+										try {
+											OC_Installer::installShippedApp($filename);
+										} catch (\Doctrine\DBAL\Exception\TableExistsException $e) {
+											$errors[$filename] = $e;
+											continue;
+										}
+									} else {
+										OC_Installer::installShippedApp($filename);
+									}
 									\OC::$server->getConfig()->setAppValue($filename, 'enabled', 'yes');
 								}
 							}
@@ -548,6 +561,8 @@ class OC_Installer{
 				closedir( $dir );
 			}
 		}
+
+		return $errors;
 	}
 
 	/**
diff --git a/lib/private/updater.php b/lib/private/updater.php
index 4f74481562b9c011c468537d3c87e8ee9370b862..0d567b8dfb93d345f695e6c84b77a2ef1198740a 100644
--- a/lib/private/updater.php
+++ b/lib/private/updater.php
@@ -333,7 +333,12 @@ class Updater extends BasicEmitter {
 
 			// install new shipped apps on upgrade
 			OC_App::loadApps('authentication');
-			OC_Installer::installShippedApps();
+			$errors = OC_Installer::installShippedApps(true);
+			foreach ($errors as $appId => $exception) {
+				/** @var \Exception $exception */
+				$this->log->logException($exception, ['app' => $appId]);
+				$this->emit('\OC\Updater', 'failure', [$appId . ': ' . $exception->getMessage()]);
+			}
 
 			// post-upgrade repairs
 			$repair = new Repair(Repair::getRepairSteps());