diff --git a/sources/i18n_string/tmgmt_i18n_string.module b/sources/i18n_string/tmgmt_i18n_string.module
index f7a5b4e..2c363e4 100644
--- a/sources/i18n_string/tmgmt_i18n_string.module
+++ b/sources/i18n_string/tmgmt_i18n_string.module
@@ -273,3 +273,20 @@ function tmgmt_i18n_string_get_wrapper($type, $i18n_string) {
   }
 }
 
+/**
+ * Returns textgroups that are handled by the module.
+ *
+ * Used by other modules.
+ *
+ * @return array
+ *   An array of locale textgroups.
+ */
+function tmgmt_i18n_string_handled_textgroups() {
+  $textgroups = array();
+  foreach (i18n_object_info() as $info) {
+    if (isset($info['string translation']['textgroup'])) {
+      $textgroups[] = $info['string translation']['textgroup'];
+    }
+  }
+  return array_values(array_unique($textgroups));
+}
diff --git a/sources/locale/tmgmt_locale.module b/sources/locale/tmgmt_locale.module
index 3f08910..1a0eb52 100644
--- a/sources/locale/tmgmt_locale.module
+++ b/sources/locale/tmgmt_locale.module
@@ -21,5 +21,17 @@ function tmgmt_locale_tmgmt_source_plugin_info() {
     ),
   );
 
+  // Add all textgroups that are not processed by the tmgmt_i18n_string.
+  $all_textgroups = module_invoke_all('locale', 'groups');
+  foreach ($all_textgroups as $textgroup => $name) {
+    // Handle rare case when name is an array.
+    if (is_array($name)) {
+      $all_textgroups[$textgroup] = array_shift($name);
+    }
+  }
+  $i18n_textgroups = module_invoke('tmgmt_i18n_string', 'handled_textgroups');
+  $i18n_textgroups = $i18n_textgroups ? $i18n_textgroups : array();
+  $info['locale']['item types'] += array_diff_key($all_textgroups, array_flip($i18n_textgroups));
+
   return $info;
 }
