diff --git a/sites/all/modules/features/features.drush.inc b/sites/all/modules/features/features.drush.inc
index 4b79e76..12732f8 100644
--- a/sites/all/modules/features/features.drush.inc
+++ b/sites/all/modules/features/features.drush.inc
@@ -21,6 +21,11 @@ function features_drush_command() {
     'drupal dependencies' => array('features'),
     'aliases' => array('fl', 'features'),
   );
+  $items['features-list-override'] = array(
+    'description' => "List all the overridden features for your site.",
+    'drupal dependencies' => array('features'),
+    'aliases' => array('flo'),
+  );
   $items['features-export'] = array(
     'description' => "Export a feature from your site into a module.",
     'arguments' => array(
@@ -79,7 +84,22 @@ function features_drush_command() {
     'drupal dependencies' => array('features', 'diff'),
     'aliases' => array('fd'),
   );
-
+  $items['features-udiff'] = array(
+    'description' => "Output unified diff of the default and overridden state of a feature.",
+    'arguments' => array(
+      'feature' => 'The feature in question.',
+    ),
+    'drupal dependencies' => array('features', 'diff'),
+    'aliases' => array('fud'),
+  );
+  $items['features-udiff-all'] = array(
+    'description' => "Output unified diff of the default and overridden state of all features.",
+    'arguments' => array(
+      'feature_exclude' => 'A space-delimited list of features to exclude from being updated.',
+    ),
+    'drupal dependencies' => array('features', 'diff'),
+    'aliases' => array('fud-all', 'fuda'),
+  );
   return $items;
 }
 
@@ -90,6 +110,8 @@ function features_drush_help($section) {
   switch ($section) {
     case 'drush:features':
       return dt("List all the available features for your site.");
+    case 'drush:features-list-override':
+      return dt("List all the overridden features for your site.");
     case 'drush:features-export':
       return dt("Export a feature from your site into a module. If called with no arguments, display a list of available components. If called with a single argument, attempt to create a feature including the given component with the same name. The option '--destination=foo' may be used to specify the path (from Drupal root) where the feature should be created. The default destination is 'sites/all/modules'.");
     case 'drush:features-update':
@@ -104,6 +126,10 @@ function features_drush_help($section) {
       return dt("Revert a feature module on your site.");
     case 'drush:features-diff':
       return dt("Show a diff of a feature module.");
+    case 'drush:features-udiff':
+      return dt("Output unified diff of the default and overridden state of a feature.");
+    case 'drush:features-udiff-all':
+      return dt("Output unified diff of the default and overridden state of all features.");
   }
 }
 
@@ -137,6 +163,18 @@ function drush_features_list() {
 }
 
 /**
+ * Get a list of all overridden feature modules.
+ */
+function drush_features_list_override() {
+  module_load_include('inc', 'features', 'features.export');
+  foreach (features_get_features(NULL, TRUE) as $k => $m) {
+    if (features_get_storage($m->name) == FEATURES_OVERRIDDEN) {
+      drush_print(dt("!item", array('!item' => $m->name)));
+    }
+  }
+}
+
+/**
  * Create a feature module based on a list of components.
  */
 function drush_features_export() {
@@ -442,6 +480,105 @@ function drush_features_diff() {
 }
 
 /**
+ * Show the diff of all overridden features
+ */
+function drush_features_udiff_all() {
+  $features_to_exclude = func_get_args();
+  module_load_include('inc', 'features', 'features.export');
+  foreach (features_get_features(NULL, TRUE) as $k => $module) {
+    if (!in_array($module->name, $features_to_exclude)) {
+      if (features_get_storage($module->name) == FEATURES_OVERRIDDEN) {
+        $res = drush_invoke_process(drush_sitealias_get_record('@self'), 'features-udiff', array($module->name));
+        if ($res['error_status'] === 0) {
+          if (!empty($res['output'])) {
+            drush_print($res['output']);
+          }
+        } else {
+          foreach ($res['error_log'] as $key => $err) {
+            drush_set_error($key, $err);
+          }
+        }
+      }
+    }
+  }  
+}
+
+/**
+ * Show the diff of a feature module.
+ */
+function drush_features_udiff() {
+  if (!$args = func_get_args()) {
+    drush_features_list();
+    return;
+  }
+  $module = $args[0];
+  $feature = feature_load($module);
+  if (!module_exists($module)) {
+    drush_log(dt('No such feature is enabled: ' . $module), 'error');
+    return;
+  }
+  module_load_include('inc', 'features', 'features.export');
+  $overrides = features_detect_overrides($feature);
+  if (empty($overrides)) {
+    drush_log(dt('Feature is in its default state. No diff needed.'), 'ok');
+    return;
+  }
+
+  // check if we can access the diff executable
+  if (substr(PHP_OS, 0, 3) != 'WIN') {
+    if (!function_exists('proc_open')) {
+      return drush_set_error(dt('You need to enable PHP proc_open() function.'));
+    }
+  } else {
+    return drush_set_error(dt('You can only use this on unix platforms with the diff utility available.'));
+  }
+
+  // prepare export
+  drush_log(dt('Creating diff for feature !feature.', array('!feature' => $feature->name)), 'ok');
+  if ($export = features_populate($feature->info['features'], $feature->info['dependencies'], $feature->name)) {
+    $module_name = $feature->name;
+    $module_path = drupal_get_path('module', $module_name);
+
+    // list and render files
+    if ($files = features_export_render($export, $module_name, TRUE)) {
+      foreach ($files as $extension => $file_contents) {
+        // we get all the feature files here
+        if (!in_array($extension, array('module', 'info'))) $extension .= '.inc';
+        // we don't do the main module file
+        if ($extension != 'module') {
+          $filename = "{$module_path}/{$module_name}.$extension";
+          // piping content to a shell command
+          $descriptorspec = array(0 => array("pipe", "r"), 1 => array("pipe", "w"), 2 => array("pipe", "w"));
+          $cmd = "diff -uw $filename -";
+          $process = proc_open($cmd, $descriptorspec, $pipes);
+          if (is_resource($process)) {
+            fwrite($pipes[0],  $file_contents); // STDIN
+            fclose($pipes[0]);
+            $diff = stream_get_contents($pipes[1]);
+            if (trim($diff)) {
+              drush_log(dt('File !filename has some changes.', array('!filename' => $module_name.".".$extension)), 'ok');
+              drush_print($diff); // STOUT
+            } else {
+              drush_log(dt('File !filename has not changed.', array('!filename' => $module_name.".".$extension)), 'ok');
+            }
+            //drush_print(stream_get_contents($pipes[2])); // STDERR
+            fclose($pipes[1]);
+            $return_value = proc_close($process);
+          }
+        }
+      }
+    } else {
+      drush_log(dt('Feature cannot be exported: ' . $module), 'error');
+      return;
+    }
+  } else {
+    drush_log(dt('Feature cannot be populated: ' . $module), 'error');
+    return;
+  }
+}
+
+
+/**
  * Helper function to call drush_set_error().
  *
  * @param $feature
