diff --git a/apps/updatenotification/js/updatenotification.js b/apps/updatenotification/js/updatenotification.js
index def967f63e0b952f493ae062dc3af3621a5292ae..a52628078759ffe2b6dc2954e3152f4c1d1a3311 100644
Binary files a/apps/updatenotification/js/updatenotification.js and b/apps/updatenotification/js/updatenotification.js differ
diff --git a/apps/updatenotification/js/updatenotification.js.map b/apps/updatenotification/js/updatenotification.js.map
index ed234f4ec8a1c342ef586bb4a7ea0ee10fc1b255..a6171f24d16d5bf574e342ab6a2fcfbafe0bf181 100644
Binary files a/apps/updatenotification/js/updatenotification.js.map and b/apps/updatenotification/js/updatenotification.js.map differ
diff --git a/apps/updatenotification/lib/Settings/Admin.php b/apps/updatenotification/lib/Settings/Admin.php
index 571a8e9f9062b279288e0cac0f171d602745c2b8..e7a8f07a1832dd125f760fb206449d6b304efb4b 100644
--- a/apps/updatenotification/lib/Settings/Admin.php
+++ b/apps/updatenotification/lib/Settings/Admin.php
@@ -34,6 +34,7 @@ use OCP\IGroupManager;
 use OCP\IUserSession;
 use OCP\L10N\IFactory;
 use OCP\Settings\ISettings;
+use OCP\Support\Subscription\IRegistry;
 use OCP\Util;
 
 class Admin implements ISettings {
@@ -47,19 +48,23 @@ class Admin implements ISettings {
 	private $dateTimeFormatter;
 	/** @var IFactory */
 	private $l10nFactory;
+	/** @var IRegistry */
+	private $subscriptionRegistry;
 
 	public function __construct(
 		IConfig $config,
 		UpdateChecker $updateChecker,
 		IGroupManager $groupManager,
 		IDateTimeFormatter $dateTimeFormatter,
-		IFactory $l10nFactory
+		IFactory $l10nFactory,
+		IRegistry $subscriptionRegistry
 	) {
 		$this->config = $config;
 		$this->updateChecker = $updateChecker;
 		$this->groupManager = $groupManager;
 		$this->dateTimeFormatter = $dateTimeFormatter;
 		$this->l10nFactory = $l10nFactory;
+		$this->subscriptionRegistry = $subscriptionRegistry;
 	}
 
 	/**
@@ -86,6 +91,12 @@ class Admin implements ISettings {
 
 		$defaultUpdateServerURL = 'https://updates.nextcloud.com/updater_server/';
 		$updateServerURL = $this->config->getSystemValue('updater.server.url', $defaultUpdateServerURL);
+		$defaultCustomerUpdateServerURLPrefix = 'https://updates.nextcloud.com/customers/';
+
+		$isDefaultUpdateServerURL = $updateServerURL === $defaultUpdateServerURL
+			|| $updateServerURL === substr($updateServerURL, 0, strlen($defaultCustomerUpdateServerURLPrefix));
+
+		$hasValidSubscription = $this->subscriptionRegistry->delegateHasValidSubscription();
 
 		$params = [
 			'isNewVersionAvailable' => !empty($updateState['updateAvailable']),
@@ -99,9 +110,10 @@ class Admin implements ISettings {
 			'changes' => $this->filterChanges($updateState['changes'] ?? []),
 			'updaterEnabled' => empty($updateState['updaterEnabled']) ? false : $updateState['updaterEnabled'],
 			'versionIsEol' => empty($updateState['versionIsEol']) ? false : $updateState['versionIsEol'],
-			'isDefaultUpdateServerURL' => $updateServerURL === $defaultUpdateServerURL,
+			'isDefaultUpdateServerURL' => $isDefaultUpdateServerURL,
 			'updateServerURL' => $updateServerURL,
 			'notifyGroups' => $this->getSelectedGroups($notifyGroups),
+			'hasValidSubscription' => $hasValidSubscription,
 		];
 
 		$params = [
diff --git a/apps/updatenotification/src/components/root.vue b/apps/updatenotification/src/components/root.vue
index 60b631922eba91e468d9da24627674700409622d..54fc54cd2c1ff32cbd0ac04c21ad2fabddeba410 100644
--- a/apps/updatenotification/src/components/root.vue
+++ b/apps/updatenotification/src/components/root.vue
@@ -115,6 +115,7 @@
 				versionIsEol: false,
 				downloadLink: '',
 				isNewVersionAvailable: false,
+				hasValidSubscription: false,
 				updateServerURL: '',
 				changelogURL: '',
 				whatsNewData: [],
@@ -224,7 +225,7 @@
 				if(this.changelogURL) {
 					whatsNew.push({
 						href: this.changelogURL,
-						text: t('updatenotificaiton', 'View changelog'),
+						text: t('updatenotification', 'View changelog'),
 						icon: 'icon-link',
 						target: '_blank',
 						action: ''
@@ -237,7 +238,16 @@
 				let channelList = [];
 
 				channelList.push({
-					text: t('updatenotificaiton', 'Stable'),
+					text: t('updatenotification', 'Enterprise'),
+					longtext: t('updatenotification', 'For enterprise use. Provides always the latest patch level, but will not update to the next major release immediately. That update happens once Nextcloud GmbH has done additional hardening and testing for large-scale and mission-critical deployments. This channel is only available to customers and provides the Nextcloud Enterprise package.'),
+					icon: 'icon-star',
+					active: this.currentChannel === 'enterprise',
+					disabled: !this.hasValidSubscription,
+					action: this.changeReleaseChannelToEnterprise
+				});
+
+				channelList.push({
+					text: t('updatenotification', 'Stable'),
 					longtext: t('updatenotification', 'The most recent stable version. It is suited for regular use and will always update to the latest major version.'),
 					icon: 'icon-checkmark',
 					active: this.currentChannel === 'stable',
@@ -245,15 +255,7 @@
 				});
 
 				channelList.push({
-					text: t('updatenotificaiton', 'Production'),
-					longtext: t('updatenotification', 'Will always provide the latest patch level, but not update to the next major release immediately. That update usually happens with the second minor release (x.0.2) and only if the instance is already on the latest minor version.'),
-					icon: 'icon-star',
-					active: this.currentChannel === 'production',
-					action: this.changeReleaseChannelToProduction
-				});
-
-				channelList.push({
-					text: t('updatenotificaiton', 'Beta'),
+					text: t('updatenotification', 'Beta'),
 					longtext: t('updatenotification', 'A pre-release version only for testing new features, not for production environments.'),
 					icon: 'icon-category-customization',
 					active: this.currentChannel === 'beta',
@@ -272,19 +274,19 @@
 			},
 
 			isNonDefaultChannel: function() {
-				return this.currentChannel !== 'production' && this.currentChannel !== 'stable' && this.currentChannel !== 'beta';
+				return this.currentChannel !== 'enterprise' && this.currentChannel !== 'stable' && this.currentChannel !== 'beta';
 			},
 
 			localizedChannelName: function() {
 				switch (this.currentChannel) {
-					case 'production':
-						return t('updatenotificaiton', 'Production');
+					case 'enterprise':
+						return t('updatenotification', 'Enterprise');
 						break;
 					case 'stable':
-						return t('updatenotificaiton', 'Stable');
+						return t('updatenotification', 'Stable');
 						break;
 					case 'beta':
-						return t('updatenotificaiton', 'Beta');
+						return t('updatenotification', 'Beta');
 						break;
 					default:
 						return this.currentChannel;
@@ -317,12 +319,12 @@
 					form.submit();
 				}.bind(this));
 			},
+			changeReleaseChannelToEnterprise: function() {
+				this.changeReleaseChannel('enterprise')
+			},
 			changeReleaseChannelToStable: function() {
 				this.changeReleaseChannel('stable')
 			},
-			changeReleaseChannelToProduction: function() {
-				this.changeReleaseChannel('production')
-			},
 			changeReleaseChannelToBeta: function() {
 				this.changeReleaseChannel('beta')
 			},
@@ -375,6 +377,7 @@
 			this.notifyGroups = data.notifyGroups;
 			this.isDefaultUpdateServerURL = data.isDefaultUpdateServerURL;
 			this.versionIsEol = data.versionIsEol;
+			this.hasValidSubscription = data.hasValidSubscription;
 			if(data.changes && data.changes.changelogURL) {
 				this.changelogURL = data.changes.changelogURL;
 			}
diff --git a/apps/updatenotification/tests/Settings/AdminTest.php b/apps/updatenotification/tests/Settings/AdminTest.php
index 9d40cb4d292796f2e708ff3d45b0fbc715be514a..d2d4b503bad2f4301db3670781151ebe1daccba9 100644
--- a/apps/updatenotification/tests/Settings/AdminTest.php
+++ b/apps/updatenotification/tests/Settings/AdminTest.php
@@ -35,6 +35,7 @@ use OCP\IGroupManager;
 use OCP\IUserSession;
 use OCP\L10N\IFactory;
 use OCP\L10N\ILanguageIterator;
+use OCP\Support\Subscription\IRegistry;
 use OCP\Util;
 use Test\TestCase;
 
@@ -51,6 +52,8 @@ class AdminTest extends TestCase {
 	private $groupManager;
 	/** @var IDateTimeFormatter|\PHPUnit_Framework_MockObject_MockObject */
 	private $dateTimeFormatter;
+	/** @var IRegistry|\PHPUnit_Framework_MockObject_MockObject */
+	private $subscriptionRegistry;
 
 	public function setUp() {
 		parent::setUp();
@@ -60,9 +63,10 @@ class AdminTest extends TestCase {
 		$this->groupManager = $this->createMock(IGroupManager::class);
 		$this->dateTimeFormatter = $this->createMock(IDateTimeFormatter::class);
 		$this->l10nFactory = $this->createMock(IFactory::class);
+		$this->subscriptionRegistry = $this->createMock(IRegistry::class);
 
 		$this->admin = new Admin(
-			$this->config, $this->updateChecker, $this->groupManager, $this->dateTimeFormatter, $this->l10nFactory
+			$this->config, $this->updateChecker, $this->groupManager, $this->dateTimeFormatter, $this->l10nFactory, $this->subscriptionRegistry
 		);
 	}
 
@@ -120,6 +124,11 @@ class AdminTest extends TestCase {
 			->with('admin')
 			->willReturn($group);
 
+		$this->subscriptionRegistry
+			->expects($this->once())
+			->method('delegateHasValidSubscription')
+			->willReturn(true);
+
 		$params = [
 			'json' => json_encode([
 				'isNewVersionAvailable' => true,
@@ -138,6 +147,7 @@ class AdminTest extends TestCase {
 				'notifyGroups' => [
 					['value' => 'admin', 'label' => 'Administrators'],
 				],
+				'hasValidSubscription' => true,
 			]),
 		];
 
diff --git a/config/config.sample.php b/config/config.sample.php
index 36429492bf686de9c73a366362c2cf097a1cf6c3..f939fc371b70f6276aa57e58b263cb2a30b5ebeb 100644
--- a/config/config.sample.php
+++ b/config/config.sample.php
@@ -653,7 +653,6 @@ $CONFIG = array(
  *   - ``daily``
  *   - ``beta``
  *   - ``stable``
- *   - ``production``
  */
 'updater.release.channel' => 'stable',
 
diff --git a/lib/composer/composer/autoload_classmap.php b/lib/composer/composer/autoload_classmap.php
index ca73591d0032c29a6f37b78ca59851f9058ac570..b7af5b381935336c36eea25175d9975b629fffc0 100644
--- a/lib/composer/composer/autoload_classmap.php
+++ b/lib/composer/composer/autoload_classmap.php
@@ -1065,6 +1065,7 @@ return array(
     'OC\\Repair\\NC16\\AddClenupLoginFlowV2BackgroundJob' => $baseDir . '/lib/private/Repair/NC16/AddClenupLoginFlowV2BackgroundJob.php',
     'OC\\Repair\\NC16\\CleanupCardDAVPhotoCache' => $baseDir . '/lib/private/Repair/NC16/CleanupCardDAVPhotoCache.php',
     'OC\\Repair\\NC16\\RemoveCypressFiles' => $baseDir . '/lib/private/Repair/NC16/RemoveCypressFiles.php',
+    'OC\\Repair\\NC17\\SwitchUpdateChannel' => $baseDir . '/lib/private/Repair/NC17/SwitchUpdateChannel.php',
     'OC\\Repair\\OldGroupMembershipShares' => $baseDir . '/lib/private/Repair/OldGroupMembershipShares.php',
     'OC\\Repair\\Owncloud\\DropAccountTermsTable' => $baseDir . '/lib/private/Repair/Owncloud/DropAccountTermsTable.php',
     'OC\\Repair\\Owncloud\\SaveAccountsTableData' => $baseDir . '/lib/private/Repair/Owncloud/SaveAccountsTableData.php',
diff --git a/lib/composer/composer/autoload_static.php b/lib/composer/composer/autoload_static.php
index c8c8075ce1a39c3a356e7a2b54527076443a5f69..5aa6af069700a005d6a01262f3d124adce8e111e 100644
--- a/lib/composer/composer/autoload_static.php
+++ b/lib/composer/composer/autoload_static.php
@@ -1099,6 +1099,7 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c
         'OC\\Repair\\NC16\\AddClenupLoginFlowV2BackgroundJob' => __DIR__ . '/../../..' . '/lib/private/Repair/NC16/AddClenupLoginFlowV2BackgroundJob.php',
         'OC\\Repair\\NC16\\CleanupCardDAVPhotoCache' => __DIR__ . '/../../..' . '/lib/private/Repair/NC16/CleanupCardDAVPhotoCache.php',
         'OC\\Repair\\NC16\\RemoveCypressFiles' => __DIR__ . '/../../..' . '/lib/private/Repair/NC16/RemoveCypressFiles.php',
+        'OC\\Repair\\NC17\\SwitchUpdateChannel' => __DIR__ . '/../../..' . '/lib/private/Repair/NC17/SwitchUpdateChannel.php',
         'OC\\Repair\\OldGroupMembershipShares' => __DIR__ . '/../../..' . '/lib/private/Repair/OldGroupMembershipShares.php',
         'OC\\Repair\\Owncloud\\DropAccountTermsTable' => __DIR__ . '/../../..' . '/lib/private/Repair/Owncloud/DropAccountTermsTable.php',
         'OC\\Repair\\Owncloud\\SaveAccountsTableData' => __DIR__ . '/../../..' . '/lib/private/Repair/Owncloud/SaveAccountsTableData.php',
diff --git a/lib/private/Repair.php b/lib/private/Repair.php
index 4fbc89835cc8a2d5f038598101c43f8b1461965c..bd2fc081131564f6fe312c3e2d2e7c6b669fa98d 100644
--- a/lib/private/Repair.php
+++ b/lib/private/Repair.php
@@ -43,6 +43,7 @@ use OC\Repair\NC14\AddPreviewBackgroundCleanupJob;
 use OC\Repair\NC16\AddClenupLoginFlowV2BackgroundJob;
 use OC\Repair\NC16\CleanupCardDAVPhotoCache;
 use OC\Repair\NC16\RemoveCypressFiles;
+use OC\Repair\NC17\SwitchUpdateChannel;
 use OC\Repair\OldGroupMembershipShares;
 use OC\Repair\Owncloud\DropAccountTermsTable;
 use OC\Repair\Owncloud\SaveAccountsTableData;
@@ -149,6 +150,7 @@ class Repair implements IOutput {
 			new AddClenupLoginFlowV2BackgroundJob(\OC::$server->getJobList()),
 			new RemoveLinkShares(\OC::$server->getDatabaseConnection(), \OC::$server->getConfig(), \OC::$server->getGroupManager(), \OC::$server->getNotificationManager(), \OC::$server->query(ITimeFactory::class)),
 			\OC::$server->query(RemoveCypressFiles::class),
+			\OC::$server->query(SwitchUpdateChannel::class),
 		];
 	}
 
diff --git a/lib/private/Repair/NC17/SwitchUpdateChannel.php b/lib/private/Repair/NC17/SwitchUpdateChannel.php
new file mode 100644
index 0000000000000000000000000000000000000000..cfa72d86b1e6c486f978b2e8ed3856e1d5de7716
--- /dev/null
+++ b/lib/private/Repair/NC17/SwitchUpdateChannel.php
@@ -0,0 +1,60 @@
+<?php
+declare(strict_types=1);
+/**
+ * @copyright Copyright (c) 2019, Morris Jobke <hey@morrisjobke.de>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OC\Repair\NC17;
+
+use OCP\IConfig;
+use OCP\Migration\IOutput;
+use OCP\Migration\IRepairStep;
+use OCP\Support\Subscription\IRegistry;
+/**
+ * @deprecated - can be removed in 18
+ */
+class SwitchUpdateChannel implements IRepairStep {
+
+	/** @var IConfig */
+	private $config;
+
+	/** @var IRegistry */
+	private $subscriptionRegistry;
+
+	public function __construct(IConfig $config, IRegistry $subscriptionRegistry) {
+		$this->config = $config;
+		$this->subscriptionRegistry = $subscriptionRegistry;
+	}
+
+	public function getName(): string {
+		return 'Switches from deprecated "production" to "stable" update channel';
+	}
+
+	public function run(IOutput $output): void {
+		$currentChannel = $this->config->getSystemValue('updater.release.channel', 'stable');
+
+		if ($currentChannel === 'production') {
+			if ($this->subscriptionRegistry->delegateHasValidSubscription()) {
+				$this->config->setSystemValue('updater.release.channel', 'enterprise');
+			} else {
+				$this->config->setSystemValue('updater.release.channel', 'stable');
+			}
+		}
+	}
+}