diff --git a/modules/wysiwyg_template_core/src/Plugin/Filter/FilterTemplates.php b/modules/wysiwyg_template_core/src/Plugin/Filter/FilterTemplates.php
new file mode 100644
index 0000000..44606f1
--- /dev/null
+++ b/modules/wysiwyg_template_core/src/Plugin/Filter/FilterTemplates.php
@@ -0,0 +1,36 @@
+<?php
+/**
+ * @file
+ * Contains \Drupal\wysiwyg_template_core\Plugin\Filter\FilterTemplates.php
+ */
+
+namespace Drupal\wysiwyg_template_core\Plugin\Filter;
+
+use Drupal\filter\FilterProcessResult;
+use Drupal\filter\Plugin\FilterBase;
+
+/**
+ * Provides a filter to remove WYSIWYG-specific markup from rendering.
+ *
+ * @Filter(
+ *   id = "filter_wysiwyg_cleanup",
+ *   title = @Translation("Cleanup WYSIWYG templates"),
+ *   description = @Translation("Wysiwyg templates can contain code and attributes that are important for editing but should be removed on public pages."),
+ *   type = Drupal\filter\Plugin\FilterInterface::TYPE_HTML_RESTRICTOR,
+ *   weight = 10
+ * )
+ */
+class FilterTemplates extends FilterBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function process($text, $langcode) {
+    // @todo While this was how the filter worked in 7.x, this should be ported
+    // to use the attribute filtering logic in core.
+    // @see \Drupal\filter\Plugin\Filter\FilterHtml
+    $text = str_replace(['contenteditable="true"', 'contenteditable="false"'], '', $text);
+    return new FilterProcessResult($text);
+  }
+
+}
diff --git a/modules/wysiwyg_template_core/tests/src/Kernel/Plugin/Filter/FilterTemplatesTest.php b/modules/wysiwyg_template_core/tests/src/Kernel/Plugin/Filter/FilterTemplatesTest.php
new file mode 100644
index 0000000..880f7f5
--- /dev/null
+++ b/modules/wysiwyg_template_core/tests/src/Kernel/Plugin/Filter/FilterTemplatesTest.php
@@ -0,0 +1,80 @@
+<?php
+/**
+ * @file
+ * Contains \Drupal\Tests\wysiwyg_template_core\Kernel\Plugin\Filter\FilterTemplatesTest.
+ */
+
+namespace Drupal\Tests\wysiwyg_template_core\Kernel\Plugin\Filter;
+
+use Drupal\filter\FilterPluginCollection;
+use Drupal\KernelTests\KernelTestBase;
+
+/**
+ * Tests the WYSIWYG cleanup filter.
+ *
+ * @group wysiwyg_template
+ *
+ * @coversDefaultClass \Drupal\wysiwyg_template_core\Plugin\Filter\FilterTemplates
+ */
+class FilterTemplatesTest extends KernelTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static $modules = ['filter', 'wysiwyg_template'];
+
+  /**
+   * The WYSIWYG filter to test.
+   *
+   * @var \Drupal\filter\Plugin\FilterInterface
+   */
+  protected $filter;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setUp() {
+    parent::setUp();
+
+    /** @var \Drupal\filter\FilterPluginManager $manager */
+    $manager = $this->container->get('plugin.manager.filter');
+    $bag = new FilterPluginCollection($manager, []);
+    $this->filter = $bag->getAll()['filter_wysiwyg_cleanup'];
+  }
+
+  /**
+   * Tests that the WYSIWYG-specific attributes are removed.
+   *
+   * @param $input
+   *   Input to test.
+   * @param $expected
+   *   Expected filtered result.
+   *
+   * @covers ::process
+   *
+   * @dataProvider providerTestFilter
+   */
+  public function testFilter($input, $expected) {
+    $filter = $this->filter;
+    $test = function($input) use ($filter) {
+      return $this->filter->process($input, 'und');
+    };
+    $this->assertSame($expected, $test($input)->getProcessedText());
+  }
+
+  /**
+   * Data provider for the testFilter method.
+   *
+   * @return array
+   *   Array of data sets to test with.
+   */
+  public function providerTestFilter() {
+    return [
+      // Raw, expected.
+      ['<img src="llama.jpg" />', '<img src="llama.jpg" />'],
+      ['<img src="llama.jpg" contenteditable="true" />', '<img src="llama.jpg"  />'],
+      ['<img src="llama.jpg" contenteditable="false" />', '<img src="llama.jpg"  />'],
+    ];
+  }
+
+}
diff --git a/src/Plugin/Filter/FilterTemplates.php b/src/Plugin/Filter/FilterTemplates.php
deleted file mode 100644
index bfd0e86..0000000
--- a/src/Plugin/Filter/FilterTemplates.php
+++ /dev/null
@@ -1,36 +0,0 @@
-<?php
-/**
- * @file
- * Contains \Drupal\wysiwyg_template\Plugin\Filter\FilterTemplates.php
- */
-
-namespace Drupal\wysiwyg_template\Plugin\Filter;
-
-use Drupal\filter\FilterProcessResult;
-use Drupal\filter\Plugin\FilterBase;
-
-/**
- * Provides a filter to remove WYSIWYG-specific markup from rendering.
- *
- * @Filter(
- *   id = "filter_wysiwyg_cleanup",
- *   title = @Translation("Cleanup WYSIWYG templates"),
- *   description = @Translation("Wysiwyg templates can contain code and attributes that are important for editing but should be removed on public pages."),
- *   type = Drupal\filter\Plugin\FilterInterface::TYPE_HTML_RESTRICTOR,
- *   weight = 10
- * )
- */
-class FilterTemplates extends FilterBase {
-
-  /**
-   * {@inheritdoc}
-   */
-  public function process($text, $langcode) {
-    // @todo While this was how the filter worked in 7.x, this should be ported
-    // to use the attribute filtering logic in core.
-    // @see \Drupal\filter\Plugin\Filter\FilterHtml
-    $text = str_replace(['contenteditable="true"', 'contenteditable="false"'], '', $text);
-    return new FilterProcessResult($text);
-  }
-
-}
diff --git a/tests/src/Kernel/Plugin/Filter/FilterTemplatesTest.php b/tests/src/Kernel/Plugin/Filter/FilterTemplatesTest.php
deleted file mode 100644
index 64815e5..0000000
--- a/tests/src/Kernel/Plugin/Filter/FilterTemplatesTest.php
+++ /dev/null
@@ -1,80 +0,0 @@
-<?php
-/**
- * @file
- * Contains \Drupal\Tests\wysiwyg_template\Kernel\Plugin\Filter\FilterTemplatesTest.
- */
-
-namespace Drupal\Tests\wysiwyg_template\Kernel\Plugin\Filter;
-
-use Drupal\filter\FilterPluginCollection;
-use Drupal\KernelTests\KernelTestBase;
-
-/**
- * Tests the WYSIWYG cleanup filter.
- *
- * @group wysiwyg_template
- *
- * @coversDefaultClass \Drupal\wysiwyg_template\Plugin\Filter\FilterTemplates
- */
-class FilterTemplatesTest extends KernelTestBase {
-
-  /**
-   * {@inheritdoc}
-   */
-  public static $modules = ['filter', 'wysiwyg_template'];
-
-  /**
-   * The WYSIWYG filter to test.
-   *
-   * @var \Drupal\filter\Plugin\FilterInterface
-   */
-  protected $filter;
-
-  /**
-   * {@inheritdoc}
-   */
-  public function setUp() {
-    parent::setUp();
-
-    /** @var \Drupal\filter\FilterPluginManager $manager */
-    $manager = $this->container->get('plugin.manager.filter');
-    $bag = new FilterPluginCollection($manager, []);
-    $this->filter = $bag->getAll()['filter_wysiwyg_cleanup'];
-  }
-
-  /**
-   * Tests that the WYSIWYG-specific attributes are removed.
-   *
-   * @param $input
-   *   Input to test.
-   * @param $expected
-   *   Expected filtered result.
-   *
-   * @covers ::process
-   *
-   * @dataProvider providerTestFilter
-   */
-  public function testFilter($input, $expected) {
-    $filter = $this->filter;
-    $test = function($input) use ($filter) {
-      return $this->filter->process($input, 'und');
-    };
-    $this->assertSame($expected, $test($input)->getProcessedText());
-  }
-
-  /**
-   * Data provider for the testFilter method.
-   *
-   * @return array
-   *   Array of data sets to test with.
-   */
-  public function providerTestFilter() {
-    return [
-      // Raw, expected.
-      ['<img src="llama.jpg" />', '<img src="llama.jpg" />'],
-      ['<img src="llama.jpg" contenteditable="true" />', '<img src="llama.jpg"  />'],
-      ['<img src="llama.jpg" contenteditable="false" />', '<img src="llama.jpg"  />'],
-    ];
-  }
-
-}
diff --git a/wysiwyg_template.info.yml b/wysiwyg_template.info.yml
index ce46db3..141bbe3 100644
--- a/wysiwyg_template.info.yml
+++ b/wysiwyg_template.info.yml
@@ -3,3 +3,5 @@ description: 'Makes the template features for TinyMCE, CK Editor and FCK Editor
 core: 8.x
 package: 'User interface'
 type: module
+dependencies:
+  - wysiwyg_template_core
