diff --git a/core/modules/tour/config/schema/tour.schema.yml b/core/modules/tour/config/schema/tour.schema.yml
index e9c137cf48..d8ffed2133 100644
--- a/core/modules/tour/config/schema/tour.schema.yml
+++ b/core/modules/tour/config/schema/tour.schema.yml
@@ -42,23 +42,12 @@ tour.tip:
     weight:
       type: integer
       label: 'Weight'
-    location:
-      deprecated: "The tour.tip 'location' config schema property is deprecated in drupal:9.2.0 and is removed from drupal:10.0.0. Instead use 'position'. The value must be a valid placement accepted by PopperJS. See https://www.drupal.org/node/3204093"
-      type: string
-      label: 'Location'
     position:
       type: string
       label: 'Position'
     selector:
       type: string
       label: 'Selector'
-    attributes:
-      deprecated: "The tour.tip 'attributes' config schema property is deprecated in drupal:9.2.0 and is removed from drupal:10.0.0. Instead of 'data-class' and 'data-id' attributes, use 'selector' to specify the element a tip attaches to. See https://www.drupal.org/node/3204093"
-      type: sequence
-      label: 'Attributes'
-      sequence:
-        type: string
-        label: 'Attribute'
 
 tour.tip.text:
   type: tour.tip
diff --git a/core/modules/tour/src/Plugin/tour/tip/TipPluginText.php b/core/modules/tour/src/Plugin/tour/tip/TipPluginText.php
index f82b95eb4f..8b3a6eb50e 100644
--- a/core/modules/tour/src/Plugin/tour/tip/TipPluginText.php
+++ b/core/modules/tour/src/Plugin/tour/tip/TipPluginText.php
@@ -70,14 +70,4 @@ public function getBody(): array {
     ];
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  public function getOutput() {
-    // Call parent to trigger error when calling this function.
-    parent::getOutput();
-    $output = '<p class="tour-tip-body">' . $this->token->replace($this->get('body')) . '</p>';
-    return ['#markup' => $output];
-  }
-
 }
diff --git a/core/modules/tour/src/TipPluginBase.php b/core/modules/tour/src/TipPluginBase.php
index 01c7683dee..c72ae64eb3 100644
--- a/core/modules/tour/src/TipPluginBase.php
+++ b/core/modules/tour/src/TipPluginBase.php
@@ -28,28 +28,6 @@ abstract class TipPluginBase extends PluginBase implements TipPluginInterface {
    */
   protected $weight;
 
-  /**
-   * The attributes that will be applied to the markup of this tip.
-   *
-   * @var array
-   *
-   * @deprecated in drupal:9.2.0 and is removed from drupal:10.0.0. There is no
-   *   direct replacement. Note that this was never actually used.
-   *
-   * @see https://www.drupal.org/node/3204096
-   */
-  protected $attributes;
-
-  /**
-   * {@inheritdoc}
-   */
-  public function __construct(array $configuration, $plugin_id, $plugin_definition) {
-    parent::__construct($configuration, $plugin_id, $plugin_definition);
-    if (!$this instanceof TourTipPluginInterface) {
-      @trigger_error('Implementing ' . __NAMESPACE__ . '\TipPluginInterface without also implementing ' . __NAMESPACE__ . '\TourTipPluginInterface is deprecated in drupal:9.2.0. See https://www.drupal.org/node/3204096', E_USER_DEPRECATED);
-    }
-  }
-
   /**
    * {@inheritdoc}
    */
@@ -71,38 +49,6 @@ public function getWeight() {
     return $this->get('weight');
   }
 
-  /**
-   * {@inheritdoc}
-   *
-   * @todo remove in https://drupal.org/node/3195193
-   */
-  public function getAttributes() {
-    // This method is deprecated and rewritten to be as backwards compatible as
-    // possible with pre-existing uses. Due to the flexibility of tip plugins,
-    // this backwards compatibility can't be fully guaranteed. Because of this,
-    // we trigger a warning to caution the use of this function. This warning
-    // does not stop page execution, but will be logged.
-    trigger_error(__NAMESPACE__ . '\TipPluginInterface::getAttributes is deprecated. Tour tip plugins should implement ' . __NAMESPACE__ . '\TourTipPluginInterface and Tour configs should use the \'selector\' property instead of \'attributes\' to target an element.', E_USER_WARNING);
-
-    // The _tour_update_joyride() updates the deprecated 'attributes' property
-    // to the current 'selector' property. It's possible that additional
-    // attributes not supported by Drupal core exist and these need to merged
-    // in.
-    $attributes = $this->get('attributes') ?: [];
-
-    // Convert the selector property to the expected structure.
-    $selector = $this->get('selector');
-    $first_char = substr($selector, 0, 1);
-    if ($first_char === '#') {
-      $attributes['data-id'] = substr($selector, 1);
-    }
-    elseif ($first_char === '.') {
-      $attributes['data-class'] = substr($selector, 1);
-    }
-
-    return $attributes;
-  }
-
   /**
    * {@inheritdoc}
    */
@@ -119,30 +65,6 @@ public function set($key, $value) {
     $this->configuration[$key] = $value;
   }
 
-  /**
-   * This method should not be used. It is deprecated from TipPluginInterface.
-   *
-   * @return array
-   *   An intentionally empty array.
-   *
-   * @todo remove in https://drupal.org/node/3195193
-   */
-  public function getOutput() {
-    // The getOutput() method was a requirement of TipPluginInterface, but was
-    // not part of TipPluginBase prior to it being deprecated. As a result, all
-    // tip plugins have their own implementations of getOutput() making it
-    // unlikely that this implementation will be called. If it does get called,
-    // however, the tour tip will have no content due to this method returning
-    // an empty array. To help tour tips from unexpectedly having no content, a
-    // warning is triggered. This warning does not stop page
-    // execution, but will be logged.
-    trigger_error(__NAMESPACE__ . 'TipPluginInterface::getOutput is deprecated. Use getBody() instead. See https://www.drupal.org/node/3204096', E_USER_WARNING);
-
-    // This class must implement TipPluginInterface, but this method is
-    // deprecated. An empty array is returned to meet interface requirements.
-    return [];
-  }
-
   /**
    * Determines the placement of the tip relative to the element.
    *
diff --git a/core/modules/tour/src/TipPluginInterface.php b/core/modules/tour/src/TipPluginInterface.php
index a7fa22c366..e55b0771dc 100644
--- a/core/modules/tour/src/TipPluginInterface.php
+++ b/core/modules/tour/src/TipPluginInterface.php
@@ -36,18 +36,6 @@ public function getLabel();
    */
   public function getWeight();
 
-  /**
-   * Returns an array of attributes for the tip wrapper.
-   *
-   * @deprecated in drupal:9.2.0 and is removed from drupal:10.0.0. The
-   *   attributes property is no longer used.
-   * @see https://www.drupal.org/node/3204093
-   *
-   * @return array
-   *   An array of classes and values.
-   */
-  public function getAttributes();
-
   /**
    * Used for returning values by key.
    *
@@ -70,17 +58,4 @@ public function get($key);
    */
   public function set($key, $value);
 
-  /**
-   * Returns a renderable array.
-   *
-   * @deprecated in drupal:9.2.0 and is removed from drupal:10.0.0. Use
-   *   getBody() instead, and do not include the tip label in the returned
-   *   output.
-   * @see https://www.drupal.org/node/3195234
-   *
-   * @return array
-   *   A renderable array.
-   */
-  public function getOutput();
-
 }
diff --git a/core/modules/tour/src/TourTipPluginInterface.php b/core/modules/tour/src/TourTipPluginInterface.php
index ad2807cc51..005f857d13 100644
--- a/core/modules/tour/src/TourTipPluginInterface.php
+++ b/core/modules/tour/src/TourTipPluginInterface.php
@@ -9,9 +9,6 @@
  * @see \Drupal\tour\TipPluginBase
  * @see \Drupal\tour\TipPluginManager
  * @see plugin_api
- *
- * @todo move all methods to TipPluginInterface and deprecate this interface in
- *   https://drupal.org/node/3195193
  */
 interface TourTipPluginInterface extends TipPluginInterface {
 
diff --git a/core/modules/tour/src/TourViewBuilder.php b/core/modules/tour/src/TourViewBuilder.php
index d9b7c658f1..97a6884b5e 100644
--- a/core/modules/tour/src/TourViewBuilder.php
+++ b/core/modules/tour/src/TourViewBuilder.php
@@ -53,51 +53,37 @@ public function viewMultiple(array $entities = [], $view_mode = 'full', $langcod
           $location = $location . '-start';
         }
 
-        // @todo remove conditional in https://drupal.org/node/3195193, as all
-        //   instances will already be instances of TourTipPluginInterface.
-        if ($tip instanceof TourTipPluginInterface) {
-          $body_render_array = $tip->getBody();
-          $body = (string) \Drupal::service('renderer')->renderPlain($body_render_array);
+        // This condition is met if the tip does not implement
+        // TourTipPluginInterface. This means the tour tip must be constructed
+        // with the deprecated getOutput() method. The resulting tour tip
+        // should be largely identical, with the following exceptions:
+        // - If the tour tip `attributes` property included anything other
+        //   than `data-class` or `data-id`, these additional attributes
+        //   will not be available in the resulting tour tip. Note that such
+        //   uses are uncommon.
+        // - Although the tour tip content is identical, the markup structure
+        //   will be different due to being rendered by Shepherd instead of
+        //   Joyride. Themes extending Stable or Stable 9 will not experience
+        //   these changes as a script is provided that reconstructs each tip
+        //   to match Joyride's markup structure.
+        $attributes = (array) $tip->get('attributes');
+        if (array_diff(['data-class', 'data-id'], array_keys($attributes + ['data-class', 'data-id']))) {
+          trigger_error('The tour tips only support data-class and data-id attributes and they will have to be upgraded manually. See https://www.drupal.org/node/3204093', E_USER_WARNING);
+        }
+        $tour_render_array = $tip->getOutput();
+        if (!empty($tour_render_array)) {
+          // The output render array intentionally omits title. The deprecated
+          // getOutput() returns a render array with the title and main
+          // content.
           $output = [
-            'body' => $body,
-            'title' => Html::escape($tip->getLabel()),
+            'body' => (string) \Drupal::service('renderer')->renderPlain($tour_render_array),
           ];
 
-          $selector = $tip->getSelector();
-        }
-        else {
-          // This condition is met if the tip does not implement
-          // TourTipPluginInterface. This means the tour tip must be constructed
-          // with the deprecated getOutput() method. The resulting tour tip
-          // should be largely identical, with the following exceptions:
-          // - If the tour tip `attributes` property included anything other
-          //   than `data-class` or `data-id`, these additional attributes
-          //   will not be available in the resulting tour tip. Note that such
-          //   uses are uncommon.
-          // - Although the tour tip content is identical, the markup structure
-          //   will be different due to being rendered by Shepherd instead of
-          //   Joyride. Themes extending Stable or Stable 9 will not experience
-          //   these changes as a script is provided that reconstructs each tip
-          //   to match Joyride's markup structure.
-          $attributes = (array) $tip->get('attributes');
-          if (array_diff(['data-class', 'data-id'], array_keys($attributes + ['data-class', 'data-id']))) {
-            trigger_error('The tour tips only support data-class and data-id attributes and they will have to be upgraded manually. See https://www.drupal.org/node/3204093', E_USER_WARNING);
-          }
-          $tour_render_array = $tip->getOutput();
-          if (!empty($tour_render_array)) {
-            // The output render array intentionally omits title. The deprecated
-            // getOutput() returns a render array with the title and main
-            // content.
-            $output = [
-              'body' => (string) \Drupal::service('renderer')->renderPlain($tour_render_array),
-            ];
-
-            // Add a class so JavaScript in Stable themes can identify deprecated
-            // tip plugins. The logic used to make markup backwards compatible
-            // with Joyride is different depending on the type of
-            // plugin used.
-            $classes[] = 'tip-uses-get-output';
-          }
+          // Add a class so JavaScript in Stable themes can identify deprecated
+          // tip plugins. The logic used to make markup backwards compatible
+          // with Joyride is different depending on the type of
+          // plugin used.
+          $classes[] = 'tip-uses-get-output';
         }
 
         if ($output) {
diff --git a/core/modules/tour/tests/fixtures/addTourLegacyConfig.php b/core/modules/tour/tests/fixtures/addTourLegacyConfig.php
deleted file mode 100644
index 8d37c90d02..0000000000
--- a/core/modules/tour/tests/fixtures/addTourLegacyConfig.php
+++ /dev/null
@@ -1,27 +0,0 @@
-<?php
-
-/**
- * @file
- * Adds deprecated tour config for testing updates.
- *
- * @see https://www.drupal.org/node/3022401
- */
-
-use Drupal\Core\Database\Database;
-use Drupal\Core\Serialization\Yaml;
-
-$connection = Database::getConnection();
-
-$tour_with_location = Yaml::decode(file_get_contents(__DIR__ . '/legacy_config/tour.tour.tour-test-legacy-location.yml'));
-$connection->insert('config')
-  ->fields([
-    'collection',
-    'name',
-    'data',
-  ])
-  ->values([
-    'collection' => '',
-    'name' => 'tour.tour.tour-test-legacy-location',
-    'data' => serialize($tour_with_location),
-  ])
-  ->execute();
diff --git a/core/modules/tour/tests/fixtures/legacy_config/tour.tour.tour-test-legacy-location.yml b/core/modules/tour/tests/fixtures/legacy_config/tour.tour.tour-test-legacy-location.yml
deleted file mode 100644
index 6de9d25fe6..0000000000
--- a/core/modules/tour/tests/fixtures/legacy_config/tour.tour.tour-test-legacy-location.yml
+++ /dev/null
@@ -1,30 +0,0 @@
-id: tour-test-legacy-location
-module: tour_test
-label: 'Tour test the location property'
-routes:
-  - route_name: some_tour_route
-tips:
-  location-test-top:
-    id: location-test-top
-    plugin: text
-    label: 'Top position'
-    body: 'Top that, top that'
-    location: top
-  location-test-bottom:
-    id: location-test-bottom
-    plugin: text
-    label: 'Bottom position'
-    body: 'You can give all that you can, but you will never top that'
-    location: bottom
-  location-test-left:
-    id: location-test-left
-    plugin: text
-    label: 'Left position'
-    body: "You can dream until you're blue but you can never top that, huh-huh!"
-    location: left
-  location-test-right:
-    id: location-test-right
-    plugin: text
-    label: 'Right position'
-    body: "I don't really give a [pause] about trying to top that"
-    location: right
diff --git a/core/modules/tour/tests/fixtures/legacy_config/tour.tour.tour-test-legacy.yml b/core/modules/tour/tests/fixtures/legacy_config/tour.tour.tour-test-legacy.yml
deleted file mode 100644
index 51ab1397fa..0000000000
--- a/core/modules/tour/tests/fixtures/legacy_config/tour.tour.tour-test-legacy.yml
+++ /dev/null
@@ -1,29 +0,0 @@
-id: tour-test-legacy
-module: tour_test
-label: 'Tour test Legacy'
-langcode: en
-routes:
-  - route_name: tour_test.legacy
-tips:
-  tour-test-legacy-1:
-    id: tour-test-legacy-1
-    plugin: text_legacy
-    label: 'The first tip'
-    body: 'Is <a href="[site:url]">[site:name]</a> always the best dressed?'
-    weight: 1
-    attributes:
-      data-id: tour-test-1
-  tour-test-legacy-3:
-    id: tour-test-legacy-3
-    plugin: image_legacy
-    label: 'The awesome image'
-    url: 'http://local/image.png'
-    weight: 1
-  tour-test-legacy-6:
-    id: tour-test-legacy-6
-    plugin: text_legacy
-    label: 'Im a list'
-    body: '<p>Im all these things:</p><ul><li>Modal</li><li>Awesome</li></ul>'
-    weight: 6
-    attributes:
-      data-class: tour-test-5
diff --git a/core/modules/tour/tests/src/Functional/Update/TourTipDeprecatedConfigModuleInstallTest.php b/core/modules/tour/tests/src/Functional/Update/TourTipDeprecatedConfigModuleInstallTest.php
deleted file mode 100644
index 48777588b4..0000000000
--- a/core/modules/tour/tests/src/Functional/Update/TourTipDeprecatedConfigModuleInstallTest.php
+++ /dev/null
@@ -1,61 +0,0 @@
-<?php
-
-namespace Drupal\Tests\tour\Functional\Update;
-
-use Drupal\Tests\BrowserTestBase;
-
-/**
- * Confirms that legacy tour tips are updated when module config is imported.
- *
- * @group tour
- * @group legacy
- */
-class TourTipDeprecatedConfigModuleInstallTest extends BrowserTestBase {
-
-  /**
-   * {@inheritdoc}
-   */
-  protected static $modules = ['tour'];
-
-  /**
-   * {@inheritdoc}
-   */
-  protected $defaultTheme = 'stark';
-
-  /**
-   * Test ensuring that tour config is updated on config import.
-   */
-  public function testModuleInstall() {
-    $this->expectDeprecation("The tour.tip 'attributes' config schema property is deprecated in drupal:9.2.0 and is removed from drupal:10.0.0. Instead of 'data-class' and 'data-id' attributes, use 'selector' to specify the element a tip attaches to. See https://www.drupal.org/node/3204093");
-    $this->expectDeprecation("The tour.tip 'location' config schema property is deprecated in drupal:9.2.0 and is removed from drupal:10.0.0. Instead use 'position'. The value must be a valid placement accepted by PopperJS. See https://www.drupal.org/node/3204093");
-
-    $this->container->get('module_installer')->install(['tour_test', 'tour_legacy_test']);
-    $updated_legacy_tour_config = $this->container->get('config.factory')->get('tour.tour.tour-test-legacy');
-    $updated_tips = $updated_legacy_tour_config->get('tips');
-
-    // Confirm that tour-test-1 uses `selector` instead of `data-id`.
-    $this->assertSame('#tour-test-1', $updated_tips['tour-test-legacy-1']['selector']);
-    $this->assertArrayNotHasKey('attributes', $updated_tips['tour-test-legacy-1']);
-
-    // Confirm that tour-test-5 uses `selector` instead of `data-class`.
-    $this->assertSame('.tour-test-5', $updated_tips['tour-test-legacy-6']['selector']);
-    $this->assertArrayNotHasKey('attributes', $updated_tips['tour-test-legacy-6']);
-
-    // Confirm that tour-test-legacy-7 uses `selector` instead of `data-class`.
-    $this->assertSame('.tour-test-7', $updated_tips['tour-test-legacy-7']['selector']);
-    $this->assertSame(['foo' => 'bar'], $updated_tips['tour-test-legacy-7']['attributes']);
-
-    $updated_legacy_location_tour_config = $this->container->get('config.factory')->get('tour.tour.tour-test-legacy-location');
-    $updated_location_tips = $updated_legacy_location_tour_config->get('tips');
-
-    $this->assertSame('top-start', $updated_location_tips['location-test-top']['position']);
-    $this->assertArrayNotHasKey('location', $updated_location_tips['location-test-top']);
-    $this->assertEquals('bottom-start', $updated_location_tips['location-test-bottom']['position']);
-    $this->assertArrayNotHasKey('location', $updated_location_tips['location-test-bottom']);
-    $this->assertEquals('right-start', $updated_location_tips['location-test-right']['position']);
-    $this->assertArrayNotHasKey('location', $updated_location_tips['location-test-right']);
-    $this->assertEquals('left-start', $updated_location_tips['location-test-left']['position']);
-    $this->assertArrayNotHasKey('location', $updated_location_tips['location-test-left']);
-  }
-
-}
diff --git a/core/modules/tour/tests/src/FunctionalJavascript/TourLegacyTest.php b/core/modules/tour/tests/src/FunctionalJavascript/TourLegacyTest.php
deleted file mode 100644
index 6d781b894c..0000000000
--- a/core/modules/tour/tests/src/FunctionalJavascript/TourLegacyTest.php
+++ /dev/null
@@ -1,145 +0,0 @@
-<?php
-
-namespace Drupal\Tests\tour\FunctionalJavascript;
-
-use Drupal\FunctionalJavascriptTests\WebDriverTestBase;
-
-/**
- * Tests Tour's backwards compatible markup and legacy config.
- *
- * @group tour
- * @group legacy
- */
-class TourLegacyTest extends WebDriverTestBase {
-
-  /**
-   * {@inheritdoc}
-   */
-  protected static $modules = [
-    'tour',
-    'tour_legacy_test',
-    'toolbar',
-  ];
-
-  /**
-   * {@inheritdoc}
-   */
-  protected $defaultTheme = 'stable';
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function setUp(): void {
-    parent::setUp();
-
-    $admin_user = $this->drupalCreateUser([
-      'access toolbar',
-      'access tour',
-    ]);
-    $this->drupalLogin($admin_user);
-  }
-
-  /**
-   * Confirms backwards compatible markup.
-   *
-   * @param string $path
-   *   The path to check.
-   * @param string $theme
-   *   The theme used by the tests.
-   *
-   * @dataProvider providerTestTourTipMarkup
-   */
-  public function testTourTipMarkup(string $path, string $theme = NULL) {
-    // Install the specified theme and make it default if that is not already
-    // the case.
-    if ($theme) {
-      $theme_manager = $this->container->get('theme.manager');
-      $this->container->get('theme_installer')->install([$theme], TRUE);
-
-      $system_theme_config = $this->container->get('config.factory')->getEditable('system.theme');
-      $system_theme_config
-        ->set('default', $theme)
-        ->save();
-      $this->rebuildAll();
-      $this->assertSame($theme, $theme_manager->getActiveTheme()->getName());
-    }
-
-    $page = $this->getSession()->getPage();
-    $assert_session = $this->assertSession();
-    $this->drupalGet($path);
-
-    $assert_session->waitForElementVisible('css', '#toolbar-tab-tour button');
-    $page->find('css', '#toolbar-tab-tour button')->press();
-    $this->assertToolTipMarkup(0, 'top');
-    $page->find('css', '.joyride-tip-guide[data-index="0"]')->clickLink('Next');
-    $this->assertToolTipMarkup(1, '', 'image');
-    $page->find('css', '.joyride-tip-guide[data-index="1"]')->clickLink('Next');
-    $this->assertToolTipMarkup(2, 'top', 'body');
-    $tip_content = $assert_session->waitForElementVisible('css', '.joyride-tip-guide[data-index="2"] .joyride-content-wrapper');
-
-    $additional_paragraph = $tip_content->find('css', '.tour-tip-body + p');
-    $this->assertNotNull($additional_paragraph, 'Tip 3 has an additional paragraph that is a sibling to the main paragraph.');
-    $additional_list = $tip_content->find('css', '.tour-tip-body + p + ul');
-    $this->assertNotNull($additional_list, 'Tip 3 has an additional unordered list that is a sibling to the main paragraph.');
-  }
-
-  /**
-   * Asserts the markup structure of a tip.
-   *
-   * @param int $index
-   *   The position of the tip within the tour.
-   * @param string $nub_position
-   *   The expected position of the nub arrow.
-   * @param string $joyride_content_container_name
-   *   For identifying classnames specific to a tip type.
-   *
-   * @internal
-   */
-  private function assertToolTipMarkup(int $index, string $nub_position, string $joyride_content_container_name = 'body'): void {
-    $assert_session = $this->assertSession();
-    $tip = $assert_session->waitForElementVisible('css', ".joyride-tip-guide[data-index=\"$index\"]");
-    $this->assertNotNull($tip, 'The tour tip element is present.');
-
-    $nub = $tip->find('css', ".joyride-tip-guide[data-index=\"$index\"] > .joyride-nub");
-    $this->assertNotNull($nub, 'The nub element is present.');
-    if (!empty($nub_position)) {
-      $this->assertTrue($nub->hasClass($nub_position), 'The nub has a class that indicates its configured position.');
-    }
-
-    $content_wrapper = $tip->find('css', '.joyride-nub + .joyride-content-wrapper');
-    $this->assertNotNull($content_wrapper, 'The joyride content wrapper exists, and is the next sibling of the nub.');
-
-    $label = $tip->find('css', '.joyride-content-wrapper > h2.tour-tip-label:first-child');
-    $this->assertNotNull($label, 'The tour tip label is an h2, and is the first child of the content wrapper.');
-
-    $tip_content = $content_wrapper->find('css', "h2.tour-tip-label + p.tour-tip-$joyride_content_container_name");
-    $this->assertNotNull($tip_content, 'The tip\'s main paragraph is the next sibling of the label, and has the expected wrapper class.');
-
-    $tour_progress = $content_wrapper->find('css', "h2.tour-tip-label + p.tour-tip-$joyride_content_container_name ~ div.tour-progress");
-    $this->assertNotNull($tour_progress, 'The div containing tour progress info is present, and is the next sibling of the main paragraph.');
-
-    $next_item = $content_wrapper->find('css', ".tour-progress + a.joyride-next-tip.button.button--primary");
-    $this->assertNotNull($next_item, 'The "Next" link is present, and the next sibling of the div containing progress info.');
-
-    $close_tour = $content_wrapper->find('css', ".joyride-content-wrapper > a.joyride-close-tip:last-child");
-    $this->assertNotNull($close_tour, 'The "Close" link is present, is an immediate child of the content wrapper, and is the last child.');
-  }
-
-  /**
-   * Data Provider.
-   *
-   * @return \string[][]
-   *   An array with two potential items:
-   *   - The different path the test will run on.
-   *   - The active theme when running the tests.
-   */
-  public function providerTestTourTipMarkup() {
-    return [
-      'Using the the deprecated TipPlugin with Stable theme' => ['tour-test-legacy'],
-      'Using current TourTipPlugin with Stable theme' => ['tour-test-1'],
-      'Using the the deprecated TipPlugin with Stable 9 theme' => ['tour-test-legacy', 'stable9'],
-      'Using current TourTipPlugin with Stable 9 theme' => ['tour-test-1', 'stable9'],
-    ];
-  }
-
-}
diff --git a/core/modules/tour/tests/src/Kernel/TourPluginTest.php b/core/modules/tour/tests/src/Kernel/TourPluginTest.php
index 3cd3a2c634..d647716c2f 100644
--- a/core/modules/tour/tests/src/Kernel/TourPluginTest.php
+++ b/core/modules/tour/tests/src/Kernel/TourPluginTest.php
@@ -3,8 +3,6 @@
 namespace Drupal\Tests\tour\Kernel;
 
 use Drupal\KernelTests\KernelTestBase;
-use Drupal\tour\Entity\Tour;
-use PHPUnit\Framework\Error\Warning;
 
 /**
  * Tests the functionality of tour plugins.
@@ -44,60 +42,4 @@ public function testTourPlugins() {
     $this->assertCount(1, $this->pluginManager->getDefinitions(), 'Only tour plugins for the enabled modules were returned.');
   }
 
-  /**
-   * Test that warnings and deprecations are triggered.
-   *
-   * @group legacy
-   */
-  public function testDeprecatedMethodWarningsErrors() {
-    \Drupal::service('module_installer')->install(['tour_legacy_test']);
-    $tip = Tour::load('tour-test')->getTips()[0];
-
-    // These are E_USER_WARNING severity errors that supplement existing
-    // deprecation errors. These warnings are triggered when methods are called
-    // that are designed to be backwards compatible, but aren't able to 100%
-    // promise this due to the many ways that tip plugins can be extended.
-    try {
-      $tip->getOutput();
-      $this->fail('No getOutput() warning triggered.');
-    }
-    catch (Warning $e) {
-      $this->assertSame('Drupal\tourTipPluginInterface::getOutput is deprecated. Use getBody() instead. See https://www.drupal.org/node/3204096', $e->getMessage());
-    }
-
-    try {
-      $tip->getAttributes();
-      $this->fail('No getAttributes() warning triggered.');
-    }
-    catch (Warning $e) {
-      $this->assertSame('Drupal\tour\TipPluginInterface::getAttributes is deprecated. Tour tip plugins should implement Drupal\tour\TourTipPluginInterface and Tour configs should use the \'selector\' property instead of \'attributes\' to target an element.', $e->getMessage());
-    }
-
-    // Remove PHPUnits conversion of warning to exceptions.
-    set_error_handler(function () {});
-    $tip = Tour::load('tour-test-legacy')->getTips()[3];
-    $attributes = $tip->getAttributes();
-    restore_error_handler();
-    $this->assertSame([
-      'foo' => 'bar',
-      'data-class' => 'tour-test-7',
-      'data-aria-describedby' => 'tour-tip-tour-test-legacy-7-contents',
-      'data-aria-labelledby' => 'tour-tip-tour-test-legacy-7-label',
-    ], $attributes);
-
-    $this->expectDeprecation('Implementing Drupal\tour\TipPluginInterface without also implementing Drupal\tour\TourTipPluginInterface is deprecated in drupal:9.2.0. See https://www.drupal.org/node/3204096');
-    $this->expectDeprecation("The tour.tip 'attributes' config schema property is deprecated in drupal:9.2.0 and is removed from drupal:10.0.0. Instead of 'data-class' and 'data-id' attributes, use 'selector' to specify the element a tip attaches to. See https://www.drupal.org/node/3204093");
-    $this->expectDeprecation("The tour.tip 'location' config schema property is deprecated in drupal:9.2.0 and is removed from drupal:10.0.0. Instead use 'position'. The value must be a valid placement accepted by PopperJS. See https://www.drupal.org/node/3204093");
-
-    try {
-      \Drupal::entityTypeManager()
-        ->getViewBuilder('tour')
-        ->viewMultiple([Tour::load('tour-test-legacy')], 'full');
-      $this->fail('No deprecated interface warning triggered.');
-    }
-    catch (Warning $e) {
-      $this->assertSame('The tour tips only support data-class and data-id attributes and they will have to be upgraded manually. See https://www.drupal.org/node/3204093', $e->getMessage());
-    }
-  }
-
 }
diff --git a/core/modules/tour/tests/tour_legacy_test/config/install/tour.tour.tour-test-legacy-location.yml b/core/modules/tour/tests/tour_legacy_test/config/install/tour.tour.tour-test-legacy-location.yml
deleted file mode 100644
index 3113e47e26..0000000000
--- a/core/modules/tour/tests/tour_legacy_test/config/install/tour.tour.tour-test-legacy-location.yml
+++ /dev/null
@@ -1,31 +0,0 @@
-id: tour-test-legacy-location
-label: 'Tour test the location property'
-module: tour_test
-routes:
-  -
-    route_name: some_tour_route
-tips:
-  location-test-top:
-    id: location-test-top
-    plugin: text
-    label: 'Top position'
-    location: top
-    body: 'Top that, top that'
-  location-test-bottom:
-    id: location-test-bottom
-    plugin: text
-    label: 'Bottom position'
-    location: bottom
-    body: 'You can give all that you can, but you will never top that'
-  location-test-left:
-    id: location-test-left
-    plugin: text
-    label: 'Left position'
-    location: left
-    body: 'You can dream until you''re blue but you can never top that, huh-huh!'
-  location-test-right:
-    id: location-test-right
-    plugin: text
-    label: 'Right position'
-    location: right
-    body: 'I don''t really give a [pause] about trying to top that'
diff --git a/core/modules/tour/tests/tour_legacy_test/config/install/tour.tour.tour-test-legacy.yml b/core/modules/tour/tests/tour_legacy_test/config/install/tour.tour.tour-test-legacy.yml
deleted file mode 100644
index 2a1b021bbf..0000000000
--- a/core/modules/tour/tests/tour_legacy_test/config/install/tour.tour.tour-test-legacy.yml
+++ /dev/null
@@ -1,39 +0,0 @@
-langcode: en
-id: tour-test-legacy
-label: 'Tour test Legacy'
-module: tour_test
-routes:
-  -
-    route_name: tour_test.legacy
-tips:
-  tour-test-legacy-1:
-    id: tour-test-legacy-1
-    plugin: text_legacy
-    label: 'The first legacy tip'
-    body: 'Is <a href="[site:url]">[site:name]</a> always the best dressed?'
-    weight: 1
-    attributes:
-      data-id: tour-test-1
-  tour-test-legacy-3:
-    id: tour-test-legacy-3
-    plugin: image_legacy
-    label: 'The awesome legacy image'
-    url: 'http://local/image.png'
-    weight: 1
-  tour-test-legacy-6:
-    id: tour-test-legacy-6
-    plugin: text_legacy
-    label: 'Im a legacy list'
-    body: '<p>Im all these things:</p><ul><li>Modal</li><li>Awesome</li></ul>'
-    weight: 6
-    attributes:
-      data-class: tour-test-5
-  tour-test-legacy-7:
-    id: tour-test-legacy-7
-    plugin: text_legacy
-    label: 'Im a legacy list with more attributes'
-    body: '<p>More attributes</p>'
-    weight: 8
-    attributes:
-      data-class: tour-test-7
-      foo: bar
diff --git a/core/modules/tour/tests/tour_legacy_test/config/schema/tour_legacy_test.schema.yml b/core/modules/tour/tests/tour_legacy_test/config/schema/tour_legacy_test.schema.yml
deleted file mode 100644
index 7e90ed43d1..0000000000
--- a/core/modules/tour/tests/tour_legacy_test/config/schema/tour_legacy_test.schema.yml
+++ /dev/null
@@ -1,17 +0,0 @@
-# Schema for the configuration files of the Tour Test Legacy module.
-
-tour.tip.image_legacy:
-  type: tour.tip
-  label: 'Image tour tip'
-  mapping:
-    url:
-      type: uri
-      label: 'Image URL'
-
-tour.tip.text_legacy:
-  type: tour.tip
-  label: 'Textual tour tip'
-  mapping:
-    body:
-      type: text
-      label: 'Body'
diff --git a/core/modules/tour/tests/tour_legacy_test/tour_legacy_test.info.yml b/core/modules/tour/tests/tour_legacy_test/tour_legacy_test.info.yml
deleted file mode 100644
index ecf2e051c0..0000000000
--- a/core/modules/tour/tests/tour_legacy_test/tour_legacy_test.info.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-name: Tour legacy plugin tests
-type: module
-description: Tests related to deprecated plugins.
-package: Testing
-version: VERSION
-dependencies:
-  - drupal:tour
-  - drupal:tour_test
diff --git a/core/modules/tour/tests/tour_legacy_test/tour_legacy_test.routing.yml b/core/modules/tour/tests/tour_legacy_test/tour_legacy_test.routing.yml
deleted file mode 100644
index a3eae77374..0000000000
--- a/core/modules/tour/tests/tour_legacy_test/tour_legacy_test.routing.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-tour_test.legacy:
-  path: '/tour-test-legacy'
-  defaults:
-    _controller: '\Drupal\tour_test\Controller\TourTestController::tourTest1'
-  options:
-    _admin_route: TRUE
-  requirements:
-    _access: 'TRUE'
diff --git a/core/modules/tour/tests/tour_test/src/Plugin/tour/tip/TipPluginImageLegacy.php b/core/modules/tour/tests/tour_test/src/Plugin/tour/tip/TipPluginImageLegacy.php
index 303e33f5e3..ff793c099b 100644
--- a/core/modules/tour/tests/tour_test/src/Plugin/tour/tip/TipPluginImageLegacy.php
+++ b/core/modules/tour/tests/tour_test/src/Plugin/tour/tip/TipPluginImageLegacy.php
@@ -81,19 +81,4 @@ public function getConfigurationOrNot() {
     ];
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  public function getOutput() {
-    $prefix = '<h2 class="tour-tip-label" id="tour-tip-' . $this->get('ariaId') . '-label">' . Html::escape($this->get('label')) . '</h2>';
-    $prefix .= '<p class="tour-tip-image" id="tour-tip-' . $this->get('ariaId') . '-contents">';
-    return [
-      '#prefix' => $prefix,
-      '#theme' => 'image',
-      '#uri' => $this->get('url'),
-      '#alt' => $this->get('alt'),
-      '#suffix' => '</p>',
-    ];
-  }
-
 }
diff --git a/core/modules/tour/tests/tour_test/src/Plugin/tour/tip/TipPluginTextLegacy.php b/core/modules/tour/tests/tour_test/src/Plugin/tour/tip/TipPluginTextLegacy.php
index c610e0b16a..c9e505d14c 100644
--- a/core/modules/tour/tests/tour_test/src/Plugin/tour/tip/TipPluginTextLegacy.php
+++ b/core/modules/tour/tests/tour_test/src/Plugin/tour/tip/TipPluginTextLegacy.php
@@ -93,26 +93,4 @@ public function getBody() {
     return $this->get('body');
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  public function getAttributes() {
-    $attributes = parent::getAttributes();
-    $attributes['data-aria-describedby'] = 'tour-tip-' . $this->getAriaId() . '-contents';
-    $attributes['data-aria-labelledby'] = 'tour-tip-' . $this->getAriaId() . '-label';
-    if ($location = $this->get('location')) {
-      $attributes['data-options'] = 'tipLocation:' . $location;
-    }
-    return $attributes;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getOutput() {
-    $output = '<h2 class="tour-tip-label" id="tour-tip-' . $this->getAriaId() . '-label">' . Html::escape($this->getLabel()) . '</h2>';
-    $output .= '<p class="tour-tip-body" id="tour-tip-' . $this->getAriaId() . '-contents">' . $this->token->replace($this->getBody()) . '</p>';
-    return ['#markup' => $output];
-  }
-
 }
diff --git a/core/modules/tour/tour.module b/core/modules/tour/tour.module
index 3430921877..e6bbd2ae63 100644
--- a/core/modules/tour/tour.module
+++ b/core/modules/tour/tour.module
@@ -114,82 +114,3 @@ function tour_tour_insert($entity) {
 function tour_tour_update($entity) {
   \Drupal::service('plugin.manager.tour.tip')->clearCachedDefinitions();
 }
-
-/**
- * Implements hook_ENTITY_TYPE_presave() for tour entities.
- *
- * @todo https://www.drupal.org/i/3195823 Remove once deprecated properties are
- *   no longer supported.
- */
-function tour_tour_presave(Tour $tour) {
-  _tour_update_joyride($tour);
-}
-
-/**
- * Updates a tour to make it compatible with the Shepherd library.
- *
- * @param \Drupal\tour\Entity\Tour $tour
- *   The tour to update.
- * @param bool $trigger_deprecation
- *   (optional) Whether to trigger deprecations. Defaults to TRUE.
- *
- * @return bool
- *   Whether or not the entity needs saving.
- *
- * @see tour_post_update_joyride_selectors_to_selector_property()
- *
- * @internal
- *
- * @todo https://www.drupal.org/i/3195823 Remove once deprecated properties are
- *   no longer supported.
- */
-function _tour_update_joyride(Tour $tour, bool $trigger_deprecation = TRUE): bool {
-  $needs_save = FALSE;
-
-  // Update jQuery Joyride based plugins into a new, more structured format that
-  // is compatible with Shepherd.
-  $tips = $tour->get('tips');
-  foreach ($tips as &$tip) {
-    if (isset($tip['attributes']['data-class']) || isset($tip['attributes']['data-id'])) {
-      if ($trigger_deprecation) {
-        @trigger_error("The tour.tip 'attributes' config schema property is deprecated in drupal:9.2.0 and is removed from drupal:10.0.0. Instead of 'data-class' and 'data-id' attributes, use 'selector' to specify the element a tip attaches to. See https://www.drupal.org/node/3204093", E_USER_DEPRECATED);
-      }
-
-      $needs_save = TRUE;
-      $selector = isset($tip['attributes']['data-class']) ? ".{$tip['attributes']['data-class']}" : NULL;
-      $selector = isset($tip['attributes']['data-id']) ? "#{$tip['attributes']['data-id']}" : $selector;
-      $tip['selector'] = $selector;
-
-      // Although the attributes property is deprecated, only the properties
-      // with 1:1 equivalents are unset.
-      unset($tip['attributes']['data-class'], $tip['attributes']['data-id']);
-      // Remove attributes if it is now empty.
-      if (empty($tip['attributes'])) {
-        unset($tip['attributes']);
-      }
-    }
-    if (isset($tip['location'])) {
-      if ($trigger_deprecation) {
-        @trigger_error("The tour.tip 'location' config schema property is deprecated in drupal:9.2.0 and is removed from drupal:10.0.0. Instead use 'position'. The value must be a valid placement accepted by PopperJS. See https://www.drupal.org/node/3204093", E_USER_DEPRECATED);
-      }
-      $needs_save = TRUE;
-
-      // Joyride only supports four location options: 'top', 'bottom',
-      // 'left', and 'right'. Shepherd also accepts these as options, but they
-      // result in different behavior. A given Joyride location option will
-      // provide the same results in Shepherd if '-start' is appended to it (
-      // e.g. the 'left-start' option in Shepherd positions the element the
-      // same way that 'left' does in Joyride.
-      //
-      // @see https://shepherdjs.dev/docs/Step.html
-      $tip['position'] = $tip['location'] . '-start';
-      unset($tip['location']);
-    }
-  }
-
-  if ($needs_save) {
-    $tour->set('tips', $tips);
-  }
-
-  return $needs_save;
-}
diff --git a/core/modules/tour/tour.post_update.php b/core/modules/tour/tour.post_update.php
deleted file mode 100644
index f9396a6c7c..0000000000
--- a/core/modules/tour/tour.post_update.php
+++ /dev/null
@@ -1,21 +0,0 @@
-<?php
-
-/**
- * @file
- * Post update functions for Tour.
- */
-
-use Drupal\Core\Config\Entity\ConfigEntityUpdater;
-use Drupal\tour\Entity\Tour;
-
-/**
- * Convert Joyride selectors to `selector` property.
- *
- * @see tour_tour_presave()
- */
-function tour_post_update_joyride_selectors_to_selector_property(array &$sandbox = NULL) {
-  $config_entity_updater = \Drupal::classResolver(ConfigEntityUpdater::class);
-  $config_entity_updater->update($sandbox, 'tour', function (Tour $tour) {
-    return _tour_update_joyride($tour, FALSE);
-  });
-}
diff --git a/core/tests/Drupal/KernelTests/Core/Config/DefaultConfigTest.php b/core/tests/Drupal/KernelTests/Core/Config/DefaultConfigTest.php
index 32c13c720f..5b8af90f28 100644
--- a/core/tests/Drupal/KernelTests/Core/Config/DefaultConfigTest.php
+++ b/core/tests/Drupal/KernelTests/Core/Config/DefaultConfigTest.php
@@ -40,10 +40,6 @@ class DefaultConfigTest extends KernelTestBase {
     'config_schema_test.someschema.somemodule.section_two.subsection',
     'config_schema_test.someschema.with_parents',
     'config_schema_test.someschema',
-    // Skip tour-test-legacy files as they intentionally have deprecated
-    // properties.
-    'tour.tour.tour-test-legacy',
-    'tour.tour.tour-test-legacy-location',
   ];
 
   /**
diff --git a/core/themes/stable/js/tour.es6.js b/core/themes/stable/js/tour.es6.js
index 6d5e66b506..3a565ee191 100644
--- a/core/themes/stable/js/tour.es6.js
+++ b/core/themes/stable/js/tour.es6.js
@@ -61,50 +61,20 @@
     );
     shepherdElement.querySelector('footer').remove();
 
-    // If the class list includes `tip-uses-get-output`, then the tip was created
-    // by a deprecated tip plugin. This means the markup has some differences
-    // that require some different steps to rebuild it as Joyride BC markup.
-    // @todo remove the contents of the 'if' in this conditional in
-    //   https://drupal.org/node/3195193.
-    if (shepherdElement.classList.contains('tip-uses-get-output')) {
-      // Move the next button.
-      shepherdText.appendChild(shepherdNext);
+    // Rearrange elements so their structure matches Joyride's.
+    shepherdContent.insertBefore(shepherdTitle, shepherdContent.firstChild);
+    shepherdContent.insertBefore(tourProgress, shepherdText.nextSibling);
+    shepherdContent.appendChild(shepherdCancel);
+    shepherdContent.querySelector('.shepherd-header').remove();
+    shepherdContent.insertBefore(shepherdNext, tourProgress.nextSibling);
+    shepherdCancel.innerHTML = '<span aria-hidden="true">×</span>';
+    shepherdTitle.classList.add('tour-tip-label');
 
-      // Move the cancel button and remove the now unnecessary header.
-      shepherdText.appendChild(shepherdCancel);
-      shepherdContent.querySelector('.shepherd-header').remove();
+    // Convert elements to use the tags they used in Joyride.
+    changeTag(shepherdTitle, 'h2');
 
-      // Remove empty paragraphs from the text container markup.
-      Array.from(shepherdText.children).forEach((node) => {
-        if (
-          node.tagName === 'P' &&
-          node.textContent === '' &&
-          node.classList.length === 0
-        ) {
-          node.remove();
-        }
-      });
-
-      // Move the contents of shepherdText directly into shepherdContent to
-      // remove the now redundant `<p>` provided by TipPlugin. Shepherd already
-      // wraps its content in a `<p>`, so the Plugin provided tag is redundant.
-      shepherdContent.innerHTML = shepherdText.innerHTML;
-    } else {
-      // Rearrange elements so their structure matches Joyride's.
-      shepherdContent.insertBefore(shepherdTitle, shepherdContent.firstChild);
-      shepherdContent.insertBefore(tourProgress, shepherdText.nextSibling);
-      shepherdContent.appendChild(shepherdCancel);
-      shepherdContent.querySelector('.shepherd-header').remove();
-      shepherdContent.insertBefore(shepherdNext, tourProgress.nextSibling);
-      shepherdCancel.innerHTML = '<span aria-hidden="true">×</span>';
-      shepherdTitle.classList.add('tour-tip-label');
-
-      // Convert elements to use the tags they used in Joyride.
-      changeTag(shepherdTitle, 'h2');
-
-      // Remove the wrapper Shepherd adds for tip content.
-      shepherdText.outerHTML = shepherdText.innerHTML;
-    }
+    // Remove the wrapper Shepherd adds for tip content.
+    shepherdText.outerHTML = shepherdText.innerHTML;
 
     // Convert the next and cancel buttons to links so they match Joyride's
     // markup. They must be re-queried as they were potentially moved elsewhere
diff --git a/core/themes/stable/js/tour.js b/core/themes/stable/js/tour.js
index fb554afbae..7962bdfdf2 100644
--- a/core/themes/stable/js/tour.js
+++ b/core/themes/stable/js/tour.js
@@ -37,29 +37,15 @@
     shepherdCancel.setAttribute('role', 'button');
     shepherdElement.setAttribute('data-index', shepherdTour.currentStep.options.index);
     shepherdElement.querySelector('footer').remove();
-
-    if (shepherdElement.classList.contains('tip-uses-get-output')) {
-      shepherdText.appendChild(shepherdNext);
-      shepherdText.appendChild(shepherdCancel);
-      shepherdContent.querySelector('.shepherd-header').remove();
-      Array.from(shepherdText.children).forEach(node => {
-        if (node.tagName === 'P' && node.textContent === '' && node.classList.length === 0) {
-          node.remove();
-        }
-      });
-      shepherdContent.innerHTML = shepherdText.innerHTML;
-    } else {
-      shepherdContent.insertBefore(shepherdTitle, shepherdContent.firstChild);
-      shepherdContent.insertBefore(tourProgress, shepherdText.nextSibling);
-      shepherdContent.appendChild(shepherdCancel);
-      shepherdContent.querySelector('.shepherd-header').remove();
-      shepherdContent.insertBefore(shepherdNext, tourProgress.nextSibling);
-      shepherdCancel.innerHTML = '<span aria-hidden="true">×</span>';
-      shepherdTitle.classList.add('tour-tip-label');
-      changeTag(shepherdTitle, 'h2');
-      shepherdText.outerHTML = shepherdText.innerHTML;
-    }
-
+    shepherdContent.insertBefore(shepherdTitle, shepherdContent.firstChild);
+    shepherdContent.insertBefore(tourProgress, shepherdText.nextSibling);
+    shepherdContent.appendChild(shepherdCancel);
+    shepherdContent.querySelector('.shepherd-header').remove();
+    shepherdContent.insertBefore(shepherdNext, tourProgress.nextSibling);
+    shepherdCancel.innerHTML = '<span aria-hidden="true">×</span>';
+    shepherdTitle.classList.add('tour-tip-label');
+    changeTag(shepherdTitle, 'h2');
+    shepherdText.outerHTML = shepherdText.innerHTML;
     changeTag(shepherdElement.querySelector('.joyride-close-tip'), 'a');
     changeTag(shepherdElement.querySelector('.joyride-next-tip'), 'a');
     const shepherdArrow = shepherdElement.querySelector('.shepherd-arrow');
diff --git a/core/themes/stable9/js/tour.es6.js b/core/themes/stable9/js/tour.es6.js
index 6d5e66b506..bca888e343 100644
--- a/core/themes/stable9/js/tour.es6.js
+++ b/core/themes/stable9/js/tour.es6.js
@@ -61,50 +61,21 @@
     );
     shepherdElement.querySelector('footer').remove();
 
-    // If the class list includes `tip-uses-get-output`, then the tip was created
-    // by a deprecated tip plugin. This means the markup has some differences
-    // that require some different steps to rebuild it as Joyride BC markup.
-    // @todo remove the contents of the 'if' in this conditional in
-    //   https://drupal.org/node/3195193.
-    if (shepherdElement.classList.contains('tip-uses-get-output')) {
-      // Move the next button.
-      shepherdText.appendChild(shepherdNext);
 
-      // Move the cancel button and remove the now unnecessary header.
-      shepherdText.appendChild(shepherdCancel);
-      shepherdContent.querySelector('.shepherd-header').remove();
+    // Rearrange elements so their structure matches Joyride's.
+    shepherdContent.insertBefore(shepherdTitle, shepherdContent.firstChild);
+    shepherdContent.insertBefore(tourProgress, shepherdText.nextSibling);
+    shepherdContent.appendChild(shepherdCancel);
+    shepherdContent.querySelector('.shepherd-header').remove();
+    shepherdContent.insertBefore(shepherdNext, tourProgress.nextSibling);
+    shepherdCancel.innerHTML = '<span aria-hidden="true">×</span>';
+    shepherdTitle.classList.add('tour-tip-label');
 
-      // Remove empty paragraphs from the text container markup.
-      Array.from(shepherdText.children).forEach((node) => {
-        if (
-          node.tagName === 'P' &&
-          node.textContent === '' &&
-          node.classList.length === 0
-        ) {
-          node.remove();
-        }
-      });
-
-      // Move the contents of shepherdText directly into shepherdContent to
-      // remove the now redundant `<p>` provided by TipPlugin. Shepherd already
-      // wraps its content in a `<p>`, so the Plugin provided tag is redundant.
-      shepherdContent.innerHTML = shepherdText.innerHTML;
-    } else {
-      // Rearrange elements so their structure matches Joyride's.
-      shepherdContent.insertBefore(shepherdTitle, shepherdContent.firstChild);
-      shepherdContent.insertBefore(tourProgress, shepherdText.nextSibling);
-      shepherdContent.appendChild(shepherdCancel);
-      shepherdContent.querySelector('.shepherd-header').remove();
-      shepherdContent.insertBefore(shepherdNext, tourProgress.nextSibling);
-      shepherdCancel.innerHTML = '<span aria-hidden="true">×</span>';
-      shepherdTitle.classList.add('tour-tip-label');
+    // Convert elements to use the tags they used in Joyride.
+    changeTag(shepherdTitle, 'h2');
 
-      // Convert elements to use the tags they used in Joyride.
-      changeTag(shepherdTitle, 'h2');
-
-      // Remove the wrapper Shepherd adds for tip content.
-      shepherdText.outerHTML = shepherdText.innerHTML;
-    }
+    // Remove the wrapper Shepherd adds for tip content.
+    shepherdText.outerHTML = shepherdText.innerHTML;
 
     // Convert the next and cancel buttons to links so they match Joyride's
     // markup. They must be re-queried as they were potentially moved elsewhere
diff --git a/core/themes/stable9/js/tour.js b/core/themes/stable9/js/tour.js
index fb554afbae..7962bdfdf2 100644
--- a/core/themes/stable9/js/tour.js
+++ b/core/themes/stable9/js/tour.js
@@ -37,29 +37,15 @@
     shepherdCancel.setAttribute('role', 'button');
     shepherdElement.setAttribute('data-index', shepherdTour.currentStep.options.index);
     shepherdElement.querySelector('footer').remove();
-
-    if (shepherdElement.classList.contains('tip-uses-get-output')) {
-      shepherdText.appendChild(shepherdNext);
-      shepherdText.appendChild(shepherdCancel);
-      shepherdContent.querySelector('.shepherd-header').remove();
-      Array.from(shepherdText.children).forEach(node => {
-        if (node.tagName === 'P' && node.textContent === '' && node.classList.length === 0) {
-          node.remove();
-        }
-      });
-      shepherdContent.innerHTML = shepherdText.innerHTML;
-    } else {
-      shepherdContent.insertBefore(shepherdTitle, shepherdContent.firstChild);
-      shepherdContent.insertBefore(tourProgress, shepherdText.nextSibling);
-      shepherdContent.appendChild(shepherdCancel);
-      shepherdContent.querySelector('.shepherd-header').remove();
-      shepherdContent.insertBefore(shepherdNext, tourProgress.nextSibling);
-      shepherdCancel.innerHTML = '<span aria-hidden="true">×</span>';
-      shepherdTitle.classList.add('tour-tip-label');
-      changeTag(shepherdTitle, 'h2');
-      shepherdText.outerHTML = shepherdText.innerHTML;
-    }
-
+    shepherdContent.insertBefore(shepherdTitle, shepherdContent.firstChild);
+    shepherdContent.insertBefore(tourProgress, shepherdText.nextSibling);
+    shepherdContent.appendChild(shepherdCancel);
+    shepherdContent.querySelector('.shepherd-header').remove();
+    shepherdContent.insertBefore(shepherdNext, tourProgress.nextSibling);
+    shepherdCancel.innerHTML = '<span aria-hidden="true">×</span>';
+    shepherdTitle.classList.add('tour-tip-label');
+    changeTag(shepherdTitle, 'h2');
+    shepherdText.outerHTML = shepherdText.innerHTML;
     changeTag(shepherdElement.querySelector('.joyride-close-tip'), 'a');
     changeTag(shepherdElement.querySelector('.joyride-next-tip'), 'a');
     const shepherdArrow = shepherdElement.querySelector('.shepherd-arrow');
