diff --git a/entity_translation.admin.inc b/entity_translation.admin.inc
index b7a7d5f..8f33536 100644
--- a/entity_translation.admin.inc
+++ b/entity_translation.admin.inc
@@ -66,6 +66,7 @@ function entity_translation_overview($entity_type, $entity, $callback = NULL) {
   }
 
   $handler = entity_translation_get_handler($entity_type, $entity);
+  $handler->initPathScheme();
 
   // Initialize translations if they are empty.
   $translations = $handler->getTranslations();
diff --git a/entity_translation.module b/entity_translation.module
index 54b94ed..df2a002 100644
--- a/entity_translation.module
+++ b/entity_translation.module
@@ -297,7 +297,7 @@ function entity_translation_menu_alter(&$items) {
   $backup = array();
   $languages = entity_translation_languages();
 
-  // Initialise path schemes validation function with set of current menu items.
+  // Initialize path schemes validation function with set of current menu items.
   $_null = NULL;
   _entity_translation_validate_path_schemes($_null, FALSE, $items);
 
@@ -466,6 +466,7 @@ function entity_translation_edit_page() {
 
   // Set the current form language.
   $handler = entity_translation_get_handler($entity_type, $entity);
+  $handler->initPathScheme();
   $translations = $handler->getTranslations();
   $langcode = entity_translation_form_language($langcode, $handler);
   $handler->setFormLanguage($langcode);
@@ -579,6 +580,7 @@ function entity_translation_add_page() {
   $edit_form_item = array_shift($args);
 
   $handler = entity_translation_get_handler($entity_type, $entity);
+  $handler->initPathScheme();
   $handler->setFormLanguage($langcode);
   $handler->setSourceLanguage($source);
 
diff --git a/includes/translation.handler.inc b/includes/translation.handler.inc
index 4e98339..9f1fc82 100644
--- a/includes/translation.handler.inc
+++ b/includes/translation.handler.inc
@@ -149,6 +149,11 @@ interface EntityTranslationHandlerInterface {
   public function getViewPath();
 
   /**
+   * Returns the active path scheme.
+   */
+  public function getPathScheme();
+
+  /**
    * Changes the active path scheme.
    *
    * @param $scheme
@@ -157,6 +162,18 @@ interface EntityTranslationHandlerInterface {
   public function setPathScheme($scheme);
 
   /**
+   * Initializes the most suited path scheme based on the given path.
+   *
+   * @param $path
+   *   (optional) The path to match the defined path schemes against. Defaults
+   *   to the current path.
+   *
+   * @return
+   *   The matched path scheme key.
+   */
+  public function initPathScheme($path = NULL);
+
+  /**
    * A string allowing the user to identify the entity.
    */
   public function getLabel();
@@ -244,12 +261,13 @@ class EntityTranslationDefaultHandler implements EntityTranslationHandlerInterfa
   private $formLanguage;
   private $sourceLanguage;
 
-  private $activePathScheme;
+  private $pathScheme;
   private $pathWildcard;
   private $basePath;
   private $editPath;
   private $translatePath;
   private $viewPath;
+  private $routerMap;
 
   /**
    * Initializes an instance of the translation handler.
@@ -273,63 +291,13 @@ class EntityTranslationDefaultHandler implements EntityTranslationHandlerInterfa
     $this->outdated = FALSE;
     $this->formLanguage = FALSE;
     $this->sourceLanguage = FALSE;
-    $this->activePathScheme = $this->detectPathScheme();
+    $this->pathScheme = 'default';
+    $this->routerMap = array();
 
     $this->initPathVariables();
   }
 
   /**
-   * Find matching path scheme for current path.
-   *
-   * @return
-   *   The path scheme key which matches $_GET[q], and 'default' otherwise.
-   */
-  private function detectPathScheme() {
-    $scheme = $this->findMatchingPathScheme($_GET['q']);
-    if ($scheme) {
-      return $scheme;
-    }
-    return 'default';
-  }
-
-  /**
-   * Find a path scheme matching the given path.
-   *
-   * @param $path
-   *   The path to match against.
-   * @return
-   *   The key of the path scheme if found, FALSE otherwise.
-   */
-  protected function findMatchingPathScheme($path) {
-    $path_keys = array_flip(array('base path', 'view path', 'edit path', 'translate path'));
-    foreach ($this->entityInfo['translation']['entity_translation']['path schemes'] as $delta => $scheme) {
-      // Construct regular expression pattern for determining whether any path
-      // in the current scheme matches the current request path.
-      $path_elements = array_intersect_key($scheme, $path_keys);
-
-      // Add additional path elements which were added during
-      // entity_translation_menu_alter().
-      if (isset($path_elements['edit path'])) {
-        $path_elements[] = $path_elements['edit path'] . '/%entity_translation_language';
-        $path_elements[] = $path_elements['edit path'] . '/add/%entity_translation_language/%entity_translation_language';
-      }
-      if (isset($path_elements['translate path'])) {
-        $path_elements[] = $path_elements['translate path'] . '/delete/%entity_translation_language';
-      }
-
-      // Replace % wildcards with regexp pattern for matching parameters.
-      $path_elements = preg_replace('|%[^/]+|', '[^/]+', $path_elements);
-      // Combine all path elements into one pattern.
-      $pattern = '@^' . implode('$|^', $path_elements) . '$@';
-
-      if (preg_match($pattern, $path)) {
-        return $delta;
-      }
-    }
-    return FALSE;
-  }
-
-  /**
    * Read the translation data from the storage.
    */
   public static function loadMultiple($entity_type, $entities) {
@@ -712,15 +680,82 @@ class EntityTranslationDefaultHandler implements EntityTranslationHandlerInterfa
   }
 
   /**
-   * @see EntityTranslationHandlerInterface::switchPathScheme()
+   * @see EntityTranslationHandlerInterface::getPathScheme()
+   */
+  public function getPathScheme() {
+    return $this->pathScheme;
+  }
+
+  /**
+   * @see EntityTranslationHandlerInterface::setPathScheme()
    */
   public function setPathScheme($scheme) {
-    if ($scheme != $this->activePathScheme) {
-      $this->activePathScheme = $scheme;
+    if ($scheme != $this->pathScheme) {
+      $this->pathScheme = $scheme;
       $this->initPathVariables();
     }
   }
 
+
+  /**
+   * @see EntityTranslationHandlerInterface::initPathScheme()
+   */
+  public function initPathScheme($path = NULL) {
+    $scheme = 'default';
+
+    // If only one path scheme is defined no need to find one.
+    if (count($this->entityInfo['translation']['entity_translation']['path schemes']) > 1) {
+      $item = menu_get_item($path);
+      if (!empty($item['path'])) {
+        $current_path_scheme = $this->findMatchingPathScheme($item['path']);
+        if ($current_path_scheme) {
+          $scheme = $current_path_scheme;
+          $this->routerMap = $item['original_map'];
+        }
+      }
+    }
+
+    $this->setPathScheme($scheme);
+    return $scheme;
+  }
+
+  /**
+   * Find a path scheme matching the given path.
+   *
+   * @param $path
+   *   The path to match against.
+   * @return
+   *   The key of the path scheme if found, FALSE otherwise.
+   */
+  protected function findMatchingPathScheme($router_path) {
+    $path_keys = array_flip(array('base path', 'view path', 'edit path', 'translate path'));
+
+    foreach ($this->entityInfo['translation']['entity_translation']['path schemes'] as $delta => $scheme) {
+      // Construct regular expression pattern for determining whether any path
+      // in the current scheme matches the current request path.
+      $path_elements = array_intersect_key($scheme, $path_keys);
+
+      // Add additional path elements which were added during
+      // entity_translation_menu_alter().
+      if (isset($path_elements['edit path'])) {
+        $path_elements[] = $path_elements['edit path'] . '/%entity_translation_language';
+        $path_elements[] = $path_elements['edit path'] . '/add/%entity_translation_language/%entity_translation_language';
+      }
+      if (isset($path_elements['translate path'])) {
+        $path_elements[] = $path_elements['translate path'] . '/delete/%entity_translation_language';
+      }
+
+      // Replace wildcards with % for matching parameters.
+      $path_elements = array_flip(preg_replace('|%[^/]+|', '%', $path_elements));
+
+      if (isset($path_elements[$router_path])) {
+        return $delta;
+      }
+    }
+
+    return FALSE;
+  }
+
   /**
    * @see EntityTranslationHandlerInterface::getLabel()
    */
@@ -1161,11 +1196,11 @@ class EntityTranslationDefaultHandler implements EntityTranslationHandlerInterfa
    * @throws Exception
    */
   private function initPathVariables() {
-    if (empty($this->activePathScheme) || !isset($this->entityInfo['translation']['entity_translation']['path schemes'][$this->activePathScheme])) {
+    if (empty($this->pathScheme) || !isset($this->entityInfo['translation']['entity_translation']['path schemes'][$this->pathScheme])) {
       throw new Exception("Cannot initialize entity translation path variables (invalid path scheme).");
     }
 
-    $path_scheme = $this->entityInfo['translation']['entity_translation']['path schemes'][$this->activePathScheme];
+    $path_scheme = $this->entityInfo['translation']['entity_translation']['path schemes'][$this->pathScheme];
     $this->pathWildcard = $path_scheme['path wildcard'];
     $this->basePath = isset($path_scheme['base path']) ? $this->getPathInstance($path_scheme['base path']) : FALSE;
     $this->editPath = isset($path_scheme['edit path']) ? $this->getPathInstance($path_scheme['edit path']) : FALSE;
@@ -1183,7 +1218,18 @@ class EntityTranslationDefaultHandler implements EntityTranslationHandlerInterfa
    *   The instantiated path.
    */
   protected function getPathInstance($path) {
-    return str_replace($this->pathWildcard, $this->getEntityId(), $path);
+    $path_segments = explode('/', $path);
+
+    foreach ($path_segments as $index => $segment) {
+      if ($segment == $this->pathWildcard) {
+        $path_segments[$index] = $this->getEntityId();
+      }
+      elseif ($segment{0} == '%' && isset($this->routerMap[$index])) {
+        $path_segments[$index] = $this->routerMap[$index];
+      }
+    }
+
+    return implode('/', $path_segments);
   }
 
   /**
