 core/modules/system/system.admin.inc  |   10 +++++++++
 core/modules/system/system.base.css   |    7 ++++++
 core/modules/system/system.module     |    2 +-
 core/modules/system/system.modules.js |   40 +++++++++++++++++++++++++++++++++
 4 files changed, 58 insertions(+), 1 deletion(-)

diff --git a/core/modules/system/system.admin.inc b/core/modules/system/system.admin.inc
index 37a2bf2..3dfc42e 100644
--- a/core/modules/system/system.admin.inc
+++ b/core/modules/system/system.admin.inc
@@ -788,6 +788,16 @@ function _system_is_incompatible(&$incompatible, $files, $file) {
  * @see system_modules_submit()
  */
 function system_modules($form, $form_state = array()) {
+  $form['filter_by'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Filter by'),
+    '#title_display' => 'invisible',
+    '#placeholder' => t('Search module name…'),
+    '#wrapper_attributes' => array(
+      'class' => array('element-hidden js-show'),
+    ),
+  );
+
   // Get current list of modules.
   $files = system_rebuild_module_data();
 
diff --git a/core/modules/system/system.base.css b/core/modules/system/system.base.css
index 233c6d7..539d3ac 100644
--- a/core/modules/system/system.base.css
+++ b/core/modules/system/system.base.css
@@ -204,6 +204,13 @@ tr .ajax-progress-throbber .throbber {
 }
 
 /**
+ * For anything you want to show on page load when JS is enabled.
+ */
+.js .js-show {
+  display: block;
+}
+
+/**
  * Hide elements from all users.
  *
  * Used for elements which should not be immediately displayed to any user. An
diff --git a/core/modules/system/system.module b/core/modules/system/system.module
index 17015c6..525f66c 100644
--- a/core/modules/system/system.module
+++ b/core/modules/system/system.module
@@ -2133,7 +2133,7 @@ function system_library_info() {
     ),
   );
   $libraries['drupal.system.modules'] = array(
-    'title' => 'System cron',
+    'title' => 'System modules',
     'version' => VERSION,
     'js' => array(
       drupal_get_path('module', 'system') . '/system.modules.js' => array(),
diff --git a/core/modules/system/system.modules.js b/core/modules/system/system.modules.js
index 0df6629..22ba188 100644
--- a/core/modules/system/system.modules.js
+++ b/core/modules/system/system.modules.js
@@ -64,4 +64,44 @@ Drupal.behaviors.hideModuleInformation = {
   }
 };
 
+/**
+ * Filter the module list based on the value of the "filter_by" field.
+ */
+Drupal.behaviors.filterModuleList = {
+  attach: function (context, settings) {
+    var $table = $('#system-modules');
+
+    $('#edit-filter-by').focus().keyup(function (event) {
+      var query = $(this).val().toLowerCase();
+      if (query === '') {
+        $table.find('tr, details').show();
+      }
+      else if (query.length < 2) {
+        // Don't filter until the length of the query is at least 2 characters.
+        return;
+      }
+      else {
+        $table.find('label').each(function() {
+          if ($(this).html().toLowerCase().indexOf(query) !== -1) {
+            $(this).closest('tr').show();
+          }
+          else {
+            $(this).closest('tr').hide();
+          }
+        });
+
+        // Hide the package <details> if they don't have any visible rows.
+        // Note that we first show() all <details> to be able to use ':visible'.
+        $table.find('details').show().each(function() {
+          // We must select the last table because the sticky headers
+          // functionality prepends another table.
+          var $details = $(this);
+          var visibleRows = $details.find('table:last tbody tr:visible');
+          $details.toggle(visibleRows.length > 0);
+        });
+      }
+    });
+  }
+};
+
 }(jQuery, Drupal));
diff --git a/sites/default/default.settings.php b/sites/default/default.settings.php
old mode 100644
new mode 100755
