diff --git a/taxonomy_menu_custom_path/taxonomy_menu_custom_path.info b/taxonomy_menu_custom_path/taxonomy_menu_custom_path.info
new file mode 100644
index 0000000..9a07de5
--- /dev/null
+++ b/taxonomy_menu_custom_path/taxonomy_menu_custom_path.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_custom_path.test
diff --git a/taxonomy_menu_custom_path/taxonomy_menu_custom_path.module b/taxonomy_menu_custom_path/taxonomy_menu_custom_path.module
new file mode 100644
index 0000000..9f89ca1
--- /dev/null
+++ b/taxonomy_menu_custom_path/taxonomy_menu_custom_path.module
@@ -0,0 +1,98 @@
+<?php
+
+/**
+ * Implements hook_taxonomy_menu_vocabulary_settings()
+ */
+function taxonomy_menu_custom_path_taxonomy_menu_vocabulary_settings() {
+  $defaults = array(
+    'custom_path_base' => '',
+    'custom_path_depth' => '',
+    'custom_path_use_term_name' => FALSE,
+  );
+
+  return $defaults;
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter().
+ * Adds Taxonomy menu custom path settings on a per-vocabulary basis.
+ *
+ * @see taxonomy_menu_vocab_submit()
+ */
+function taxonomy_menu_custom_path_form_taxonomy_form_vocabulary_alter(&$form, &$form_state) {
+  $vid = (isset($form['vid']) && $form['vid']['#value']) ? $form['vid']['#value'] : 0;
+
+  $form['taxonomy_menu']['options_custom_path'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Custom path options'),
+    '#collapsible' => TRUE,
+    '#collapsed' => TRUE,
+  );
+  $form['taxonomy_menu']['options_custom_path']['custom_path_base'] = array(
+    '#title' => t('Base path'),
+    '#weight' => 0,
+    '#type' => 'textfield',
+    '#default_value' => taxonomy_menu_variable_get('custom_path_base', $vid, ''),
+    '#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']['options_custom_path']['custom_path_depth'] = array(
+    '#title' => t('Display depth'),
+    '#weight' => 1,
+    '#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' => taxonomy_menu_variable_get('custom_path_depth', $vid, ''),
+    '#type' => 'textfield',
+  );
+  $form['taxonomy_menu']['options_custom_path']['custom_path_use_term_name'] = array(
+    '#title' => t('Use term name'),
+    '#weight' => 2,
+    '#type' => 'checkbox',
+    '#default_value' => taxonomy_menu_variable_get('custom_path_use_term_name', $vid, FALSE),
+    '#description' => t("If checked, use term name instead of term ID."),
+  );
+}
+
+/**
+ * Implements hook_taxonomy_menu_path().
+ */
+function taxonomy_menu_custom_path_taxonomy_menu_path() {
+  $output = array(
+    'taxonomy_menu_path_custom' => t('Custom (<base_path>/%)'),
+  );
+
+  return $output;
+}
+
+/**
+ * Callback for hook_taxonomy_menu_path.
+ */
+function taxonomy_menu_path_custom($vid, $tid) {
+  $path = '';
+  $tids = array();
+  $base_path = taxonomy_menu_variable_get('custom_path_base', $vid, '');
+  $depth = taxonomy_menu_variable_get('custom_path_depth', $vid, '');
+
+  // When tid equals 0, we are dealing with a vocabulary item. We want the path
+  // to be a mulitple term path.
+  if ($tid == 0) {
+    $tids = _taxonomy_menu_get_tids($vid);
+  }
+  else {
+    $tids[] = $tid;
+    $terms = taxonomy_get_tree($vid, $tid);
+    foreach ($terms as $term) {
+      $tids[] = $term->tid;
+    }
+  }
+  // Build the path.
+  if ($tids) {
+    $path = $base_path . '/' . implode('+', $tids);
+  }
+  else {
+    $path = $base_path . '/' . $tid;
+  }
+  if ($depth != '') {
+    $path .= '/' . $depth;
+  }
+
+  return $path;
+}
diff --git a/tests/taxonomy_menu_custom_path.test b/tests/taxonomy_menu_custom_path.test
new file mode 100644
index 0000000..ef1ced8
--- /dev/null
+++ b/tests/taxonomy_menu_custom_path.test
@@ -0,0 +1,106 @@
+<?php
+
+/**
+ * @file
+ * Tests for taxonomy_menu_custom_path.module.
+ */
+
+/**
+ * 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']);
+  }
+
+}
