diff --git a/restws.api.php b/restws.api.php
index 1de79da..25bdb49 100644
--- a/restws.api.php
+++ b/restws.api.php
@@ -34,6 +34,8 @@
  *   - label: The label of the resource. Start capitalized.
  *   - class: The name of the controller class for the resource. The class has
  *     to implement the RestWSResourceControllerInterface. Required.
+ *   - menu_path: A relative path were the resource callback should lie. By
+ *     default the resource uri will be used as uri. Optional.
  *
  * @see MyModuleBookResourceController
  */
@@ -54,12 +56,15 @@ function hook_restws_resource_info() {
  * Alter available resource information.
  *
  * @param array $resource_info
- *   Resource information as defined in hook_restws_resource_info().
+ *   Resource information as defined in hook_restws_resource_info(). You can
+ *   move the path of a resouce by setting menu_info. In this example you'll
+ *   have to retrieve nodes from /mypath/%.json.
  *
  * @see hook_restws_resource_info()
  */
 function hook_restws_resource_info_alter(&$resource_info) {
   $resource_info['node']['class'] = 'MySpecialNodeResourceController';
+  $resource_info['node']['menu_path'] = 'mypath';
 }
 
 /**
diff --git a/restws.module b/restws.module
index f8c6dd6..24ddf5a 100644
--- a/restws.module
+++ b/restws.module
@@ -209,40 +209,38 @@ function restws_menu_alter(&$items) {
       );
     }
     // Resource base path (e.g. /node or /user) for creating resources.
-    // @todo fix 'menu path'
-    if (!isset($info['menu_path'])) {
-      if (isset($items[$resource])) {
-        // Prepend the page callback and the resource to the page arguments.
-        if (!isset($items[$resource]['page arguments'])) {
-          $items[$resource]['page arguments'] = array();
-        }
-        array_unshift($items[$resource]['page arguments'], $resource, $items[$resource]['page callback']);
-        $items[$resource]['page callback'] = 'restws_page_callback';
-      }
-      else {
-        $items[$resource] = array(
-          'page callback' => 'restws_page_callback',
-          'page arguments' => array($resource),
-          'access callback' => TRUE,
-          'type' => MENU_CALLBACK,
-        );
+    $menu_path = isset($info['menu_path']) ? substr($menu_path, 0, strlen($menu_path) - 2) : $resource;
+
+    if (isset($items[$menu_path])) {
+      // Prepend the page callback and the resource to the page arguments.
+      if (!isset($items[$menu_path]['page arguments'])) {
+        $items[$menu_path]['page arguments'] = array();
       }
+      array_unshift($items[$menu_path]['page arguments'], $resource, $items[$menu_path]['page callback']);
+      $items[$menu_path]['page callback'] = 'restws_page_callback';
+    }
+    else {
+      $items[$menu_path] = array(
+        'page callback' => 'restws_page_callback',
+        'page arguments' => array($resource),
+        'access callback' => TRUE,
+        'type' => MENU_CALLBACK,
+      );
     }
-
     // Querying menu paths.
     foreach (array_keys(restws_get_format_info()) as $format) {
       // Resource base path urls with suffix.json and .xml for indexing.
-      if (isset($items["$resource.$format"])) {
+      if (isset($items["$menu_path.$format"])) {
         // Prepend the page callback and the resource to the page arguments.
-        if (!isset($items["$resource.$format"]['page arguments'])) {
-          $items["$resource.$format"]['page arguments'] = array();
+        if (!isset($items["$menu_path.$format"]['page arguments'])) {
+          $items["$menu_path.$format"]['page arguments'] = array();
         }
-        array_unshift($items["$resource.$format"]['page arguments'], $resource, $items["$resource.$format"]['page callback']);
-        $items["$resource.$format"]['page callback'] = 'restws_page_callback';
+        array_unshift($items["$menu_path.$format"]['page arguments'], $resource, $items["$menu_path.$format"]['page callback']);
+        $items["$menu_path.$format"]['page callback'] = 'restws_page_callback';
 
       }
       else {
-        $items["$resource.$format"] = array(
+        $items["$menu_path.$format"] = array(
           'page callback' => 'restws_page_callback',
           'page arguments' => array($resource),
           'access callback' => TRUE,
diff --git a/restws.test b/restws.test
index 9fe124a..dd40bc5 100644
--- a/restws.test
+++ b/restws.test
@@ -325,6 +325,24 @@ class RestWSTestCase extends DrupalWebTestCase {
   }
 
   /**
+   * Test menu path resource setting.
+   */
+  public function testMenuPath() {
+    module_enable(array('restws_test'));
+
+    $account = $this->drupalCreateUser(array('access content',
+        'bypass node access', 'access resource node')
+    );
+    $this->drupalLogin($account);
+
+    $title = $this->randomName(8);
+    $node = $this->drupalCreateNode(array('title' => $title));
+
+    $result = $this->httpRequest('foo/1.json', 'GET', $account);
+    $this->assertEqual($node->title, $title, "Node was received correctly on the right menu path.");
+  }
+
+  /**
    * Creates a term.
    */
   protected function createTerm($term_name) {
diff --git a/tests/restws_test.info b/tests/restws_test.info
new file mode 100644
index 0000000..d549fb4
--- /dev/null
+++ b/tests/restws_test.info
@@ -0,0 +1,5 @@
+name = RESTful web services test module
+description = "Support module for the RestWS tests."
+package = Testing
+core = 7.x
+hidden = TRUE
diff --git a/tests/restws_test.module b/tests/restws_test.module
new file mode 100644
index 0000000..ae6ae79
--- /dev/null
+++ b/tests/restws_test.module
@@ -0,0 +1,14 @@
+<?php
+
+/**
+ * @file
+ * RESTful web services test module.
+ */
+
+/**
+ * Implements hook_restws_resource_info_alter().
+ * @see RestWSTestCase::testMenuPath().
+ */
+function restws_test_restws_resource_info_alter(&$resource_info) {
+  $resource_info['node']['menu_path'] = 'foo';
+}
