diff --git a/taxonomy_menu_path_custom.info b/taxonomy_menu_path_custom.info
new file mode 100644
index 0000000..10d5382
--- /dev/null
+++ b/taxonomy_menu_path_custom.info
@@ -0,0 +1,8 @@
+core           = 7.x
+dependencies[] = taxonomy_menu
+description    = Enables Custom path base to Taxonomy Menu.
+name           = Taxonomy Menu Custom Path
+package        = Taxonomy menu
+
+; Tests
+files[] = tests/taxonomy_menu_path_custom.test
diff --git a/taxonomy_menu_path_custom.module b/taxonomy_menu_path_custom.module
new file mode 100644
index 0000000..72bb231
--- /dev/null
+++ b/taxonomy_menu_path_custom.module
@@ -0,0 +1,117 @@
+<?php
+
+/**
+ * Vocbaulary config form additions.
+ *
+ * Implements hook_form_FORM_ID_alter().
+ */
+function taxonomy_menu_path_custom_form_taxonomy_form_vocabulary_alter(&$form, &$form_state) {
+  // Get the vocabulary ID.
+  $vid = (isset($form['vid']) && $form['vid']['#value']) ? $form['vid']['#value'] : 0;
+
+  $form['taxonomy_menu']['taxonomy_menu_path_custom'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Custom path options'),
+    '#collapsible' => TRUE,
+    '#collapsed' => TRUE,
+  );
+  $form['taxonomy_menu']['taxonomy_menu_path_custom']['taxonomy_menu_path_custom_depth'] = array(
+    '#title' => t('Display depth in custom path'),
+    '#weight' => -2,
+    '#description' => t("Only used with a custom path.<br />To use depth the path in the view has to have the path of '<base path for custom path>/%/%'. The two arguments must be 'Term ID (with depth)' and 'Depth modifier'.<br />Have this view setup <strong>before</strong> you create this taxonomy menu. Otherwise leave this field empty!"),
+    '#default_value' => variable_get(_taxonomy_menu_build_variable('taxonomy_menu_path_custom_depth', $vid), ''),
+    '#type' => 'textfield',
+  );
+  $form['taxonomy_menu']['taxonomy_menu_path_custom']['taxonomy_menu_path_custom_base_path'] = array(
+    '#title' => t('Base path for custom path'),
+    '#weight' => -3,
+    '#type' => 'textfield',
+    '#default_value' => variable_get(_taxonomy_menu_build_variable('taxonomy_menu_path_custom_base_path', $vid), 'category'),
+    '#description' => t("Only used with a custom path.<br />You need to have a view with path 'custom path/%' and an argument 'Term ID' <strong>before</strong> you create this taxonomy menu."),
+  );
+  $form['taxonomy_menu']['taxonomy_menu_path_custom']['taxonomy_menu_path_custom_use_term_name'] = array(
+    '#title' => t('Use term name'),
+    '#weight' => -1,
+    '#type' => 'checkbox',
+    '#default_value' => variable_get(_taxonomy_menu_build_variable('taxonomy_menu_path_custom_use_term_name', $vid), FALSE),
+    '#description' => t("If checked, use term name instead of term ID."),
+  );
+
+  $form['#submit'][] = 'taxonomy_menu_vocab_submit';
+}
+
+/**
+ * Vocbaulary config form additions callback.
+ *
+ * @see taxonomy_menu_path_custom_form_taxonomy_form_vocabulary_alter()
+ */
+function taxonomy_menu_path_custom_form_taxonomy_form_vocabulary_submit($form, &$form_state) {
+  variable_set(_taxonomy_menu_build_variable('taxonomy_menu_path_custom_depth', $vid),
+    $form_state['values']['taxonomy_menu']['taxonomy_menu_path_custom']['taxonomy_menu_path_custom_depth']);
+  variable_set(_taxonomy_menu_build_variable('taxonomy_menu_path_custom_use_term_name', $vid),
+    $form_state['values']['taxonomy_menu']['taxonomy_menu_path_custom']['taxonomy_menu_path_custom_base_path']);
+  variable_set(_taxonomy_menu_build_variable('taxonomy_menu_path_custom_use_term_name', $vid),
+    $form_state['values']['taxonomy_menu']['taxonomy_menu_path_custom']['taxonomy_menu_path_custom_use_term_name']);
+}
+
+/**
+ * Implements hook_taxonomy_menu_path().
+ */
+function taxonomy_menu_path_custom_taxonomy_menu_path() {
+  $output = array(
+    'taxonomy_menu_path_custom_path' => t('Custom path'),
+  );
+
+  return $output;
+}
+
+/**
+ * Callback for taxonomy_menu_path()
+ */
+function taxonomy_menu_path_custom_path($vid, $tid) {
+  $base_path = variable_get(_taxonomy_menu_build_variable('taxonomy_menu_path_custom_base_path', $vid), 'category');
+  $depth = variable_get(_taxonomy_menu_build_variable('taxonomy_menu_path_custom_depth', $vid), '');
+
+  //if tid = 0 then we are creating the vocab menu item format will be taxonomy/term/$tid+$tid+$tid....
+  if ($tid == 0) {
+    //get all of the terms for the vocab
+    $vtid_objs = _taxonomy_menu_get_terms($vid);
+    $vtids = array();
+    foreach ($vtid_objs as $vtob) {
+      $vtids[] = $vtob->tid;
+    }
+    $end = implode(' ', $vtids);
+    $path = $base_path . '/' . $end;
+  }
+  else {
+    $path = $base_path . '/' . $tid;
+    if (variable_get(_taxonomy_menu_build_variable('display_descendants', $vid), FALSE)) {
+      //we wait to run this instead of durning the if above
+      //because we only wan to run it once.
+      $terms = taxonomy_get_tree($vid, $tid);
+      foreach ($terms as $term) {
+        $tids[] = $term->tid;
+      }
+      if ($tids) {
+        $end = implode(' ', $tids);
+        $path .= ' ' . $end;
+      }
+    }
+  }
+  if ($depth != '') {
+    $path .= '/' . $depth;
+  }
+
+  if (variable_get(_taxonomy_menu_build_variable('taxonomy_menu_path_custom_use_term_name', $vid), FALSE)) {
+    $tids = isset($tids) ? $tids : array($tid);
+
+    foreach ($tids as $tid) {
+      $term = taxonomy_term_load($tid);
+      $names[] = strtolower(str_replace(' ', '-', $term->name));
+    }
+
+    $path = $base_path . '/' . implode(' ', $names);
+  }
+
+  return $path;
+}
diff --git a/tests/taxonomy_menu_path_custom.test b/tests/taxonomy_menu_path_custom.test
new file mode 100644
index 0000000..d39c9c4
--- /dev/null
+++ b/tests/taxonomy_menu_path_custom.test
@@ -0,0 +1,111 @@
+<?php
+
+/**
+ * @file
+ * Tests for taxonomy_menu.module.
+ *
+ * @TODO Add tests for other configuration options:
+ *   - Display children.
+ *   - Display number of children.
+ *   - Edition of nodes.
+ */
+
+/**
+ * Provides common helper methods for Taxonomy Menu Custom Path module tests.
+ */
+class TaxonomyMenuCustomPathWebTestCase extends TaxonomyMenuWebTestCase {
+
+  function setUp() {
+    TaxonomyWebTestCase::setUp(array('taxonomy_menu_path_custom'));
+    // Create and login administrative user.
+    $admin_user = $this->drupalCreateUser(array('administer taxonomy', 'administer menu', 'bypass node access'));
+    $this->drupalLogin($admin_user);
+    // Create a vocabulary and a hierarchy of taxonomy terms for it.
+    $this->vocabulary = $this->createVocabulary();
+    $this->hierarchy = $this->createTermsHierarchy($this->vocabulary);
+  }
+
+}
+
+/**
+ * Tests Taxonomy Menu Custom Path configuration options.
+ */
+class TaxonomyMenuCustomPathConfigurationTest extends TaxonomyMenuCustomPathWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Configuration options',
+      'description' => 'Test configuration options.',
+      'group' => 'Taxonomy Menu Custom Path',
+    );
+  }
+
+  /**
+   * Test base path
+   */
+  function testTaxonomyMenuCustomPathBasePath() {
+    $vocab = $this->vocabulary->machine_name;
+
+    // Enable base path.
+    $edit = array(
+      'taxonomy_menu[vocab_parent]' => 'main-menu:0',
+      'taxonomy_menu[path]' => 'taxonomy_menu_path_custom_path',
+      'taxonomy_menu[taxonomy_menu_path_custom][taxonomy_menu_path_custom_base_path]' => 'test_path',
+    );
+    $this->drupalPost('admin/structure/taxonomy/' . $vocab . '/edit', $edit, t('Save'));
+    $this->assertResponse(200);
+
+    // Assert base path.
+    $test_term = $this->hierarchy[3]; // Arbitrary term from hierarchy
+    $mlid = _taxonomy_menu_get_mlid($test_term->tid, $this->vocabulary->vid);
+    $menu_link = menu_link_load($mlid);
+    $this->assertEqual("test_path/{$test_term->tid}", $menu_link['link_path']);
+  }
+
+  /**
+   * Test depth
+   */
+  function testTaxonomyMenuCustomPathDepth() {
+    $vocab = $this->vocabulary->machine_name;
+
+    // Enable depth.
+    $edit = array(
+      'taxonomy_menu[vocab_parent]' => 'main-menu:0',
+      'taxonomy_menu[path]' => 'taxonomy_menu_path_custom_path',
+      'taxonomy_menu[taxonomy_menu_path_custom][taxonomy_menu_path_custom_base_path]' => 'test_path',
+      'taxonomy_menu[taxonomy_menu_path_custom][taxonomy_menu_path_custom_depth]' => '1',
+    );
+    $this->drupalPost('admin/structure/taxonomy/' . $vocab . '/edit', $edit, t('Save'));
+    $this->assertResponse(200);
+
+    // Assert depth.
+    $test_term = $this->hierarchy[3]; // Arbitrary term from hierarchy
+    $mlid = _taxonomy_menu_get_mlid($test_term->tid, $this->vocabulary->vid);
+    $menu_link = menu_link_load($mlid);
+    $this->assertEqual("test_path/{$test_term->tid}/1", $menu_link['link_path']);
+  }
+
+  /**
+   * Test term name
+   */
+  function testTaxonomyMenuCustomPathTermName() {
+    $vocab = $this->vocabulary->machine_name;
+
+    // Enable term name.
+    $edit = array(
+        'taxonomy_menu[vocab_parent]' => 'main-menu:0',
+        'taxonomy_menu[path]' => 'taxonomy_menu_path_custom_path',
+        'taxonomy_menu[taxonomy_menu_path_custom][taxonomy_menu_path_custom_base_path]' => 'test_path',
+        'taxonomy_menu[taxonomy_menu_path_custom][taxonomy_menu_path_custom_use_term_name]' => 1,
+    );
+    $this->drupalPost('admin/structure/taxonomy/' . $vocab . '/edit', $edit, t('Save'));
+    $this->assertResponse(200);
+
+    // Assert term name.
+    $test_term = $this->hierarchy[3]; // Arbitrary term from hierarchy
+    $mlid = _taxonomy_menu_get_mlid($test_term->tid, $this->vocabulary->vid);
+    $menu_link = menu_link_load($mlid);
+    $this->assertEqual('test_path/' . strtolower(str_replace(' ', '-', $test_term->name)), $menu_link['link_path']);
+  }
+
+}
