diff --git a/core/lib/Drupal/Core/Extension/module.api.php b/core/lib/Drupal/Core/Extension/module.api.php
index 9b62c48a99e66cfab04aa9163fa49c070747c8b2..65e912ba5640d5b38a7eaadaac1e6d49b9fac76a 100644
--- a/core/lib/Drupal/Core/Extension/module.api.php
+++ b/core/lib/Drupal/Core/Extension/module.api.php
@@ -986,7 +986,7 @@ function hook_update_last_removed() {
  *
  * Drupal\Core\Updater\Updater is a class that knows how to update various parts
  * of the Drupal file system, for example to update modules that have newer
- * releases, or to install a new theme.
+ * releases.
  *
  * @return array
  *   An associative array of information about the updater(s) being provided.
@@ -1026,8 +1026,7 @@ function hook_updater_info() {
  * Alter the Updater information array.
  *
  * An Updater is a class that knows how to update various parts of the Drupal
- * file system, for example to update modules that have newer releases, or to
- * install a new theme.
+ * file system, for example to update modules that have newer releases.
  *
  * @param array $updaters
  *   Associative array of updaters as defined through hook_updater_info().
diff --git a/core/lib/Drupal/Core/Updater/Module.php b/core/lib/Drupal/Core/Updater/Module.php
index 0ca78b550d2f697897fcc8b4b1d6fcb352542cd5..a2487eb724824f908f66c7e1d7438d7e822609af 100644
--- a/core/lib/Drupal/Core/Updater/Module.php
+++ b/core/lib/Drupal/Core/Updater/Module.php
@@ -124,10 +124,6 @@ public function postInstallTasks() {
       ],
     ];
     return [
-      $default_options + [
-        '#url' => Url::fromRoute('update.module_install'),
-        '#title' => t('Add another module'),
-      ],
       $default_options + [
         '#url' => Url::fromRoute('system.modules_list'),
         '#title' => t('Install newly added modules'),
diff --git a/core/modules/system/system.module b/core/modules/system/system.module
index 2de128319862300a4c38d0e8ea583fbc975b58af..12ee47ed05cc08c142e0c1c3e8487ceab0da0747 100644
--- a/core/modules/system/system.module
+++ b/core/modules/system/system.module
@@ -128,7 +128,7 @@ function system_help($route_name, RouteMatchInterface $route_match) {
     case 'system.modules_list':
       $output = '<p>' . t('Add <a href=":modules">contributed modules</a> to extend your site\'s functionality.', [':modules' => 'https://www.drupal.org/project/modules']) . '</p>';
       if (!\Drupal::moduleHandler()->moduleExists('update')) {
-        $output .= '<p>' . t('Regularly review available updates and update as required to maintain a secure and current site. Always run the <a href=":update-php">update script</a> each time a module is updated. Install the <a href=":update-manager">Update Manager module</a> to update and add modules and themes.', [':update-php' => Url::fromRoute('system.db_update')->toString(), ':update-manager' => Url::fromRoute('system.modules_list', [], ['fragment' => 'module-update'])->toString()]) . '</p>';
+        $output .= '<p>' . t('Regularly review available updates and update as required to maintain a secure and current site. Always run the <a href=":update-php">update script</a> each time a module is updated. Install the <a href=":update-manager">Update Manager module</a> to update modules and themes.', [':update-php' => Url::fromRoute('system.db_update')->toString(), ':update-manager' => Url::fromRoute('system.modules_list', [], ['fragment' => 'module-update'])->toString()]) . '</p>';
       }
       return $output;
 
@@ -442,11 +442,11 @@ function template_preprocess_entity_add_list(&$variables) {
  *   system_authorized_init($callback, $file, $arguments, $page_title);
  *   return new RedirectResponse(system_authorized_get_url()->toString());
  * @endcode
- * Example (update_manager_install_form_submit()):
+ * Example (Drupal\update\Form\UpdateReady::submitForm()):
  * @code
- *  system_authorized_init('update_authorize_run_install',
- *    \Drupal::service('extension.list.module')->getPath('update') . '/update.authorize.inc',
- *    $arguments, t('Update manager'));
+ *  system_authorized_init('update_authorize_run_update',
+ *    __DIR__ . '/../../update.authorize.inc',
+ *    [$updates], $this->t('Update manager'));
  *  $form_state->setRedirectUrl(system_authorized_get_url());
  * @endcode
  *
diff --git a/core/modules/update/src/Form/UpdateManagerInstall.php b/core/modules/update/src/Form/UpdateManagerInstall.php
index bb851ddebd4997c6d1b5ab88e80a585ad23ae72e..bb9b975ca8de7ae5fa1eb3335a70527db403fcfc 100644
--- a/core/modules/update/src/Form/UpdateManagerInstall.php
+++ b/core/modules/update/src/Form/UpdateManagerInstall.php
@@ -15,6 +15,10 @@
 /**
  * Configure update settings for this site.
  *
+ * @deprecated in drupal:10.4.0 and is removed from drupal:11.1.0. There is no replacement.
+ *
+ * @see https://www.drupal.org/node/3461934
+ *
  * @internal
  */
 class UpdateManagerInstall extends FormBase {
@@ -60,6 +64,7 @@ class UpdateManagerInstall extends FormBase {
    *   The archiver plugin manager service.
    */
   public function __construct($root, ModuleHandlerInterface $module_handler, $site_path, ArchiverManager $archiver_manager) {
+    @trigger_error('The UpdateManagerInstall form is deprecated in drupal:10.4.0 and will be removed in drupal:11.1.0. There is no replacement. See https://www.drupal.org/node/3461934');
     $this->root = $root;
     $this->moduleHandler = $module_handler;
     $this->sitePath = $site_path;
diff --git a/core/modules/update/src/Routing/UpdateRouteSubscriber.php b/core/modules/update/src/Routing/UpdateRouteSubscriber.php
index 9bffe435f080380547e76887151859e2097d645a..57ff5f456116fea1f1b7312c2116cf976fbab708 100644
--- a/core/modules/update/src/Routing/UpdateRouteSubscriber.php
+++ b/core/modules/update/src/Routing/UpdateRouteSubscriber.php
@@ -29,11 +29,8 @@ protected function alterRoutes(RouteCollection $collection) {
       return;
     }
     $routes = [
-      'update.report_install',
       'update.report_update',
-      'update.module_install',
       'update.module_update',
-      'update.theme_install',
       'update.theme_update',
       'update.confirmation_page',
     ];
diff --git a/core/modules/update/src/UpdateManager.php b/core/modules/update/src/UpdateManager.php
index 325bbc928c0a9ded9e4c0eb0cad10c46616def6d..19335e128558d86ed0ba4da5af1e2b41f72def40 100644
--- a/core/modules/update/src/UpdateManager.php
+++ b/core/modules/update/src/UpdateManager.php
@@ -182,10 +182,8 @@ public function projectStorage($key) {
       'system.modules_list',
       'system.theme_install',
       'update.module_update',
-      'update.module_install',
       'update.status',
       'update.report_update',
-      'update.report_install',
       'update.settings',
       'system.status',
       'update.manual_status',
diff --git a/core/modules/update/tests/src/Functional/FileTransferAuthorizeFormTest.php b/core/modules/update/tests/src/Functional/FileTransferAuthorizeFormTest.php
deleted file mode 100644
index 57cf354141445967555838f5fafd6c8a7327e824..0000000000000000000000000000000000000000
--- a/core/modules/update/tests/src/Functional/FileTransferAuthorizeFormTest.php
+++ /dev/null
@@ -1,87 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Drupal\Tests\update\Functional;
-
-/**
- * Tests the Update Manager module upload via authorize.php functionality.
- *
- * @group update
- */
-class FileTransferAuthorizeFormTest extends UpdateUploaderTestBase {
-
-  /**
-   * {@inheritdoc}
-   */
-  protected $defaultTheme = 'stark';
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function setUp(): void {
-    parent::setUp();
-    $admin_user = $this->drupalCreateUser([
-      'administer modules',
-      'administer software updates',
-    ]);
-    $this->drupalLogin($admin_user);
-
-    // Create a local cache so the module is not downloaded from drupal.org.
-    $cache_directory = _update_manager_cache_directory(TRUE);
-    foreach (['.tar.gz', '.zip'] as $extension) {
-      $filename = 'update_test_new_module' . $extension;
-      copy(
-        __DIR__ . '/../../update_test_new_module/8.x-1.0/' . $filename,
-        $cache_directory . '/' . $filename
-      );
-    }
-  }
-
-  /**
-   * Tests the Update Manager module upload via authorize.php functionality.
-   *
-   * @dataProvider archiveFileUrlProvider
-   */
-  public function testViaAuthorize($url): void {
-    // Ensure the that we can select which file transfer backend to use.
-    \Drupal::state()->set('test_uploaders_via_prompt', TRUE);
-
-    // Ensure the module does not already exist.
-    $this->drupalGet('admin/modules');
-    $this->assertSession()->pageTextNotContains('Update test new module');
-
-    $edit = [
-      'project_url' => $url,
-    ];
-    $this->drupalGet('admin/modules/install');
-    $this->submitForm($edit, 'Continue');
-    $edit = [
-      'connection_settings[authorize_filetransfer_default]' => 'system_test',
-      'connection_settings[system_test][update_test_username]' => $this->randomMachineName(),
-    ];
-    $this->submitForm($edit, 'Continue');
-    $this->assertSession()->pageTextContains('Files were added successfully.');
-
-    // Ensure the module is available to install.
-    $this->drupalGet('admin/modules');
-    $this->assertSession()->pageTextContains('Update test new module');
-  }
-
-  /**
-   * Data provider method for testViaAuthorize().
-   *
-   * Each of these release URLs has been cached in the setUp() method.
-   */
-  public static function archiveFileUrlProvider() {
-    return [
-      'tar.gz' => [
-        'url' => 'https://ftp.drupal.org/files/projects/update_test_new_module.tar.gz',
-      ],
-      'zip' => [
-        'url' => 'https://ftp.drupal.org/files/projects/update_test_new_module.zip',
-      ],
-    ];
-  }
-
-}
diff --git a/core/modules/update/tests/src/Functional/UpdateMiscTest.php b/core/modules/update/tests/src/Functional/UpdateMiscTest.php
index 13ffa7896b95692c44c02e8032a718673587fd86..423debe8439ce66dec6fbe7e8f44653ae25a94c5 100644
--- a/core/modules/update/tests/src/Functional/UpdateMiscTest.php
+++ b/core/modules/update/tests/src/Functional/UpdateMiscTest.php
@@ -37,32 +37,6 @@ protected function setUp(): void {
       ],
     ];
     $this->config('update_test.settings')->set('system_info', $setting)->save();
-    $this->drupalPlaceBlock('local_actions_block');
-  }
-
-  /**
-   * Ensures that the local actions appear.
-   */
-  public function testLocalActions(): void {
-    $admin_user = $this->drupalCreateUser([
-      'administer site configuration',
-      'administer modules',
-      'administer software updates',
-      'administer themes',
-    ]);
-    $this->drupalLogin($admin_user);
-
-    $this->drupalGet('admin/modules');
-    $this->clickLink('Add new module');
-    $this->assertSession()->addressEquals('admin/modules/install');
-
-    $this->drupalGet('admin/appearance');
-    $this->clickLink('Add new theme');
-    $this->assertSession()->addressEquals('admin/theme/install');
-
-    $this->drupalGet('admin/reports/updates');
-    $this->clickLink('Add new module or theme');
-    $this->assertSession()->addressEquals('admin/reports/updates/install');
   }
 
   /**
diff --git a/core/modules/update/tests/src/Functional/UpdateUploadTest.php b/core/modules/update/tests/src/Functional/UpdateUploadTest.php
deleted file mode 100644
index c6ef142401537e8988502c4413a38fd8b7cde611..0000000000000000000000000000000000000000
--- a/core/modules/update/tests/src/Functional/UpdateUploadTest.php
+++ /dev/null
@@ -1,211 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Drupal\Tests\update\Functional;
-
-use Drupal\Core\Extension\InfoParserDynamic;
-use Drupal\Core\Updater\Updater;
-use Drupal\Core\Url;
-use Drupal\Tests\TestFileCreationTrait;
-
-/**
- * Tests the Update Manager module's upload and extraction functionality.
- *
- * @group update
- */
-class UpdateUploadTest extends UpdateUploaderTestBase {
-
-  use TestFileCreationTrait {
-    getTestFiles as drupalGetTestFiles;
-  }
-
-  /**
-   * Modules to enable.
-   *
-   * @var array
-   */
-  protected static $modules = ['file'];
-
-  /**
-   * {@inheritdoc}
-   */
-  protected $defaultTheme = 'stark';
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function setUp(): void {
-    parent::setUp();
-    $admin_user = $this->drupalCreateUser([
-      'administer modules',
-      'administer software updates',
-      'administer site configuration',
-    ]);
-    $this->drupalLogin($admin_user);
-  }
-
-  /**
-   * Tests upload, extraction, and update of a module.
-   */
-  public function testUploadModule(): void {
-    // Ensure that the update information is correct before testing.
-    update_get_available(TRUE);
-
-    // Images are not valid archives, so get one and try to install it. We
-    // need an extra variable to store the result of drupalGetTestFiles()
-    // since reset() takes an argument by reference and passing in a constant
-    // emits a notice in strict mode.
-    $imageTestFiles = $this->drupalGetTestFiles('image');
-    $invalidArchiveFile = reset($imageTestFiles);
-    $edit = [
-      'files[project_upload]' => $invalidArchiveFile->uri,
-    ];
-    // This also checks that the correct archive extensions are allowed.
-    $this->drupalGet('admin/modules/install');
-    $this->submitForm($edit, 'Continue');
-    $extensions = \Drupal::service('plugin.manager.archiver')->getExtensions();
-    $this->assertSession()->pageTextContains("Only files with the following extensions are allowed: $extensions.");
-    $this->assertSession()->addressEquals('admin/modules/install');
-
-    // Check to ensure an existing module can't be reinstalled. Also checks that
-    // the archive was extracted since we can't know if the module is already
-    // installed until after extraction.
-    $validArchiveFile = __DIR__ . '/../../aaa_update_test.tar.gz';
-    $edit = [
-      'files[project_upload]' => $validArchiveFile,
-    ];
-    $this->drupalGet('admin/modules/install');
-    $this->submitForm($edit, 'Continue');
-    $this->assertSession()->pageTextContains('AAA Update test is already present.');
-    $this->assertSession()->addressEquals('admin/modules/install');
-
-    // Ensure that a new module can be extracted and installed.
-    $updaters = drupal_get_updaters();
-    $moduleUpdater = $updaters['module']['class'];
-    $installedInfoFilePath = $this->container->get('update.root') . '/' . $moduleUpdater::getRootDirectoryRelativePath() . '/update_test_new_module/update_test_new_module.info.yml';
-    $this->assertFileDoesNotExist($installedInfoFilePath);
-    $validArchiveFile = __DIR__ . '/../../update_test_new_module/8.x-1.0/update_test_new_module.tar.gz';
-    $edit = [
-      'files[project_upload]' => $validArchiveFile,
-    ];
-    $this->drupalGet('admin/modules/install');
-    $this->submitForm($edit, 'Continue');
-    // Check that submitting the form takes the user to authorize.php.
-    $this->assertSession()->addressEquals('core/authorize.php');
-    $this->assertSession()->titleEquals('Update manager | Drupal');
-    // Check for a success message on the page, and check that the installed
-    // module now exists in the expected place in the filesystem.
-    $this->assertSession()->pageTextContains("Added / updated update_test_new_module successfully");
-    $this->assertFileExists($installedInfoFilePath);
-    // Ensure the links are relative to the site root and not
-    // core/authorize.php.
-    $this->assertSession()->linkExists('Add another module');
-    $this->assertSession()->linkByHrefExists(Url::fromRoute('update.module_install')->toString());
-    $this->assertSession()->linkExists('Install newly added modules');
-    $this->assertSession()->linkByHrefExists(Url::fromRoute('system.modules_list')->toString());
-    $this->assertSession()->linkExists('Administration pages');
-    $this->assertSession()->linkByHrefExists(Url::fromRoute('system.admin')->toString());
-    // Ensure we can reach the "Add another module" link.
-    $this->clickLink('Add another module');
-    $this->assertSession()->statusCodeEquals(200);
-    $this->assertSession()->addressEquals('admin/modules/install');
-
-    // Check that the module has the correct version before trying to update
-    // it. Since the module is installed in sites/simpletest, which only the
-    // child site has access to, standard module API functions won't find it
-    // when called here. To get the version, the info file must be parsed
-    // directly instead.
-    $info_parser = new InfoParserDynamic(DRUPAL_ROOT);
-    $info = $info_parser->parse($installedInfoFilePath);
-    $this->assertEquals('8.x-1.0', $info['version']);
-
-    // Install the module.
-    $this->drupalGet('admin/modules');
-    $this->submitForm(['modules[update_test_new_module][enable]' => TRUE], 'Install');
-
-    // Define the update XML such that the new module downloaded above needs an
-    // update from 8.x-1.0 to 8.x-1.1.
-    $this->mockInstalledExtensionsInfo([
-      'update_test_new_module' => [
-        'project' => 'update_test_new_module',
-      ],
-    ]);
-    $xml_mapping = [
-      'update_test_new_module' => '1_1',
-    ];
-    $this->refreshUpdateStatus($xml_mapping);
-
-    // Run the updates for the new module.
-    $this->drupalGet('admin/reports/updates/update');
-    $this->submitForm(['projects[update_test_new_module]' => TRUE], 'Download these updates');
-    $this->submitForm(['maintenance_mode' => FALSE], 'Continue');
-    $this->assertSession()->pageTextContains('Update was completed successfully.');
-    $this->assertSession()->pageTextContains("Added / updated update_test_new_module successfully");
-
-    // Parse the info file again to check that the module has been updated to
-    // 8.x-1.1.
-    $info = $info_parser->parse($installedInfoFilePath);
-    $this->assertEquals('8.x-1.1', $info['version']);
-  }
-
-  /**
-   * Ensures that archiver extensions are properly merged in the UI.
-   */
-  public function testFileNameExtensionMerging(): void {
-    $this->drupalGet('admin/modules/install');
-    // Make sure the bogus extension supported by update_test.module is there.
-    $this->assertSession()->responseMatches('/file extensions are supported:.*update-test-extension/');
-    // Make sure it didn't clobber the first option from core.
-    $this->assertSession()->responseMatches('/file extensions are supported:.*tar/');
-  }
-
-  /**
-   * Checks the messages on update manager pages when missing a security update.
-   */
-  public function testUpdateManagerCoreSecurityUpdateMessages(): void {
-    $this->mockDefaultExtensionsInfo(['version' => '8.0.0']);
-    $this->mockReleaseHistory(['drupal' => '0.2-sec']);
-    $this->config('update.settings')
-      ->set('fetch.url', Url::fromRoute('update_test.update_test')->setAbsolute()->toString())
-      ->save();
-    // Initialize the update status.
-    $this->drupalGet('admin/reports/updates');
-
-    // Now, make sure none of the Update manager pages have duplicate messages
-    // about core missing a security update.
-
-    $this->drupalGet('admin/modules/install');
-    $this->assertSession()->pageTextNotContains('There is a security update available for your version of Drupal.');
-
-    $this->drupalGet('admin/modules/update');
-    $this->assertSession()->pageTextNotContains('There is a security update available for your version of Drupal.');
-
-    $this->drupalGet('admin/appearance/install');
-    $this->assertSession()->pageTextNotContains('There is a security update available for your version of Drupal.');
-
-    $this->drupalGet('admin/appearance/update');
-    $this->assertSession()->pageTextNotContains('There is a security update available for your version of Drupal.');
-
-    $this->drupalGet('admin/reports/updates/install');
-    $this->assertSession()->pageTextNotContains('There is a security update available for your version of Drupal.');
-
-    $this->drupalGet('admin/reports/updates/update');
-    $this->assertSession()->pageTextNotContains('There is a security update available for your version of Drupal.');
-
-    $this->drupalGet('admin/update/ready');
-    $this->assertSession()->pageTextNotContains('There is a security update available for your version of Drupal.');
-  }
-
-  /**
-   * Tests only an *.info.yml file are detected without supporting files.
-   */
-  public function testUpdateDirectory(): void {
-    $type = Updater::getUpdaterFromDirectory($this->root . '/core/modules/update/tests/modules/aaa_update_test');
-    $this->assertEquals('Drupal\\Core\\Updater\\Module', $type, 'Detected a Module');
-
-    $type = Updater::getUpdaterFromDirectory($this->root . '/core/modules/update/tests/themes/update_test_basetheme');
-    $this->assertEquals('Drupal\\Core\\Updater\\Theme', $type, 'Detected a Theme.');
-  }
-
-}
diff --git a/core/modules/update/tests/src/Functional/UpdateUploaderTestBase.php b/core/modules/update/tests/src/Functional/UpdateUploaderTestBase.php
deleted file mode 100644
index 07a84934c15dd98131bf831e92a3e3492f81b963..0000000000000000000000000000000000000000
--- a/core/modules/update/tests/src/Functional/UpdateUploaderTestBase.php
+++ /dev/null
@@ -1,39 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Drupal\Tests\update\Functional;
-
-use Drupal\Core\DrupalKernel;
-
-/**
- * Base test class for tests that test project upload functionality.
- */
-abstract class UpdateUploaderTestBase extends UpdateTestBase {
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function setUp(): void {
-    parent::setUp();
-
-    // Change the root path which Update Manager uses to install and update
-    // projects to be inside the testing site directory. See
-    // \Drupal\update\UpdateRootFactory::get() for equivalent changes to the
-    // test child site.
-    $request = \Drupal::request();
-    $update_root = $this->container->get('update.root') . '/' . DrupalKernel::findSitePath($request);
-    $this->container->get('update.root')->set($update_root);
-
-    // Create the directories within the root path within which the Update
-    // Manager will install projects.
-    foreach (drupal_get_updaters() as $updater_info) {
-      $updater = $updater_info['class'];
-      $install_directory = $update_root . '/' . $updater::getRootDirectoryRelativePath();
-      if (!is_dir($install_directory)) {
-        mkdir($install_directory);
-      }
-    }
-  }
-
-}
diff --git a/core/modules/update/update.authorize.inc b/core/modules/update/update.authorize.inc
index 742a3f159e16d2321fa071255b5e7218a74ac804..57539f4f160d02f692f38e0fc7d865462c7f58dc 100644
--- a/core/modules/update/update.authorize.inc
+++ b/core/modules/update/update.authorize.inc
@@ -87,6 +87,8 @@ function update_authorize_run_update($filetransfer, $projects) {
  *   should use that response for the current page request.
  */
 function update_authorize_run_install($filetransfer, $project, $updater_name, $local_url) {
+  @trigger_error(__METHOD__ . '() is deprecated in drupal:10.4.0 and is removed from drupal:11.1.0. There is no replacement. See https://www.drupal.org/node/3461934');
+
   // @todo Instantiate our Updater to set the human-readable title?
   $batch_builder = (new BatchBuilder())
     ->setFile(\Drupal::service('extension.list.module')->getPath('update') . '/update.authorize.inc')
diff --git a/core/modules/update/update.links.action.yml b/core/modules/update/update.links.action.yml
deleted file mode 100644
index 9e66fbb8fb38bc23361a989113f5497806e19540..0000000000000000000000000000000000000000
--- a/core/modules/update/update.links.action.yml
+++ /dev/null
@@ -1,20 +0,0 @@
-update.report_install:
-  route_name: update.report_install
-  title: 'Add new module or theme'
-  weight: 25
-  appears_on:
-    - update.status
-
-update.module_install:
-  route_name: update.module_install
-  title: 'Add new module'
-  weight: 25
-  appears_on:
-    - system.modules_list
-
-update.theme_install:
-  route_name: update.theme_install
-  title: 'Add new theme'
-  weight: 25
-  appears_on:
-    - system.themes_page
diff --git a/core/modules/update/update.module b/core/modules/update/update.module
index e1ed9d852acab41eb61c15b8e21730788e9163ab..2da551e244e537fb3689275868cf160f452edb26 100644
--- a/core/modules/update/update.module
+++ b/core/modules/update/update.module
@@ -7,8 +7,7 @@
  * The module checks for available updates of Drupal core and any installed
  * contributed modules and themes. It warns site administrators if newer
  * releases are available via the system status report (admin/reports/status),
- * the module and theme pages, and optionally via email. It also provides the
- * ability to install contributed modules and themes via a user interface.
+ * the module and theme pages, and optionally via email.
  */
 
 use Drupal\Core\File\Exception\FileException;
@@ -40,8 +39,6 @@ function update_help($route_name, RouteMatchInterface $route_match) {
       if (_update_manager_access()) {
         $output .= '<dt>' . t('Performing updates through the Update page') . '</dt>';
         $output .= '<dd>' . t('The Update Manager module allows administrators to perform updates directly from the <a href=":update-page">Update page</a>. It lists all available updates, and you can confirm whether you want to download them. If you don\'t have sufficient access rights to your web server, you could be prompted for your FTP/SSH password. Afterwards the files are transferred into your site installation, overwriting your old files. Direct links to the Update page are also displayed on the <a href=":modules_page">Extend page</a> and the <a href=":themes_page">Appearance page</a>.', [':modules_page' => Url::fromRoute('system.modules_list')->toString(), ':themes_page' => Url::fromRoute('system.themes_page')->toString(), ':update-page' => Url::fromRoute('update.report_update')->toString()]) . '</dd>';
-        $output .= '<dt>' . t('Adding new modules and themes through the Add new pages') . '</dt>';
-        $output .= '<dd>' . t('You can also add new modules and themes in the same fashion, through the <a href=":install">Add new modules and themes page</a>, or by clicking the <em>Add new module/theme</em> links at the top of the <a href=":modules_page">Extend page</a> and the <a href=":themes_page">Appearance page</a>. In this case, you are prompted to provide either the URL to the download, or to upload a packaged release file from your local computer.', [':modules_page' => Url::fromRoute('system.modules_list')->toString(), ':themes_page' => Url::fromRoute('system.themes_page')->toString(), ':install' => Url::fromRoute('update.report_install')->toString()]) . '</dd>';
       }
       $output .= '</dl>';
       return $output;
@@ -69,10 +66,8 @@ function update_page_top() {
       case 'update.theme_update':
       case 'system.theme_install':
       case 'update.module_update':
-      case 'update.module_install':
       case 'update.status':
       case 'update.report_update':
-      case 'update.report_install':
       case 'update.settings':
       case 'system.status':
       case 'update.confirmation_page':
diff --git a/core/modules/update/update.routing.yml b/core/modules/update/update.routing.yml
index 80faf6d5bb105019dc89287d69630074003aea4d..3e23dea480cd28498efb4453c217a1c19e5a629c 100644
--- a/core/modules/update/update.routing.yml
+++ b/core/modules/update/update.routing.yml
@@ -23,14 +23,6 @@ update.manual_status:
     _permission: 'administer site configuration'
     _csrf_token: 'TRUE'
 
-update.report_install:
-  path: '/admin/reports/updates/install'
-  defaults:
-    _form: '\Drupal\update\Form\UpdateManagerInstall'
-    _title: 'Add new module or theme'
-  requirements:
-    _permission: 'administer software updates'
-
 update.report_update:
   path: '/admin/reports/updates/update'
   defaults:
@@ -39,14 +31,6 @@ update.report_update:
   requirements:
     _permission: 'administer software updates'
 
-update.module_install:
-  path: '/admin/modules/install'
-  defaults:
-    _form: '\Drupal\update\Form\UpdateManagerInstall'
-    _title: 'Add new module'
-  requirements:
-    _permission: 'administer software updates'
-
 update.module_update:
   path: '/admin/modules/update'
   defaults:
@@ -55,14 +39,6 @@ update.module_update:
   requirements:
     _permission: 'administer software updates'
 
-update.theme_install:
-  path: '/admin/theme/install'
-  defaults:
-    _form: '\Drupal\update\Form\UpdateManagerInstall'
-    _title: 'Add new theme'
-  requirements:
-    _permission: 'administer software updates'
-
 update.theme_update:
   path: '/admin/appearance/update'
   defaults: