diff --git a/src/Plugin/DisplayVariant/PanelsDisplayVariant.php b/src/Plugin/DisplayVariant/PanelsDisplayVariant.php
index 6ced17a..3a895dd 100644
--- a/src/Plugin/DisplayVariant/PanelsDisplayVariant.php
+++ b/src/Plugin/DisplayVariant/PanelsDisplayVariant.php
@@ -7,7 +7,9 @@
 
 namespace Drupal\panels\Plugin\DisplayVariant;
 
+use Drupal\Component\Utility\NestedArray;
 use Drupal\Component\Uuid\UuidInterface;
+use Drupal\Core\Form\FormState;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Plugin\Context\ContextHandlerInterface;
 use Drupal\Core\Session\AccountInterface;
@@ -127,7 +129,7 @@ class PanelsDisplayVariant extends BlockDisplayVariant {
    */
   public function getLayout() {
     if (!isset($this->layout)) {
-      $this->layout = $this->layoutManager->createInstance($this->configuration['layout'], []);
+      $this->layout = $this->layoutManager->createInstance($this->configuration['layout'], $this->configuration['layout_settings']);
     }
     return $this->layout;
   }
@@ -166,7 +168,7 @@ class PanelsDisplayVariant extends BlockDisplayVariant {
       '#default_value' => $this->configuration['page_title'] ?: '',
     ];
 
-    if (!$this->id()) {
+    if (empty($this->configuration['builder'])) {
       $plugins = $this->builderManager->getDefinitions();
       $options = array();
       foreach ($plugins as $id => $plugin) {
@@ -178,6 +180,9 @@ class PanelsDisplayVariant extends BlockDisplayVariant {
         '#options' => $options,
         '#default_value' => 'standard',
       ];
+    }
+
+    if (empty($this->configuration['layout'])) {
 
       $form['layout'] = [
         '#title' => $this->t('Layout'),
@@ -186,11 +191,86 @@ class PanelsDisplayVariant extends BlockDisplayVariant {
         '#default_value' => NULL
       ];
     }
+    else {
+      $form['layout'] = [
+        '#type' => 'value',
+        '#value' => $this->configuration['layout'],
+      ];
+
+      // If a layout is already selected, show the layout settings.
+      $form['layout_settings_wrapper'] = [
+        '#type' => 'fieldset',
+        '#title' => $this->t('Layout settings'),
+      ];
+      $form['layout_settings_wrapper']['layout_settings'] = [];
+
+      // Get settings form from layout plugin.
+      $layout = $this->layoutManager->createInstance($this->configuration['layout'], $this->configuration['layout_settings'] ?: []);
+      $form['layout_settings_wrapper']['layout_settings'] = $layout->buildConfigurationForm($form['layout_settings_wrapper']['layout_settings'], $form_state);
+
+      // Process callback to configure #parents correctly on settings, since
+      // we don't know where in the form hierarchy our settings appear.
+      $form['#process'][] = [$this, 'layoutSettingsProcessCallback'];
+    }
 
     return $form;
   }
 
   /**
+   * Form API #process callback: expands form with hierarchy information.
+   */
+  public function layoutSettingsProcessCallback(array &$element, FormStateInterface $form_state, array &$complete_form) {
+    $settings_element =& $element['layout_settings_wrapper']['layout_settings'];
+
+    // Set the #parents on the layout_settings so they end up as a sibling of
+    // layout.
+    $layout_settings_parents = array_merge($element['#parents'], ['layout_settings']);
+    $settings_element['#parents'] = $layout_settings_parents;
+    $settings_element['#tree'] = TRUE;
+
+    // Store the array parents for our element so that we can use it to pull out
+    // the layout settings in the validate and submit functions.
+    $complete_form['#variant_array_parents'] = $element['#array_parents'];
+
+    return $element;
+  }
+
+  /**
+   * Extracts the layout settings form and form state from the full form.
+   *
+   * @param array $form
+   *   Full form array.
+   * @param \Drupal\Core\Form\FormStateInterface $form_state
+   *   Full form state.
+   *
+   * @return array
+   *   An array with two values: the new form array and form state object.
+   */
+  protected function getLayoutSettingsForm(array &$form, FormStateInterface $form_state) {
+    $layout_settings_form = NestedArray::getValue($form, array_merge($form['#variant_array_parents'], ['layout_settings_wrapper', 'layout_settings']));
+    $layout_settings_form_state = (new FormState())->setValues($form_state->getValue('layout_settings'));
+    return [$layout_settings_form, $layout_settings_form_state];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function validateConfigurationForm(array &$form, FormStateInterface $form_state) {
+    parent::validateConfigurationForm($form, $form_state);
+
+    // Validate layout settings.
+    if ($form_state->hasValue('layout_settings')) {
+      $layout = $this->layoutManager->createInstance($form_state->getValue('layout'), $this->configuration['layout_settings']);
+      list ($layout_settings_form, $layout_settings_form_state) = $this->getLayoutSettingsForm($form, $form_state);
+      $layout->validateConfigurationForm($layout_settings_form, $layout_settings_form_state);
+
+      // Save the layout plugin for later (so we don't have to instantiate again
+      // on submit.
+      $form_state->set('layout_plugin', $layout);
+    }
+  }
+
+  /**
    * {@inheritdoc}
    */
   public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
@@ -200,6 +280,14 @@ class PanelsDisplayVariant extends BlockDisplayVariant {
       $this->configuration['layout'] = $form_state->getValue('layout');
     }
 
+    // Submit layout settings.
+    if ($form_state->hasValue('layout_settings')) {
+      $layout = $form_state->has('layout_plugin') ? $form_state->get('layout_plugin') : $this->getLayout();
+      list ($layout_settings_form, $layout_settings_form_state) = $this->getLayoutSettingsForm($form, $form_state);
+      $layout->submitConfigurationForm($layout_settings_form, $layout_settings_form_state);
+      $this->configuration['layout_settings'] = $layout->getConfiguration();
+    }
+
     if ($form_state->hasValue('builder')) {
       $this->configuration['builder'] = $form_state->getValue('builder');
     }
@@ -227,6 +315,7 @@ class PanelsDisplayVariant extends BlockDisplayVariant {
   public function defaultConfiguration() {
     return parent::defaultConfiguration() + [
       'layout' => '',
+      'layout_settings' => [],
       'page_title' => '',
     ];
   }
diff --git a/src/Tests/PanelsTest.php b/src/Tests/PanelsTest.php
new file mode 100644
index 0000000..5a167cd
--- /dev/null
+++ b/src/Tests/PanelsTest.php
@@ -0,0 +1,96 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\panels\Tests\PanelsTest.
+ */
+
+namespace Drupal\panels\Tests;
+
+use Drupal\simpletest\WebTestBase;
+
+/**
+ * Tests using PanelsVariant with page_manager.
+ *
+ * @group panels
+ */
+class PanelsTest extends WebTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected $strictConfigSchema = FALSE;
+
+  /**
+   * {@inheritdoc}
+   */
+  public static $modules = ['block', 'page_manager', 'panels', 'layout_plugin_example'];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    $this->drupalPlaceBlock('local_tasks_block');
+    $this->drupalPlaceBlock('local_actions_block');
+    $this->drupalPlaceBlock('system_branding_block');
+    $this->drupalPlaceBlock('page_title_block');
+
+    \Drupal::service('theme_handler')->install(['bartik', 'classy']);
+    $this->config('system.theme')->set('admin', 'classy')->save();
+
+    $this->drupalLogin($this->drupalCreateUser(['administer pages', 'access administration pages', 'view the administration theme']));
+  }
+
+  /**
+   * Tests adding a layout with settings.
+   */
+  public function testLayoutSettings() {
+    // Create new page.
+    $this->drupalGet('admin/structure/page_manager/add');
+    $edit = [
+      'id' => 'foo',
+      'label' => 'foo',
+      'path' => 'testing',
+    ];
+    $this->drupalPostForm(NULL, $edit, 'Save');
+
+    // Add variant with a layout that has settings.
+    $this->clickLink('Add new variant');
+    $this->clickLink('Panels');
+    $edit = [
+      'id' => 'panels_1',
+      'label' => 'Default',
+      'variant_settings[layout]' => 'layout_example_test',
+    ];
+    $this->drupalPostForm(NULL, $edit, 'Save');
+
+    // Add a block.
+    $this->clickLink('Add new block');
+    $this->clickLink('Powered by Drupal');
+    $edit = [
+      'region' => 'top',
+    ];
+    $this->drupalPostForm(NULL, $edit, 'Add block');
+
+    // Check the default value and change a layout setting.
+    $this->assertText('Blah');
+    $this->assertFieldByName("variant_settings[layout_settings][setting_1]", "Default");
+    $edit = [
+      'variant_settings[layout_settings][setting_1]' => 'Abracadabra',
+    ];
+    $this->drupalPostForm(NULL, $edit, 'Save');
+
+    // Go back to the variant edit form and see that the setting stuck.
+    $this->drupalGet('admin/structure/page_manager/manage/foo/variant/panels_1');
+    $this->assertFieldByName("variant_settings[layout_settings][setting_1]", "Abracadabra");
+
+    // View the page and make sure the setting is present.
+    $this->drupalGet('testing');
+    $this->assertText('Blah:');
+    $this->assertText('Abracadabra');
+    $this->assertText('Powered by Drupal');
+  }
+
+}
diff --git a/tests/modules/panels_test/panels_test.info.yml b/tests/modules/panels_test/panels_test.info.yml
new file mode 100644
index 0000000..7d85b3b
--- /dev/null
+++ b/tests/modules/panels_test/panels_test.info.yml
@@ -0,0 +1,7 @@
+type: module
+name: Panels Test
+description: 'Required for Panels simpletests only.'
+core: 8.x
+dependencies:
+  - page_manager
+  - layout_plugin
