diff --git a/page_manager.info.yml b/page_manager.info.yml
index 3a26fe5..cee16d7 100644
--- a/page_manager.info.yml
+++ b/page_manager.info.yml
@@ -6,3 +6,4 @@ version: VERSION
 core: 8.x
 dependencies:
   - block
+  - ctools
diff --git a/src/Entity/Page.php b/src/Entity/Page.php
index b73ebc5..39ab910 100644
--- a/src/Entity/Page.php
+++ b/src/Entity/Page.php
@@ -11,7 +11,7 @@ use Drupal\page_manager\PageInterface;
 use Drupal\Core\Condition\ConditionPluginCollection;
 use Drupal\Core\Config\Entity\ConfigEntityBase;
 use Drupal\Core\Entity\EntityStorageInterface;
-use Drupal\page_manager\Plugin\VariantAwareTrait;
+use Drupal\ctools\Plugin\VariantCollectionTrait;
 
 /**
  * Defines a Page entity class.
@@ -55,7 +55,7 @@ use Drupal\page_manager\Plugin\VariantAwareTrait;
  */
 class Page extends ConfigEntityBase implements PageInterface {
 
-  use VariantAwareTrait;
+  use VariantCollectionTrait;
 
   /**
    * The ID of the page entity.
diff --git a/src/PageInterface.php b/src/PageInterface.php
index 59bc383..91cd09c 100644
--- a/src/PageInterface.php
+++ b/src/PageInterface.php
@@ -9,12 +9,12 @@ namespace Drupal\page_manager;
 
 use Drupal\Core\Config\Entity\ConfigEntityInterface;
 use Drupal\Core\Entity\EntityWithPluginCollectionInterface;
-use Drupal\page_manager\Plugin\VariantAwareInterface;
+use Drupal\ctools\Plugin\VariantCollectionInterface;
 
 /**
  * Provides an interface for page entities.
  */
-interface PageInterface extends ConfigEntityInterface, EntityWithPluginCollectionInterface, VariantAwareInterface {
+interface PageInterface extends ConfigEntityInterface, EntityWithPluginCollectionInterface, VariantCollectionInterface {
 
   /**
    * Returns whether the page entity is enabled.
diff --git a/src/Plugin/VariantAwareInterface.php b/src/Plugin/VariantAwareInterface.php
deleted file mode 100644
index 0226fb7..0000000
--- a/src/Plugin/VariantAwareInterface.php
+++ /dev/null
@@ -1,54 +0,0 @@
-<?php
-/**
- * @file
- * Contains \Drupal\page_manager\Plugin\VariantAwareInterface.
- */
-
-namespace Drupal\page_manager\Plugin;
-
-/**
- * Provides an interface for objects that have variants e.g. Pages.
- */
-interface VariantAwareInterface {
-
-  /**
-   * Adds a new variant to the entity.
-   *
-   * @param array $configuration
-   *   An array of configuration for the new variant.
-   *
-   * @return string
-   *   The variant ID.
-   */
-  public function addVariant(array $configuration);
-
-  /**
-   * Retrieves a specific variant.
-   *
-   * @param string $variant_id
-   *   The variant ID.
-   *
-   * @return \Drupal\Core\Display\VariantInterface
-   *   The variant object.
-   */
-  public function getVariant($variant_id);
-
-  /**
-   * Removes a specific variant.
-   *
-   * @param string $variant_id
-   *   The variant ID.
-   *
-   * @return $this
-   */
-  public function removeVariant($variant_id);
-
-  /**
-   * Returns the variants available for the entity.
-   *
-   * @return \Drupal\Core\Display\VariantInterface[]
-   *   An array of the variants.
-   */
-  public function getVariants();
-
-}
diff --git a/src/Plugin/VariantAwareTrait.php b/src/Plugin/VariantAwareTrait.php
deleted file mode 100644
index 95677a9..0000000
--- a/src/Plugin/VariantAwareTrait.php
+++ /dev/null
@@ -1,71 +0,0 @@
-<?php
-/**
- * @file
- * Contains \Drupal\page_manager\Plugin\VariantAwareTrait.
- */
-
-namespace Drupal\page_manager\Plugin;
-
-/**
- * Provides methods for Page Manager entities that need to handle its variants.
- */
-trait VariantAwareTrait {
-
-  /**
-   * The plugin collection that holds the variants.
-   *
-   * @var \Drupal\page_manager\Plugin\VariantCollection
-   */
-  protected $variantCollection;
-
-  /**
-   * @see \Drupal\page_manager\Plugin\VariantAwareInterface::addVariant()
-   */
-  public function addVariant(array $configuration) {
-    $configuration['uuid'] = $this->uuidGenerator()->generate();
-    $this->getVariants()->addInstanceId($configuration['uuid'], $configuration);
-    return $configuration['uuid'];
-  }
-
-  /**
-   * @see \Drupal\page_manager\Plugin\VariantAwareInterface::getVariant()
-   */
-  public function getVariant($variant_id) {
-    return $this->getVariants()->get($variant_id);
-  }
-
-  /**
-   * @see \Drupal\page_manager\Plugin\VariantAwareInterface::removeVariant()
-   */
-  public function removeVariant($variant_id) {
-    $this->getVariants()->removeInstanceId($variant_id);
-    return $this;
-  }
-
-  /**
-   * @see \Drupal\page_manager\Plugin\VariantAwareInterface::getVariants()
-   */
-  public function getVariants() {
-    if (!$this->variantCollection) {
-      $this->variantCollection = new VariantCollection(\Drupal::service('plugin.manager.display_variant'), $this->getVariantConfig());
-      $this->variantCollection->sort();
-    }
-    return $this->variantCollection;
-  }
-
-  /**
-   * Returns the configuration for stored variants.
-   *
-   * @return array
-   *   An array of variant configuration, keyed by the unique variant ID.
-   */
-  abstract protected function getVariantConfig();
-
-  /**
-   * Returns the UUID generator.
-   *
-   * @return \Drupal\Component\Uuid\UuidInterface
-   */
-  abstract protected function uuidGenerator();
-
-}
diff --git a/tests/src/Unit/VariantAwareTraitTest.php b/tests/src/Unit/VariantAwareTraitTest.php
deleted file mode 100644
index bacdd59..0000000
--- a/tests/src/Unit/VariantAwareTraitTest.php
+++ /dev/null
@@ -1,214 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\Tests\page_manager\Unit\VariantAwareTraitTest.
- */
-
-namespace Drupal\Tests\page_manager\Unit;
-
-use Drupal\Component\Plugin\PluginManagerInterface;
-use Drupal\Component\Uuid\UuidInterface;
-use Drupal\Core\DependencyInjection\ContainerBuilder;
-use Drupal\Core\Display\VariantInterface;
-use Drupal\page_manager\Plugin\VariantAwareTrait;
-use Drupal\page_manager\Plugin\VariantCollection;
-use Drupal\Tests\UnitTestCase;
-use Prophecy\Argument;
-
-/**
- * Tests the methods of a variant-aware class.
- *
- * @coversDefaultClass \Drupal\page_manager\Plugin\VariantAwareTrait
- *
- * @group PageManager
- */
-class VariantAwareTraitTest extends UnitTestCase {
-
-  /**
-   * @var \Drupal\Component\Plugin\PluginManagerInterface|\PHPUnit_Framework_MockObject_MockObject
-   */
-  protected $manager;
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function setUp() {
-    parent::setUp();
-    $container = new ContainerBuilder();
-    $this->manager = $this->prophesize(PluginManagerInterface::class);
-    $container->set('plugin.manager.display_variant', $this->manager->reveal());
-    \Drupal::setContainer($container);
-  }
-
-  /**
-   * @covers ::getVariants
-   */
-  public function testGetVariantsEmpty() {
-    $trait_object = new TestVariantAwareTrait();
-    $this->manager->createInstance()->shouldNotBeCalled();
-
-    $variants = $trait_object->getVariants();
-    $this->assertInstanceOf(VariantCollection::class, $variants);
-    $this->assertSame(0, count($variants));
-  }
-
-  /**
-   * @covers ::getVariants
-   */
-  public function testGetVariants() {
-    $trait_object = new TestVariantAwareTrait();
-    $config = [
-      'foo' => ['id' => 'foo_plugin'],
-      'bar' => ['id' => 'bar_plugin'],
-    ];
-    foreach ($config as $value) {
-      $plugin = $this->prophesize(VariantInterface::class);
-      $this->manager->createInstance($value['id'], $value)->willReturn($plugin->reveal());
-    }
-    $trait_object->setVariantConfig($config);
-
-    $variants = $trait_object->getVariants();
-    $this->assertInstanceOf(VariantCollection::class, $variants);
-    $this->assertSame(2, count($variants));
-    return $variants;
-  }
-
-  /**
-   * @covers ::getVariants
-   *
-   * @depends testGetVariants
-   */
-  public function testGetVariantsSort(VariantCollection $variants) {
-    $this->assertSame(['bar' => 'bar', 'foo' => 'foo'], $variants->getInstanceIds());
-  }
-
-  /**
-   * @covers ::addVariant
-   */
-  public function testAddVariant() {
-    $config = ['id' => 'foo'];
-    $uuid = 'test-uuid';
-    $expected_config = $config + ['uuid' => $uuid];
-
-    $uuid_generator = $this->prophesize(UuidInterface::class);
-    $uuid_generator->generate()
-      ->willReturn($uuid)
-      ->shouldBeCalledTimes(1);
-    $trait_object = new TestVariantAwareTrait();
-    $trait_object->setUuidGenerator($uuid_generator->reveal());
-
-    $plugin_prophecy = $this->prophesize(VariantInterface::class);
-    $plugin_prophecy->getConfiguration()
-      ->willReturn($expected_config)
-      ->shouldBeCalled();
-    $plugin_prophecy->setConfiguration($expected_config)
-      ->willReturn($expected_config)
-      ->shouldBeCalled();
-
-    $this->manager->createInstance('foo', $expected_config)
-      ->willReturn($plugin_prophecy->reveal());
-
-    $resulting_uuid = $trait_object->addVariant($config);
-    $this->assertSame($uuid, $resulting_uuid);
-
-    $variants = $trait_object->getVariants();
-    $this->assertSame([$uuid => $uuid], $variants->getInstanceIds());
-    $this->assertSame([$uuid => $expected_config], $variants->getConfiguration());
-    $this->assertSame($plugin_prophecy->reveal(), $variants->get($uuid));
-    return [$trait_object, $uuid, $plugin_prophecy->reveal()];
-  }
-
-  /**
-   * @covers ::getVariant
-   *
-   * @depends testAddVariant
-   */
-  public function testGetVariant($data) {
-    list($trait_object, $uuid, $plugin) = $data;
-    $this->manager->createInstance()->shouldNotBeCalled();
-
-    $this->assertSame($plugin, $trait_object->getVariant($uuid));
-    return [$trait_object, $uuid];
-  }
-
-  /**
-   * @covers ::removeVariant
-   *
-   * @depends testGetVariant
-   */
-  public function testRemoveVariant($data) {
-    list($trait_object, $uuid) = $data;
-
-    $this->assertSame($trait_object, $trait_object->removeVariant($uuid));
-    $this->assertFalse($trait_object->getVariants()->has($uuid));
-    return [$trait_object, $uuid];
-  }
-
-  /**
-   * @covers ::getVariant
-   *
-   * @depends testRemoveVariant
-   *
-   * @expectedException \Drupal\Component\Plugin\Exception\PluginNotFoundException
-   * @expectedExceptionMessage Plugin ID 'test-uuid' was not found.
-   */
-  public function testGetVariantException($data) {
-    list($trait_object, $uuid) = $data;
-    // Attempt to retrieve a variant that has been removed.
-    $this->assertNull($trait_object->getVariant($uuid));
-  }
-
-}
-
-class TestVariantAwareTrait {
-  use VariantAwareTrait;
-
-  /**
-   * @var array
-   */
-  protected $variantConfig = [];
-
-  /**
-   * @var \Drupal\Component\Uuid\UuidInterface
-   */
-  protected $uuidGenerator;
-
-  /**
-   * @param \Drupal\Component\Uuid\UuidInterface $uuid_generator
-   *
-   * @return $this
-   */
-  public function setUuidGenerator(UuidInterface $uuid_generator) {
-    $this->uuidGenerator = $uuid_generator;
-    return $this;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function uuidGenerator() {
-    return $this->uuidGenerator;
-  }
-
-  /**
-   * Sets the variant configuration.
-   *
-   * @param array $config
-   *   The variant configuration.
-   *
-   * @return $this
-   */
-  public function setVariantConfig(array $config) {
-    $this->variantConfig = $config;
-    return $this;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function getVariantConfig() {
-    return $this->variantConfig;
-  }
-
-}
