diff --git a/src/Panelizer.php b/src/Panelizer.php
index bfe929b..36207d9 100644
--- a/src/Panelizer.php
+++ b/src/Panelizer.php
@@ -7,6 +7,7 @@
 namespace Drupal\panelizer;
 
 
+use Drupal\Component\Plugin\Exception\PluginNotFoundException;
 use Drupal\Core\Entity\Display\EntityViewDisplayInterface;
 use Drupal\Core\Entity\EntityFieldManagerInterface;
 use Drupal\Core\Entity\EntityInterface;
@@ -559,9 +560,13 @@ class Panelizer implements PanelizerInterface {
   public function getPermissions() {
     $permissions = [];
 
-    $definitions = $this->panelizerEntityManager->getDefinitions();
-    foreach (array_keys($definitions) as $entity_type_id) {
-      $entity_type = $this->entityTypeManager->getDefinition($entity_type_id);
+    // Only look at entity types that have a corresponding Panelizer plugin.
+    $entity_types = array_intersect_key(
+      $this->entityTypeManager->getDefinitions(),
+      $this->panelizerEntityManager->getDefinitions()
+    );
+
+    foreach ($entity_types as $entity_type_id => $entity_type) {
       $bundles = $this->entityTypeBundleInfo->getBundleInfo($entity_type_id);
       foreach ($bundles as $bundle => $bundle_info) {
         $permissions["administer panelizer $entity_type_id $bundle defaults"] = [
diff --git a/src/Plugin/PanelizerEntity/PanelizerTerm.php b/src/Plugin/PanelizerEntity/PanelizerTerm.php
new file mode 100644
index 0000000..1c5f4f6
--- /dev/null
+++ b/src/Plugin/PanelizerEntity/PanelizerTerm.php
@@ -0,0 +1,57 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\panelizer\Plugin\PanelizerEntity\PanelizerTerm.
+ */
+
+namespace Drupal\panelizer\Plugin\PanelizerEntity;
+
+use Drupal\Core\Entity\Display\EntityViewDisplayInterface;
+use Drupal\Core\Entity\EntityInterface;
+use Drupal\panelizer\Plugin\PanelizerEntityBase;
+use Drupal\panels\Plugin\DisplayVariant\PanelsDisplayVariant;
+
+/**
+ * Panelizer entity plugin for integrating with taxonomy terms.
+ *
+ * @PanelizerEntity("taxonomy_term")
+ */
+class PanelizerTerm extends PanelizerEntityBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getDefaultDisplay(EntityViewDisplayInterface $display, $bundle, $view_mode) {
+    $panels_display = parent::getDefaultDisplay($display, $bundle, $view_mode)
+      ->setPageTitle('[term:name]');
+
+    // Remove the 'name' block because it's covered already.
+    foreach ($panels_display->getRegionAssignments() as $region => $blocks) {
+      /** @var \Drupal\Core\Block\BlockPluginInterface[] $blocks */
+      foreach ($blocks as $block_id => $block) {
+        if ($block->getPluginId() == 'entity_field:taxonomy_term:name') {
+          $panels_display->removeBlock($block_id);
+        }
+      }
+    }
+
+    return $panels_display;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function alterBuild(array &$build, EntityInterface $entity, PanelsDisplayVariant $panels_display, $view_mode) {
+    /** @var $entity \Drupal\taxonomy\Entity\Term */
+    parent::alterBuild($build, $entity, $panels_display, $view_mode);
+
+    if ($entity->id()) {
+      $build['#contextual_links']['taxonomy_term'] = array(
+        'route_parameters' =>array('taxonomy_term' => $entity->id()),
+        'metadata' => array('changed' => $entity->getChangedTime()),
+      );
+    }
+  }
+
+}
diff --git a/src/Tests/PanelizerTermFunctionalTest.php b/src/Tests/PanelizerTermFunctionalTest.php
new file mode 100644
index 0000000..cf76600
--- /dev/null
+++ b/src/Tests/PanelizerTermFunctionalTest.php
@@ -0,0 +1,114 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\panelizer\Tests\PanelizerTermFunctionalTest.
+ */
+
+namespace Drupal\panelizer\Tests;
+
+use Drupal\simpletest\WebTestBase;
+use Drupal\taxonomy\Entity\Term;
+
+/**
+ * Basic functional tests of using Panelizer with taxonomy terms.
+ *
+ * @group panelizer
+ */
+class PanelizerTermFunctionalTest extends WebTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected $profile = 'standard';
+
+  /**
+   * {@inheritdoc}
+   */
+  public static $modules = [
+    'block',
+    'ctools',
+    'ctools_block',
+    'layout_plugin',
+    'taxonomy',
+    'panelizer',
+    'panelizer_test',
+    'panels',
+    'panels_ipe',
+  ];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    $user = $this->drupalCreateUser([
+      'administer taxonomy',
+      'administer taxonomy_term display',
+      'edit terms in tags',
+      'administer panelizer',
+      'access panels in-place editing',
+      'administer taxonomy_term fields',
+    ]);
+    $this->drupalLogin($user);
+
+    $this->drupalPostForm('admin/structure/taxonomy/manage/tags/overview/display', [
+      'panelizer[enable]' => TRUE,
+      'panelizer[custom]' => TRUE,
+    ], 'Save');
+    $this->rebuildAll();
+  }
+
+  /**
+   * Tests rendering a taxonomy term with Panelizer default.
+   */
+  public function testPanelizerDefault() {
+    /** @var \Drupal\panelizer\PanelizerInterface $panelizer */
+    $panelizer = \Drupal::service('panelizer');
+    $displays = $panelizer->getDefaultPanelsDisplays('taxonomy_term', 'tags', 'default');
+    $display = $displays['default'];
+    $display->addBlock([
+      'id' => 'panelizer_test',
+      'label' => 'Panelizer test',
+      'provider' => 'block_content',
+      'region' => 'middle',
+    ]);
+    $panelizer->setDefaultPanelsDisplay('default', 'taxonomy_term', 'tags', 'default', $display);
+
+    // Create a term, and check that the IPE is visible on it.
+    $term = $this->createTerm();
+
+    $out = $this->drupalGet('taxonomy/term/' . $term->id());
+    $this->verbose($out);
+    $elements = $this->xpath('//*[@id="panels-ipe-content"]');
+    if (is_array($elements)) {
+      $this->assertIdentical(count($elements), 1);
+    }
+    else {
+      $this->fail('Could not parse page content.');
+    }
+
+    // Check that the block we added is visible.
+    $this->assertText('Panelizer test');
+    $this->assertText('Abracadabra');
+  }
+
+  /**
+   * Create a term.
+   *
+   * @return Term;
+   */
+  protected function createTerm() {
+    $settings = [
+      'description' => [['value' => $this->randomMachineName(32)]],
+      'name' => $this->randomMachineName(8),
+      'vid' => 'tags',
+      'uid' => \Drupal::currentUser()->id(),
+    ];
+    $term = Term::create($settings);
+    $term->save();
+    return $term;
+  }
+
+}
