diff --git a/language_hierarchy.info b/language_hierarchy.info
index cbad4a7..112ebc8 100644
--- a/language_hierarchy.info
+++ b/language_hierarchy.info
@@ -8,6 +8,7 @@ dependencies[] = locale
 ; Classes
 files[] = includes/LocaleHierarchy.class.inc
 files[] = includes/LocaleContextHierarchy.class.inc
+files[] = includes/language_hierarchy_i18n_string_textgroup_default.class.inc
 
 ; Views handlers
 files[] = views/handlers/filter_language.inc
diff --git a/language_hierarchy.module b/language_hierarchy.module
index 96da127..28b06c2 100644
--- a/language_hierarchy.module
+++ b/language_hierarchy.module
@@ -224,6 +224,79 @@ function language_hierarchy_form_alter(&$form, &$form_state, $form_id) {
 }
 
 /**
+ * Implements hook_i18n_string_info_alter().
+ */
+function language_hierarchy_i18n_string_info_alter(&$object_info) {
+  foreach ($object_info as $type => &$info) {
+    if (!isset($info['class']) || $info['class'] == 'i18n_string_textgroup_default') {
+      $info['class'] = 'language_hierarchy_i18n_string_textgroup_default';
+    }
+  }
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter().
+ */
+function language_hierarchy_form_i18n_string_translate_page_overview_form_alter(&$form, &$form_state) {
+  $strings = $form_state['build_info']['args'][1];
+  $source_langcode = variable_get_value('i18n_string_source_language');
+  $languages = language_list();
+  foreach ($form['languages']['#rows'] as $langcode => &$row) {
+    if ($langcode != $source_langcode) {
+      foreach ($strings as $string_object) {
+        if ($string_object->get_translation($langcode)) {
+          $fallback_langcode = _language_hierarchy_get_i18n_string_translation_fallback_langcode($string_object, $langcode);
+          if ($fallback_langcode !== NULL) {
+            $row['status'] = t('fallback from @language', array('@language' => $languages[$fallback_langcode]->name));
+          }
+          break;
+        }
+      }
+    }
+  }
+  unset($row);
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter().
+ */
+function language_hierarchy_form_i18n_string_translate_page_form_alter(&$form, &$form_state) {
+  $languages = language_list();
+  foreach ($form['string_groups']['#value'] as $group_key => $strings) {
+    foreach ($strings as $string_object) {
+      $fallback_langcode = _language_hierarchy_get_i18n_string_translation_fallback_langcode($string_object, $form['langcode']['#value']);
+      if ($fallback_langcode !== NULL) {
+        $name = $string_object->get_name();
+        $form['strings'][$group_key][$name]['#description'] .= t('The @language fallback is currently used for this string. If you save this string, a new one will be created and the fallback not used anymore.', array('@language' => $languages[$fallback_langcode]->name));
+      }
+    }
+  }
+}
+
+/**
+ * Returns fallback language code if fallback is used.
+ *
+ * @param i18n_string_object $string_object
+ * @param string $langcode
+ *
+ * @return string|null
+ */
+function _language_hierarchy_get_i18n_string_translation_fallback_langcode($string_object, $langcode) {
+  $class = i18n_string_group_info($string_object->textgroup, 'class', 'i18n_string_textgroup_default');
+  $group_object = new $class($string_object->textgroup);
+  if ($group_object instanceof language_hierarchy_i18n_string_textgroup_default) {
+    $show_language =& drupal_static('language_hierarchy_i18n_show_language');
+    $show_language = TRUE;
+    $translation = $group_object->load_translation($string_object, $langcode);
+    drupal_static_reset('language_hierarchy_i18n_show_language');
+    if ($translation && $translation->language != $langcode) {
+      return $translation->language;
+    }
+  }
+  return NULL;
+}
+
+/**
  * Returns parent language of the provided language.
  *
  * @param $langcode
