diff --git a/i18n_string/i18n_string.inc b/i18n_string/i18n_string.inc
index c93e103..2a8ebe6 100644
--- a/i18n_string/i18n_string.inc
+++ b/i18n_string/i18n_string.inc
@@ -692,6 +692,27 @@ class i18n_string_default {
       $this->save_string($string);
     }
   }
+  
+  /**
+   * Get edit path for object
+   * 
+   * @param $type
+   * 	 Object type in this text group, like 'vocabulary', 'term', etc..
+   * @param $object
+   *   The Drupal object itself
+   */
+  public function get_edit_path($type, $object) {
+  }
+  /**
+   * Get translate path for object
+   * 
+   * @param $type
+   * 	 Object type in this text group, like 'vocabulary', 'term', etc..
+   * @param $object
+   *   The Drupal object itself
+   */
+  public function get_translate_path($type, $object) {
+  }
 }
 
 /**
diff --git a/i18n_string/i18n_string.pages.inc b/i18n_string/i18n_string.pages.inc
index f7e254b..5e4b992 100644
--- a/i18n_string/i18n_string.pages.inc
+++ b/i18n_string/i18n_string.pages.inc
@@ -10,15 +10,28 @@
 /**
  * Generic translation interface for i18n_strings objects.
  */
-function i18n_string_translate_page($form_meta, $langcode = NULL) {
+function i18n_string_translate_page($object_type, $object, $langcode = NULL, $form_meta = NULL) {
+  $info = i18n_object_info($object_type);
+  $textgroup = i18n_string_textgroup($info['string translation']['textgroup']);
+  
+  // If we don't have form_meta we build it from object type
+  if (!$form_meta) {
+    $type = $info['string translation']['type'];
+    $form_meta = array(
+      '#page_title' => t('Translate !name', array('!name' => $info['title'])),
+      '#edit' => $textgroup->get_edit_path($type, $object),
+      '#translate' => $textgroup->get_translate_path($type, $object),
+      '#type' => $object_type,
+      '#object' => $object,
+    );
+  }
+  
   $form_meta += array(
     '#item_title_header' => t('Title'),
   );
 
   // If there is an object property, get the items from there.
   if (!empty($form_meta['#type']) && !empty($form_meta['#object'])) {
-    $info = i18n_object_info($form_meta['#type']);
-
     foreach ($info['string translation']['properties'] as $key => $title) {
       if (!empty($form_meta['#object']->{$key})) {
         $form_meta['#items'][] = array(
diff --git a/i18n_taxonomy/i18n_taxonomy.admin.inc b/i18n_taxonomy/i18n_taxonomy.admin.inc
index d6e7c2b..129a92a 100644
--- a/i18n_taxonomy/i18n_taxonomy.admin.inc
+++ b/i18n_taxonomy/i18n_taxonomy.admin.inc
@@ -291,12 +291,5 @@ function i18n_taxonomy_translation_term_overview($term) {
  */
 function i18n_taxonomy_translation_vocabulary_page($vocabulary, $language = NULL) {
   module_load_include('inc', 'i18n_string', 'i18n_string.pages');
-  $form_meta = array(
-    '#page_title' => t('Translate vocabulary'),
-    '#edit' => 'admin/structure/taxonomy/' . $vocabulary->machine_name . '/edit',
-    '#translate' => 'admin/structure/taxonomy/' . $vocabulary->machine_name . '/translate',
-    '#type' => 'taxonomy_vocabulary',
-    '#object' => $vocabulary,
-  );
-  return i18n_string_translate_page($form_meta, $language);
+  return i18n_string_translate_page('taxonomy_vocabulary', $vocabulary, $language);
 }
diff --git a/i18n_taxonomy/i18n_taxonomy.inc b/i18n_taxonomy/i18n_taxonomy.inc
index c3ad30f..7529545 100644
--- a/i18n_taxonomy/i18n_taxonomy.inc
+++ b/i18n_taxonomy/i18n_taxonomy.inc
@@ -10,4 +10,42 @@ class i18n_taxonomy_translation_set extends i18n_translation_set {
   public function load_translations() {
     return i18n_translation_set_index(taxonomy_term_load_multiple(array(), array('i18n_tsid' => $this->tsid)));
   }
+}
+
+/**
+ * Taxonomy textgroup handler
+ */
+class i18n_taxonomy_textgroup extends i18n_string_default {
+  /**
+   * Get edit path for object
+   * 
+   * @param $type
+   * 	 Object type in this text group, like 'vocabulary', 'term', etc..
+   * @param $object
+   *   The Drupal object itself
+   */
+  public function get_edit_path($type, $object) {
+    switch ($type) {
+      case 'term':
+        return 'taxonomy/term/' . $object->tid . '/edit';
+      case 'vocabulary':
+        return 'admin/structure/taxonomy/' . $object->machine_name . '/edit';
+    }
+  }
+  /**
+   * Get translate path for object
+   * 
+   * @param $type
+   * 	 Object type in this text group, like 'vocabulary', 'term', etc..
+   * @param $object
+   *   The Drupal object itself
+   */
+  public function get_translate_path($type, $object) {
+    switch ($type) {
+      case 'term':
+        return 'taxonomy/term/' . $object->tid . '/translate';
+      case 'vocabulary':
+        return 'admin/structure/taxonomy/' . $object->machine_name . '/translate';
+    }
+  }
 }
\ No newline at end of file
diff --git a/i18n_taxonomy/i18n_taxonomy.module b/i18n_taxonomy/i18n_taxonomy.module
index a53f0b0..1e65f4f 100644
--- a/i18n_taxonomy/i18n_taxonomy.module
+++ b/i18n_taxonomy/i18n_taxonomy.module
@@ -431,6 +431,7 @@ function i18n_taxonomy_i18n_string_info() {
     'format' => FALSE, // This group doesn't have strings with format
     'list' => FALSE, // This group cannot list all strings
     'refresh callback' => 'i18n_taxonomy_i18n_string_refresh',
+    'class' => 'i18n_taxonomy_textgroup',
   );
   return $groups;
 }
