diff --git a/core/modules/system/lib/Drupal/system/Form/ModulesListForm.php b/core/modules/system/lib/Drupal/system/Form/ModulesListForm.php
index 15d5eaf..afbea63 100644
--- a/core/modules/system/lib/Drupal/system/Form/ModulesListForm.php
+++ b/core/modules/system/lib/Drupal/system/Form/ModulesListForm.php
@@ -110,23 +110,30 @@ public function buildForm(array $form, array &$form_state) {
     $form['filters'] = array(
       '#type' => 'container',
       '#attributes' => array(
-        'class' => array('table-filter', 'js-show'),
+        'class' => array('table-filter', 'js-show', 'input-group'),
       ),
     );
 
     $form['filters']['text'] = array(
       '#type' => 'search',
-      '#title' => $this->t('Search'),
+      '#title' => $this->t('Search modules'),
+      '#title_display' => 'invisible',
       '#size' => 30,
-      '#placeholder' => $this->t('Enter module name'),
+      '#placeholder' => $this->t('Search modules'),
       '#attributes' => array(
-        'class' => array('table-filter-text'),
+        'class' => array('table-filter-text','input-group__text'),
         'data-table' => '#system-modules',
         'autocomplete' => 'off',
         'title' => $this->t('Enter a part of the module name or description to filter by.'),
       ),
     );
 
+    $form['filters']['button'] = array(
+      '#type' => 'button',
+      '#button_type' => 'button',
+      '#value' => $this->t('Search'),
+    );
+
     // Sort all modules by their names.
     $modules = system_rebuild_module_data();
     uasort($modules, 'system_sort_modules_by_info_name');
diff --git a/core/tests/Drupal/Tests/Core/Extension/ThemeHandlerTest.php b/core/tests/Drupal/Tests/Core/Extension/ThemeHandlerTest.php
index 2194990..bd741b8 100644
--- a/core/tests/Drupal/Tests/Core/Extension/ThemeHandlerTest.php
+++ b/core/tests/Drupal/Tests/Core/Extension/ThemeHandlerTest.php
@@ -286,6 +286,7 @@ public function testRebuildThemeData() {
         'style.css' => DRUPAL_ROOT . '/core/themes/seven/style.css',
         'css/components/buttons.css' => DRUPAL_ROOT . '/core/themes/seven/css/components/buttons.css',
         'css/components/buttons.theme.css' => DRUPAL_ROOT . '/core/themes/seven/css/components/buttons.theme.css',
+        'css/components/input-group.css' => DRUPAL_ROOT . '/core/themes/seven/css/components/input-group.css',
       ),
     ), $info->info['stylesheets']);
     $this->assertEquals(DRUPAL_ROOT . '/core/themes/seven/screenshot.png', $info->info['screenshot']);
diff --git a/core/themes/seven/css/components/input-group.css b/core/themes/seven/css/components/input-group.css
new file mode 100644
index 0000000..c9b3b70
--- /dev/null
+++ b/core/themes/seven/css/components/input-group.css
@@ -0,0 +1,24 @@
+/**
+ * @file
+ * A reuseable input group component for form items.
+ *
+ * Apple this class to a wrapper div containing a text input and a button.
+ */
+.input-group {
+  overflow: hidden;
+}
+.input-group .form-item {
+  float: left;
+}
+.input-group input.form-search {
+  border-right: 0; /* LTR */
+  border-top-right-radius: 0; /* LTR */
+  border-bottom-right-radius: 0; /* LTR */
+}
+.input-group .form-submit {
+  float: left;
+  margin: 0.7em 0;
+  padding-bottom: 3px;
+  border-top-left-radius: 0; /* LTR */
+  border-bottom-left-radius: 0; /* LTR */
+}
diff --git a/core/themes/seven/seven.info.yml b/core/themes/seven/seven.info.yml
index 582b498..b04bd63 100644
--- a/core/themes/seven/seven.info.yml
+++ b/core/themes/seven/seven.info.yml
@@ -10,6 +10,7 @@ stylesheets:
     - style.css
     - css/components/buttons.css
     - css/components/buttons.theme.css
+    - css/components/input-group.css
 stylesheets-override:
   - vertical-tabs.css
   - jquery.ui.theme.css
