diff --git a/features.drush.inc b/features.drush.inc
index c1a15ac..e6ee5ec 100644
--- a/features.drush.inc
+++ b/features.drush.inc
@@ -29,6 +29,7 @@ function features_drush_command() {
     'description' => "List all the available features for your site.",
     'options' => array(
       'status' => "Feature status, can be 'enabled', 'disabled'  or 'all'",
+      'packages' => "A space delimited list of feature packages to filter by.",
     ),
     'drupal dependencies' => array('features'),
     'aliases' => array('fl', 'features'),
@@ -92,6 +93,9 @@ function features_drush_command() {
     'arguments' => array(
       'feature_exclude' => 'A space-delimited list of features to exclude from being updated.',
     ),
+    'options' => array(
+      'packages' => "A space delimited list of feature packages to update.",
+    ),
     'drupal dependencies' => array('features'),
     'aliases' => array('fu-all', 'fua'),
   );
@@ -117,6 +121,7 @@ function features_drush_command() {
     ),
     'options' => array(
       'force' => "Force revert even if Features assumes components' state are default.",
+      'packages' => "A space delimited list of feature packages to revert.",
     ),
     'drupal dependencies' => array('features'),
     'aliases' => array('fr-all', 'fra'),
@@ -189,6 +194,7 @@ function drush_features_list() {
   if (!in_array($status, array('enabled', 'disabled', 'all'))) {
     return drush_set_error('', dt('!status is not valid', array('!status' => $status)));
   }
+  $packages = array_map('trim', drush_get_option_list('packages'));
 
   module_load_include('inc', 'features', 'features.export');
   $rows = array(array(dt('Name'), dt('Feature'), dt('Status'), dt('Version'), dt('State')));
@@ -197,30 +203,33 @@ function drush_features_list() {
   $features = features_get_features(NULL, TRUE);
   ksort($features);
 
-  foreach ($features as $k => $m) {
-    switch (features_get_storage($m->name)) {
-      case FEATURES_DEFAULT:
-      case FEATURES_REBUILDABLE:
-        $storage = '';
-        break;
-      case FEATURES_OVERRIDDEN:
-        $storage = dt('Overridden');
-        break;
-      case FEATURES_NEEDS_REVIEW:
-        $storage = dt('Needs review');
-        break;
-    }
-    if (
-      ($m->status == 0 && ($status == 'all' || $status == 'disabled')) ||
-      ($m->status == 1 && ($status == 'all' || $status == 'enabled'))
-    ) {
-      $rows[] = array(
-        $m->info['name'],
-        $m->name,
-        $m->status ? dt('Enabled') : dt('Disabled'),
-        $m->info['version'],
-        $storage
-      );
+  foreach ($features as $module) {
+    $package = !empty($module->info['package']) ? $module->info['package'] : t('Other');
+    if (empty($packages) || in_array($package, $packages)) {
+      switch (features_get_storage($module->name)) {
+        case FEATURES_DEFAULT:
+        case FEATURES_REBUILDABLE:
+          $storage = '';
+          break;
+        case FEATURES_OVERRIDDEN:
+          $storage = dt('Overridden');
+          break;
+        case FEATURES_NEEDS_REVIEW:
+          $storage = dt('Needs review');
+          break;
+      }
+      if (
+        ($module->status == 0 && ($status == 'all' || $status == 'disabled')) ||
+        ($module->status == 1 && ($status == 'all' || $status == 'enabled'))
+      ) {
+        $rows[] = array(
+          $module->info['name'],
+          $module->name,
+          $module->status ? dt('Enabled') : dt('Disabled'),
+          $module->info['version'],
+          $storage
+        );
+      }
     }
   }
   drush_print_table($rows, TRUE);
@@ -532,9 +541,12 @@ function drush_features_update() {
  */
 function drush_features_update_all() {
   $features_to_update = array();
+  $packages = array_map('trim', drush_get_option_list('packages'));
   $features_to_exclude = func_get_args();
   foreach (features_get_features() as $module) {
-    if ($module->status && !in_array($module->name, $features_to_exclude)) {
+    $package = !empty($module->info['package']) ? $module->info['package'] : t('Other');
+    $feature_in_packages = empty($packages) || in_array($package, $packages);
+    if ($module->status && !in_array($module->name, $features_to_exclude) && $feature_in_packages) {
       $features_to_update[] = $module->name;
     }
   }
@@ -761,11 +773,14 @@ function drush_features_revert() {
 function drush_features_revert_all() {
   module_load_include('inc', 'features', 'features.export');
   $force = drush_get_option('force');
+  $packages = array_map('trim', drush_get_option_list('packages'));
   $features_to_exclude = func_get_args();
 
   $features_to_revert = array();
   foreach (features_get_features(NULL, TRUE) as $module) {
-    if ($module->status && !in_array($module->name, $features_to_exclude)) {
+    $package = !empty($module->info['package']) ? $module->info['package'] : t('Other');
+    $feature_in_packages = empty($packages) || in_array($package, $packages);
+    if ($module->status && !in_array($module->name, $features_to_exclude) && $feature_in_packages) {
       // If forced, add module regardless of status.
       if ($force) {
         $features_to_revert[] = $module->name;
