diff -ruN features/features.drush.inc features-patched/features.drush.inc
--- features/features.drush.inc	2015-04-28 09:20:27.000000000 -0600
+++ features-patched/features.drush.inc	2015-05-15 10:02:46.890157402 -0600
@@ -748,6 +748,7 @@
           drush_log(dt('Current state already matches defaults, aborting.'), 'ok');
         }
         else {
+          $components = _features_sort_components($components);
           foreach ($components as $component) {
             $dt_args['@component'] = $component;
             $confirmation_message = 'Do you really want to revert @module.@component?';
diff -ruN features/features.module features-patched/features.module
--- features/features.module	2015-04-28 09:20:27.000000000 -0600
+++ features-patched/features.module	2015-05-15 10:04:56.660390299 -0600
@@ -959,6 +959,7 @@
     // in chain, for example also using features_install_modules().
     $states = features_get_component_states(array(), ($op == 'rebuild'), defined('DRUSH_BASE_PATH'));
     foreach ($states as $module_name => $components) {
+      $components = _features_sort_components($components);
       foreach ($components as $component => $state) {
         if (in_array($state, $restore_states)) {
           $items[$module_name][] = $component;
@@ -1211,3 +1212,22 @@
   }
   variable_set('features_feature_locked', $locked);
 }
+
+/**
+ * Sort the components array to put the user_permission component at the end.
+ *
+ * @param $components
+ *   The array of components (component_info) from features_get_components typically.
+ *
+ * @return array
+ *   The array of components after sorting.
+ */
+function _features_sort_components($components = array()) {
+  $key = array_search('user_permission', $components);
+  if ($key !== FALSE) {
+    unset($components[$key]);
+    $components[] = 'user_permission';
+  }
+
+  return $components;
+}
