diff --git a/src/Form/PatternEditForm.php b/src/Form/PatternEditForm.php
index f12f6d0..3864788 100644
--- a/src/Form/PatternEditForm.php
+++ b/src/Form/PatternEditForm.php
@@ -120,6 +120,7 @@ class PatternEditForm extends EntityForm {
         '#after_build' => array('token_element_validate'),
         '#token_types' => $alias_type->getTokenTypes(),
         '#min_tokens' => 1,
+        '#required' => TRUE,
       );
 
       // Show the token help relevant to this pattern type.
diff --git a/src/Tests/PathautoUiTest.php b/src/Tests/PathautoUiTest.php
index 5686c43..28c0f9b 100644
--- a/src/Tests/PathautoUiTest.php
+++ b/src/Tests/PathautoUiTest.php
@@ -85,20 +85,26 @@ class PathautoUiTest extends WebTestBase {
   }
 
   function testPatternsWorkflow() {
-
-    // Try to save an invalid pattern.
+    // Try to save an empty pattern, should not be allowed.
     $this->drupalGet('admin/config/search/path/patterns/add');
     $edit = array(
       'type' => 'canonical_entities:node',
     );
     $this->drupalPostAjaxForm(NULL, $edit, 'type');
     $edit += array(
-      'pattern' => '[node:title]/[user:name]/[term:name]',
       'bundles[page]' => TRUE,
       'label' => 'Page pattern',
       'id' => 'page_pattern',
     );
     $this->drupalPostForm(NULL, $edit, 'Save');
+    $this->assertText('Path pattern field is required.');
+    $this->assertNoText('The configuration options have been saved.');
+
+    // Try to save an invalid pattern.
+    $edit += array(
+      'pattern' => '[node:title]/[user:name]/[term:name]',
+    );
+    $this->drupalPostForm(NULL, $edit, 'Save');
     $this->assertText('Path pattern is using the following invalid tokens: [user:name], [term:name].');
     $this->assertNoText('The configuration options have been saved.');
 
