diff --git a/core/includes/gettext.inc b/core/includes/gettext.inc
index 9398a5f..2d6971c 100644
--- a/core/includes/gettext.inc
+++ b/core/includes/gettext.inc
@@ -503,6 +503,7 @@ function _locale_import_one_string_db(&$report, $langcode, $context, $source, $t
             'translation' => $translation,
             'plid' => $plid,
             'plural' => $plural,
+            'status' => LOCALE_TARGET_COMMUNITY_PROVIDED,
           ))
           ->execute();
 
@@ -515,6 +516,7 @@ function _locale_import_one_string_db(&$report, $langcode, $context, $source, $t
             'translation' => $translation,
             'plid' => $plid,
             'plural' => $plural,
+            'status' => LOCALE_TARGET_COMMUNITY_PROVIDED,
           ))
           ->condition('language', $langcode)
           ->condition('lid', $lid)
@@ -539,7 +541,8 @@ function _locale_import_one_string_db(&$report, $langcode, $context, $source, $t
            'language' => $langcode,
            'translation' => $translation,
            'plid' => $plid,
-           'plural' => $plural
+           'plural' => $plural,
+           'status' => LOCALE_TARGET_COMMUNITY_PROVIDED,
         ))
         ->execute();
 
diff --git a/core/includes/locale.inc b/core/includes/locale.inc
index ab11d31..fc5bbfe 100644
--- a/core/includes/locale.inc
+++ b/core/includes/locale.inc
@@ -73,6 +73,19 @@ define('LOCALE_JS_OBJECT_CONTEXT', '
 ');
 
 /**
+ * Status of translation string, signifying it's imported from an external
+ * source (e.g. .po file, translation server) and
+ * @todo finish description - truth in above probably depends on option value specified on import
+ */
+const LOCALE_TARGET_COMMUNITY_PROVIDED = 0;
+
+/**
+ * Status of translation string, signifying it's inserted by a user through the
+ * website UI
+ */
+const LOCALE_TARGET_USER_PROVIDED = 1;
+
+/**
  * Translation import mode overwriting all existing translations
  * if new translated version available.
  */
diff --git a/core/modules/locale/locale.install b/core/modules/locale/locale.install
index 0ee7907..894431d 100644
--- a/core/modules/locale/locale.install
+++ b/core/modules/locale/locale.install
@@ -188,6 +188,12 @@ function locale_schema() {
         'default' => 0,
         'description' => 'Plural index number in case of plural strings.',
       ),
+      'status' => array(
+ // @todo naming of 'status'? Otherwise name 'source'? "target source", egh...
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0, // LOCALE_TARGET_COMMUNITY_PROVIDED
+      ),
     ),
     'primary key' => array('language', 'lid', 'plural'),
     'foreign keys' => array(
@@ -232,6 +238,25 @@ function locale_update_8000() {
 }
 
 /**
+ * Add status column to locales_target.
+ */
+function locale_update_8001() {
+  $spec = array(
+    'type' => 'int',
+    'not null' => TRUE,
+    'default' => 0, // LOCALE_TARGET_STATUS_COMMUNITY_PROVIDED
+  );
+  db_add_field('locales_target', 'status', $spec);
+
+  // If l10n_update module is installed copy its status data.
+  if (db_field_exists('locales_target', 'l10n_status')) {
+    db_update('locales_target')
+      ->expression('status', 'l10n_status')
+      ->execute();
+  }
+}
+
+/**
  * @} End of "addtogroup updates-7.x-to-8.x"
  * The next series of updates should start at 9000.
  */
diff --git a/core/modules/locale/locale.pages.inc b/core/modules/locale/locale.pages.inc
index e41bae5..b406a1f 100644
--- a/core/modules/locale/locale.pages.inc
+++ b/core/modules/locale/locale.pages.inc
@@ -36,10 +36,15 @@ function _locale_translate_seek() {
   $sql_query = db_select('locales_source', 's');
   $sql_query->leftJoin('locales_target', 't', 't.lid = s.lid');
   $sql_query->fields('s', array('source', 'location', 'context', 'lid'));
-  $sql_query->fields('t', array('translation', 'language'));
+  $sql_query->fields('t', array('translation', 'language', 'status'));
 
   // Compute LIKE section.
   switch ($query['translation']) {
+    case 'translated_user':
+    case 'translated_community':
+      $sql_query->condition('t.status',
+        $query['translation'] == 'translated_user' ? LOCALE_TARGET_USER_PROVIDED : LOCALE_TARGET_COMMUNITY_PROVIDED, '=');
+      // No break!
     case 'translated':
       $sql_query->condition('t.translation', '%' . db_like($query['string']) . '%', 'LIKE');
       $sql_query->orderBy('t.translation', 'DESC');
@@ -73,7 +78,6 @@ function _locale_translate_seek() {
   $locales = $sql_query->execute();
 
   $header = array(t('String'), t('Context'), ($limit_language) ? t('Language') : t('Languages'), array('data' => t('Operations'), 'colspan' => '2'));
-
   $strings = array();
   foreach ($locales as $locale) {
     if (!isset($strings[$locale->lid])) {
@@ -172,7 +176,13 @@ function locale_translation_filters() {
 
   $filters['translation'] = array(
     'title' => t('Search in'),
-    'options' => array('all' => t('Both translated and untranslated strings'), 'translated' => t('Only translated strings'), 'untranslated' => t('Only untranslated strings')),
+    'options' => array(
+      'all' => t('Both translated and untranslated strings'),
+      'translated' => t('Translated strings'),
+      'translated_community' => t('Translated strings, default translation'),
+      'translated_user' => t('Translated strings, custom translation'),
+      'untranslated' => t('Untranslated strings')
+    ),
   );
 
   return $filters;
@@ -353,21 +363,23 @@ function locale_translate_edit_form_submit($form, &$form_state) {
     $translation = db_query("SELECT translation FROM {locales_target} WHERE lid = :lid AND language = :language", array(':lid' => $lid, ':language' => $key))->fetchField();
     if (!empty($value)) {
       // Only update or insert if we have a value to use.
-      if (!empty($translation)) {
+      if (!empty($translation) && $translation != $value) {
         db_update('locales_target')
           ->fields(array(
             'translation' => $value,
+            'status' => LOCALE_TARGET_USER_PROVIDED,
           ))
           ->condition('lid', $lid)
           ->condition('language', $key)
           ->execute();
       }
-      else {
+      if (empty($translation)) {
         db_insert('locales_target')
           ->fields(array(
             'lid' => $lid,
             'translation' => $value,
             'language' => $key,
+            'status' => LOCALE_TARGET_USER_PROVIDED,
           ))
           ->execute();
       }
