diff --git a/l10n_community/editor.js b/l10n_community/editor.js
index 68e0743..7f3b396 100644
--- a/l10n_community/editor.js
+++ b/l10n_community/editor.js
@@ -6,6 +6,112 @@
 
 (function($) {
 
+  Drupal.behaviors.FilterSummary = function() {
+
+    // Make this only run once even if we get release AHAH data.
+    if ($('.l10n-server-filter.filter-summary-processed').length) {
+      return;
+    }
+    $('.l10n-server-filter').addClass('filter-summary-processed');
+
+    // List of filters we provide as options to add.
+    var filter_meta = new Array();
+    filter_meta['project'] = 'project and release';
+    filter_meta['release'] = 'release';
+    filter_meta['translation-status'] = 'translation status';
+    filter_meta['suggestion-status'] = 'suggestion status';
+    filter_meta['author'] = 'author name';
+    filter_meta['search'] = 'text search';
+    filter_meta['sid'] = 'string ID';
+    filter_meta['context'] = 'text context';
+
+    var filters = new Array();
+    var missing_filters = new Array();
+    for (key in filter_meta) {
+      item = $('.l10n-server-filter #edit-' + key);
+      if (item.length) {
+        // If we have this filter in the DOM available on this site, look if
+        // it is default or non-default.
+        if (item.hasClass('.form-select')) {
+          optionitem = item.find('option:selected');
+          if (optionitem.attr('value') && optionitem.attr('value') != 0 && optionitem.attr('value') != 'all') {
+            filters[key] = optionitem.text();
+          }
+        }
+        else if (item.hasClass('.form-text')) {
+          value = item.val();
+          if (value.length) {
+            filters[key] = value;
+          }
+        }
+        if (!filters[key]) {
+          if (key != 'release' || filters['project']) {
+            // Record all missing filters except release, which we lump up with
+            // projects instead of showing up on its own, if project was empty.
+            missing_filters.push(key);
+          }
+        }
+      }
+    }
+
+    // If we have missing filters, add a widget to make filters show up.
+    if (missing_filters.length) {
+      $('.l10n-server-filter .filter-submit').before('<div class="filter-widget"><label>' + Drupal.t('+ filter') + '</span><div class="form-item"><select id="filter-add"><option value="0" selected="selected">' + Drupal.t('choose one') + '</option></select></div></div>');
+      for (filter in missing_filters) {
+        // Add one option for each possible filter.
+        $('#filter-add').append('<option value="' + missing_filters[filter] + '">' + filter_meta[missing_filters[filter]] + '</option>');
+      }
+
+      // When the filter addition dropdown changes, actually make the filter visible.
+      $('.l10n-server-filter #filter-add').change(function() {
+        var val = $(this).find('option:selected').attr('value');
+        if (val != 0) {
+          var last_visible = $('.l10n-server-filter-elements .filter-widget:visible:last');
+          if (last_visible.length) {
+            // Need to reorder the items to move them to the end of the displayed
+            // filters. We need to do this in ungodly ways due to how jQuery
+            // needs to retain its associated events (for autocomplete fields
+            // and AHAH responses).
+            var filter_elem = $('.l10n-server-filter-elements .filter-widget-' + val).get(0);
+            filter_elem.parentNode.removeChild(filter_elem);
+            $('.l10n-server-filter-elements').get(0).appendChild(filter_elem);
+            if (val == 'project') {
+              // If we moved the project, we should move the release list too.
+              var filter_elem = $('.l10n-server-filter-elements .filter-widget-release').get(0);
+              filter_elem.parentNode.removeChild(filter_elem);
+              $('.l10n-server-filter-elements').get(0).appendChild(filter_elem);
+            }
+          }
+          // Show the filter item by fading it in and focusing on it right away.
+          $('.l10n-server-filter-elements .filter-widget-' + val).fadeIn();
+          $('#edit-' + val).focus();
+
+          // Remove this option from the +filter dropdown and remove the whole
+          // dropdown altogether if there are no more items to pick there.
+          // Otherwise just jump back to the first item.
+          $(this).find('option[value=' + val + ']').remove();
+          if ($(this).find('option').length == 1) {
+            $(this).parents('.filter-widget').remove();
+          }
+          else {
+            $(this).find('option[value=0]').attr('selected', 'selected');
+          }
+        }
+      });
+    }
+
+    // When a project changes, we should remove the js-hide from the release
+    // list and remove that option from the +filter dropdown as well.
+    // Hide the +filter dropdown altogether if it became empty.
+    $('.l10n-server-filter #edit-project').change(function() {
+      $('#edit-release').parents('.filter-widget').removeClass('js-hide');
+      $('.l10n-server-filter #filter-add').find('option[value=release]').remove();
+      if ($('.l10n-server-filter #filter-add').find('option').length == 1) {
+        $('.l10n-server-filter #filter-add').parents('.filter-widget').remove();
+      }
+    });
+  }
+
   /**
    * Simple string encoding/escaping for proper HTML output.
    */
@@ -61,19 +167,6 @@
       return false;
     });
 
-    // Callback to show all filters.
-    var showAllFilters = function() {
-      $('#l10n-community-filter-form .reveal-link').hide();
-      $('#l10n-community-filter-form .filter-widget:hidden').removeClass('js-hide').fadeIn();
-      return false;
-    }
-
-    // If we did hide items, add a link to show all.
-    if ($('#l10n-community-filter-form .filter-widget:hidden')) {
-      $('#l10n-community-filter-form .l10n-server-filter').append('<a href="#" class="reveal-link">' + Drupal.t('Reveal more filters') + '</a>');
-      $('#l10n-community-filter-form .reveal-link').click(showAllFilters);
-    }
-
      // Add title to all decline buttons. Will be modified dynamically.
      $('.actions .declined label').attr('title', Drupal.t('Decline'));
 
diff --git a/l10n_community/l10n_community-rtl.css b/l10n_community/l10n_community-rtl.css
index d3e6b05..94f7338 100644
--- a/l10n_community/l10n_community-rtl.css
+++ b/l10n_community/l10n_community-rtl.css
@@ -9,24 +9,13 @@
 
 /* String search filtering form */
 .l10n-server-filter {
-  padding: 0.6em 0.6em 1.5em 150px;
+  padding: 0.6em 0.6em 0.6em 150px;
 }
-.l10n-server-filter .filter-widget {
-  float: right;
-  padding: 0 0 0 1em;
-}
-.l10n-server-filter .filter-submit .form-submit {
-  right: auto;
-  left: 0;
+.l10n-server-filter #filter-add {
+  margin-right: 0.6em;
 }
 .l10n-server-filter .filter-submit .reset-link {
-  right: auto;
-  left: 0;
-}
-.l10n-server-filter .reveal-link {
-  left: auto;
-  right: 0;
-  margin: 0 1em 0.5em 0;
+  margin: 0 0.5em 0 0;
 }
 
 #autocomplete {
diff --git a/l10n_community/l10n_community.css b/l10n_community/l10n_community.css
index ee6ac31..522f40f 100644
--- a/l10n_community/l10n_community.css
+++ b/l10n_community/l10n_community.css
@@ -30,44 +30,32 @@ table.l10n-community-overview {
 }
 
 /* String search filtering form */
-.l10n-server-filter {
-  background-color: #f6f6f2;
-  padding: 0.6em 150px 1.5em 0.6em; /* LTR */
-  position: relative;
-}
-.l10n-server-filter .filter-widget {
-  float: left; /* LTR */
-  padding: 0 1em 0 0; /* LTR */
-  height: 6em;
-}
-.l10n-server-filter .filter-widget label {
+.l10n-server-filter .l10n-server-display {
+  border-bottom: 1px solid #eaeae1;
+  padding-bottom: 0.3em;
+  margin-bottom: 0.3em;
+}
+.l10n-server-filter .filter-widget,
+.l10n-server-filter .filter-submit {
+  float: left;
+  padding: 0 1em 0 0;
+  height: 4em;
+}
+.l10n-server-filter .filter-widget label,
+.l10n-server-filter .filter-submit label {
   font-weight: bold;
   color: #003150;
 }
-.l10n-server-filter .filter-widget .form-item {
-  margin-top: 0;
-}
-.l10n-server-filter .form-item#edit-status-translation-wrapper {
-  margin-bottom: 0;
-}
-.l10n-server-filter .filter-submit .form-submit {
-  position: absolute;
-  top: 0;
-  right: 0; /* LTR */
-  margin: 0.5em;
-  display: block;
+.l10n-server-filter .filter-widget .form-item,
+.l10n-server-filter .filter-submit .form-item,
+.l10n-server-filter .filter-submit .form-item .form-submit {
+  margin: 0;
 }
 .l10n-server-filter .filter-submit .reset-link {
-  position: absolute;
-  bottom: 0;
-  right: 0; /* LTR */
-  margin: 0 1em 0.5em 0;
-}
-.l10n-server-filter .reveal-link {
-  position: absolute;
-  bottom: 0;
-  left: 0; /* LTR */
-  margin: 0 0 0.5em 1em; /* LTR */
+  margin: 0 0 0 0.5em; /* LTR */
+}
+.l10n-server-filter-elements {
+  clear: both;
 }
 
 /* Emphasized replaceable parts of translatables */
diff --git a/l10n_community/l10n_community.module b/l10n_community/l10n_community.module
index 3157151..10a4f88 100644
--- a/l10n_community/l10n_community.module
+++ b/l10n_community/l10n_community.module
@@ -833,12 +833,12 @@ function l10n_community_build_filter_values($params) {
   $project = $release = NULL;
 
   // Convert array representation of flags to one integer.
-  if (isset($params['status']) && is_array($params['status'])) {
-    if (isset($params['status']['suggestion'])) {
-      $params['status'] = ((int) $params['status']['translation']) | ((int) $params['status']['suggestion']);
+  if (isset($params['translation_status']) || isset($params['suggestion_status'])) {
+    if (isset($params['suggestion_status'])) {
+      $params['status'] = ((int) $params['translation_status']) | ((int) $params['suggestion_status']);
     }
     else {
-      $params['status'] = (int) $params['status']['translation'];
+      $params['status'] = (int) $params['translation_status'];
     }
   }
 
@@ -850,8 +850,8 @@ function l10n_community_build_filter_values($params) {
     'author' => !empty($params['author']) && ($account = user_load(array('name' => $params['author']))) ? $account : NULL,
     // Dropdown, validated by form API.
     'context' => isset($params['context']) ? (string) $params['context'] : 'all',
-    'limit' => (isset($params['limit']) && in_array($params['limit'], array(5, 10, 20, 30, 50))) ? (int) $params['limit'] : 10,
     'sid'   => (!empty($params['sid']) && is_numeric($params['sid'])) ? $params['sid'] : 0,
+    'limit' => (isset($params['limit']) && in_array($params['limit'], array(1, 3, 5, 10, 20, 30, 50))) ? (int) $params['limit'] : 10,
   );
 
   // The project can be a dropdown or text field depending on number of
diff --git a/l10n_community/translate.inc b/l10n_community/translate.inc
index d9b378b..f77db0a 100644
--- a/l10n_community/translate.inc
+++ b/l10n_community/translate.inc
@@ -19,13 +19,13 @@ function l10n_community_filter_form(&$form_state, $langcode, $filters) {
   $projects = l10n_server_get_projects();
 
   $translation_options = array(
-    L10N_STATUS_ALL            => '<'. t('Any') .'>',
+    L10N_STATUS_ALL            => t("Don't care"),
     L10N_STATUS_UNTRANSLATED   => t('Untranslated'),
     L10N_STATUS_TRANSLATED     => t('Translated'),
     L10N_STATUS_IS_TRANSLATION => t('Is translation'),
   );
   $suggestion_options = array(
-    L10N_STATUS_ALL            => '<'. t('Any') .'>',
+    L10N_STATUS_ALL            => t("Don't care"),
     L10N_STATUS_NO_SUGGESTION  => t('Has no suggestion'),
     L10N_STATUS_HAS_SUGGESTION => t('Has suggestion'),
     L10N_STATUS_IS_SUGGESTION  => t('Is suggestion'),
@@ -59,6 +59,7 @@ function l10n_community_filter_form(&$form_state, $langcode, $filters) {
       'effect' => 'fade',
     ),
     '#attributes' => array('class' => empty($form_state['values']['project']) ? 'is-default' : 'is-not-default'),
+    '#display_none' => empty($form_state['values']['project']),
   );
   if (($count = count($projects)) <= 30) {
     // Select widget for 1-30 projects.
@@ -100,34 +101,38 @@ function l10n_community_filter_form(&$form_state, $langcode, $filters) {
     '#prefix' => '<div id="l10n-server-releases">',
     '#suffix' => '</div>',
     '#attributes' => array('class' => $form_state['values']['release'] == 'all' ? 'is-default' : 'is-not-default'),
+    '#display_none' => $form_state['values']['release'] == 'all',
   );
 
   if (count($contexts = l10n_community_get_contexts()) > 1) {
+    $contexts = array();
     $form['context'] = array(
       '#title' => t('Context'),
       '#type' => 'select',
       '#options' => array('all' => t('All')) + $contexts,
       '#default_value' => $form_state['values']['context'],
       '#attributes' => array('class' => $form_state['values']['context'] == 'all' ? 'is-default' : 'is-not-default'),
+      '#display_none' => $form_state['values']['context'] == 'all',
     );
   }
 
-  $form['status'] = array(
-    '#title' => t('Status'),
-    '#tree' => TRUE,
-    '#prefix' => '<div class="'. ($form_state['values']['status'] == L10N_STATUS_ALL ? 'is-default' : 'is-not-default') .'">',
-    '#suffix' => '</div>',
-    '#display_none' => $form_state['values']['status'] == L10N_STATUS_ALL,
-  );
-  $form['status']['translation'] = array(
+  $translation_default = $form_state['values']['status'] & (L10N_STATUS_TRANSLATED | L10N_STATUS_UNTRANSLATED | L10N_STATUS_IS_TRANSLATION);
+  $form['translation_status'] = array(
+    '#title' => t('Translation status'),
     '#type' => 'select',
     '#options' => $translation_options,
-    '#default_value' => $form_state['values']['status'] & (L10N_STATUS_TRANSLATED | L10N_STATUS_UNTRANSLATED | L10N_STATUS_IS_TRANSLATION),
+    '#default_value' => $translation_default,
+    '#attributes' => array('class' => $translation_default == L10N_STATUS_ALL ? 'is-default' : 'is-not-default'),
+    '#display_none' => $translation_default == L10N_STATUS_ALL,
   );
-  $form['status']['suggestion'] = array(
+  $suggestion_default = $form_state['values']['status'] & (L10N_STATUS_HAS_SUGGESTION | L10N_STATUS_NO_SUGGESTION | L10N_STATUS_IS_SUGGESTION);
+  $form['suggestion_status'] = array(
+    '#title' => t('Suggestion status'),
     '#type' => 'select',
     '#options' => $suggestion_options,
-    '#default_value' => $form_state['values']['status'] & (L10N_STATUS_HAS_SUGGESTION | L10N_STATUS_NO_SUGGESTION | L10N_STATUS_IS_SUGGESTION),
+    '#default_value' => $suggestion_default,
+    '#attributes' => array('class' => $suggestion_default == L10N_STATUS_ALL ? 'is-default' : 'is-not-default'),
+    '#display_none' => $suggestion_default == L10N_STATUS_ALL,
   );
 
   $form['author']= array(
@@ -160,20 +165,20 @@ function l10n_community_filter_form(&$form_state, $langcode, $filters) {
   );
 
   $form['limit'] = array(
+    '#title' => t('Display'),
     '#type' => 'select',
-    '#title' => t('Limit'),
-    '#options' => drupal_map_assoc(array(5, 10, 20, 30, 50)),
+    '#options' => array(1 => t('1 per page'), 3 => t('3 per page'), 5 => t('5 per page'), 10 => t('10 per page'), 20 => t('20 per page'), 30 => t('30 per page'), 50 => t('50 per page')),
     '#default_value' => $form_state['values']['limit'],
     '#attributes' => array('class' => $form_state['values']['limit'] == 10 ? 'is-default' : 'is-not-default'),
     '#display_none' => $form_state['values']['limit'] == 10,
   );
 
   $form['submit'] = array(
-    '#value' => t('Filter'),
+    '#value' => t('Apply'),
     '#type' => 'submit',
   );
   $form['reset'] = array(
-    '#value' => '<div class="reset-link">'. l(t('Clear all filters'), 'translate/languages/'. $langcode .'/translate', array('attributes' => array('class' => 'filter-exclude'))) .'</div>',
+    '#value' => '<span class="reset-link">'. l(t('Reset'), 'translate/languages/'. $langcode .'/translate', array('attributes' => array('class' => 'filter-exclude'))) .'</span>',
     '#type' => 'markup',
   );
   $form['#theme'] = 'l10n_community_filter_form';
@@ -185,12 +190,12 @@ function l10n_community_filter_form(&$form_state, $langcode, $filters) {
  */
 function theme_l10n_community_filter_form($form) {
 
-  $output = '<div class="l10n-server-filter clear-block">';
-
   // Only display these elements individually.
-  $elements = array('project', 'release', 'context', 'status', 'author', 'search', 'limit', 'sid');
+  $view_elements = array('limit');
+  $filter_elements = array('project', 'release', 'context', 'translation_status', 'suggestion_status', 'author', 'search', 'sid');
+  $view_output = $filter_output = '';
   foreach ($form as $id => &$element) {
-    if (in_array($id, $elements)) {
+    if (in_array($id, $filter_elements)) {
       $title = $element['#title'];
       unset($element['#title']);
 
@@ -200,13 +205,20 @@ function theme_l10n_community_filter_form($form) {
         $class = ' js-hide';
       }
 
-      $output .= '<div class="filter-widget'. $class .'"><label>'. $title .'</label>'. drupal_render($element) .'</div>';
+      $filter_output .= '<div class="filter-widget filter-widget-'. str_replace('_', '-', $id) . $class .'"><label>'. $title .'</label>'. drupal_render($element) .'</div>';
+    }
+    elseif (in_array($id, $view_elements)) {
+      $title = $element['#title'];
+      unset($element['#title']);
+      $view_output .= '<div class="filter-widget filter-widget-'. $id .'"><label>'. $title .'</label>'. drupal_render($element) .'</div>';
     }
   }
 
   // Render the rest of the form as one filter-widget.
-  $output .= '<div class="filter-submit">'. drupal_render($form) .'</div>';
-  $output .= '</div>';
+  $output = '<div class="l10n-server-filter clear-block">';
+  $output .= '<div class="l10n-server-display">'. $view_output .'<div style="clear: both;"></div></div>';
+  $output .= '<div class="l10n-server-filter-elements">'. $filter_output .'</div>';
+  $output .= '<div class="filter-submit"><label>&nbsp;</label><div class="form-item">'. drupal_render($form) .'</div></div></div>';
 
   return $output;
 }
@@ -215,17 +227,9 @@ function theme_l10n_community_filter_form($form) {
  * Submission handler for filtering form.
  */
 function l10n_community_filter_form_submit($form, &$form_state) {
-
-  if ($form_state['values']['op'] == t('Reset')) {
-    // Just go with the redirection flow => removes URL params.
-    return;
-  }
-
-  if ($form_state['values']['op'] == t('Filter')) {
-    $filters = l10n_community_build_filter_values($form_state['values']);
-    // Redirect keeping the relevant filters intact in the URL.
-    $form_state['redirect'] = array($_GET['q'], l10n_community_flat_filters($filters));
-  }
+  $filters = l10n_community_build_filter_values($form_state['values']);
+  // Redirect keeping the relevant filters intact in the URL.
+  $form_state['redirect'] = array($_GET['q'], l10n_community_flat_filters($filters));
 }
 
 // = Translation form building =================================================
@@ -319,7 +323,12 @@ function l10n_community_translate_form(&$form_state, $language, $filters, $strin
     ),
     'submit' => array(
       '#type' => 'submit',
-      '#value' => t('Save changes'),
+      '#value' => t('Save'),
+      '#access' => user_access('submit suggestions')
+    ),
+    'submit_continue' => array(
+      '#type' => 'submit',
+      '#value' => t('Save and continue'),
       '#access' => user_access('submit suggestions')
     ),
     'pager_bottom' => array(
@@ -793,6 +802,12 @@ function l10n_community_translate_form_submit($form, &$form_state) {
 
   // Tell the user what happened.
   l10n_community_update_message();
+
+  if ($form_state['values']['op'] == t('Save and continue')) {
+    // Increase page number if the user wanted to continue to next page.
+    $form_state['redirect'] = $form['#redirect'];
+    @$form_state['redirect'][1]['page']++;
+  }
 }
 
 // = API functions =============================================================
diff --git a/l10n_groups/l10n_groups.module b/l10n_groups/l10n_groups.module
index 763c1d9..d0fac57 100644
--- a/l10n_groups/l10n_groups.module
+++ b/l10n_groups/l10n_groups.module
@@ -382,7 +382,7 @@ function l10n_groups_broadcast($langcode) {
 function l10n_groups_l10n_community_build_language_page($language) {
   $groups = l10n_groups_get_groups();
   if (isset($groups[$language->language]) && node_access('view', $group_node = node_load($groups[$language->language]))) {
-    $output = check_markup($group_node->body, $group_node->format, FALSE) .'</div>'; 
+    $output = check_markup($group_node->body, $group_node->format, FALSE) .'</div>';
   }
   else {
     $output = t('Group not found or not accessible. No information to display.');
