diff --git a/translation_overview.pages.inc b/translation_overview.pages.inc
index cecc1d8..37fa121 100644
--- a/translation_overview.pages.inc
+++ b/translation_overview.pages.inc
@@ -167,18 +167,46 @@ function translation_overview_node_filters() {
   $filters['status'] = array(
     'title' => t('Status'),
     'options' => array(
-      '[any]' => t('any'),
+      '[any]' => t('Any'),
       'status-1' => t('published'),
       'status-0' => t('not published'),
       'promote-1' => t('promoted'),
       'promote-0' => t('not promoted'),
       'sticky-1' => t('sticky'),
       'sticky-0' => t('not sticky'),
-      'translate-0' => t('Up-to-date translation'),
-      'translate-1' => t('Outdated translation'),
     ),
   );
 
+  $filters['source_language'] = array(
+    'title' => t('Content in'),
+    'options' => array(
+      '[any]' => t('Any'),
+    ),
+  );
+
+  $filters['translation_status'] = array(
+    'title' => t('Translation status'),
+    'options' => array(
+      '[any]' => t('Any'),
+      '0' => t('Up-to-date translation'),
+      '1' => t('Outdated translation'),
+    ),
+  );
+
+  $filters['translation_missing'] = array(
+    'title' => t('No translation in'),
+    'options' => array(
+      '[any]' => t('Any'),
+    ),
+  );
+
+  foreach (locale_language_list() as $lang_code => $language) {
+    $filters['translation_missing']['options'][$lang_code] = t('!lang', array('!lang' => $language));
+    $filters['source_language']['options'][$lang_code] = t('!lang', array('!lang' => $language));
+  }
+
+  $filters['source_language']['options']['und'] = t('Language neutral');
+
   $filters['type'] = array(
     'title' => t('type'),
     'options' => array_merge(array('[any]' => t('Any')), translation_overview_node_types()),
@@ -265,6 +293,26 @@ function translation_overview_filter_form($form = array()) {
       '#title' => check_plain($filter['title']),
       '#default_value' => '[any]',
     );
+
+    if ($key == 'translation_status') {
+      $form['filters']['status']['filters'][$key] += array(
+        '#states' => array(
+          'visible' => array(
+            ':input[name="translation_missing"]' => array('value' => '[any]'),
+          ),
+        ),
+      );
+    }
+
+    if ($key == 'translation_missing') {
+      $form['filters']['status']['filters'][$key] += array(
+        '#states' => array(
+          'visible' => array(
+            ':input[name="translation_status"]' => array('value' => '[any]'),
+          ),
+        ),
+      );
+    }
   }
 
   $form['filters']['status']['actions'] = array(
@@ -329,6 +377,7 @@ function translation_overview_build_filter_query(SelectQueryInterface $query = N
 
   // Build query
   $type = NULL;
+  $translation_languages = array();
   if (isset($_SESSION['translation_overview_filter'])) {
     foreach ((array) $_SESSION['translation_overview_filter'] as $index => $filter) {
       list($key, $value) = $filter;
@@ -336,9 +385,18 @@ function translation_overview_build_filter_query(SelectQueryInterface $query = N
         case 'status':
           // Note: no exploitable hole as $key/$value have already been checked when submitted
           list($key, $value) = explode('-', $value, 2);
-
           $query->condition('n.' . $key, $value);
           break;
+        case 'source_language' :
+          $query->condition('n.language', $value);
+          break;
+        case 'translation_status':
+          // @todo: this filter won't work! See http://drupal.org/node/509336#comment-6098192
+          $query->condition('n.translate', $value);
+          break;
+        case 'translation_missing' :
+          $translation_languages[] = $value;
+          break;
         case 'category':
           $table = "tn$index";
           $query->condition("$table.tid" , $value);
@@ -360,6 +418,19 @@ function translation_overview_build_filter_query(SelectQueryInterface $query = N
     }
   }
 
+  if (!empty($translation_languages)) {
+    $languages = implode(', ', $translation_languages);
+    $subquery = new SelectQuery('node', 'k', Database::getConnection());
+    $subquery->addField('k', 'tnid');
+    $subquery->addField('k', 'language');
+    $subquery->condition('k.language', $translation_languages);
+    $subquery->condition('k.tnid', 0, '<>');
+    $query->leftJoin($subquery, 'tn', "n.tnid = tn.tnid");
+    $query->addField('tn', 'language', 'translation_lang');
+    $query->condition('n.language', $translation_languages, 'NOT IN');
+    $query->isNull('tn.language');
+  }
+
   // Make sure we limit it to translation enabled types.
   if (empty($type)) {
     $types = array_keys(translation_overview_node_types());
