diff --git auth/services_keyauth/services_keyauth.inc auth/services_keyauth/services_keyauth.inc
index d30d957..e0dd279 100644
--- auth/services_keyauth/services_keyauth.inc
+++ auth/services_keyauth/services_keyauth.inc
@@ -153,14 +153,14 @@ function _services_keyauth_authenticate_call($method, $method_name, &$args) {
     $expiry_time = $timestamp + variable_get('services_key_expiry', 30);
 
     if ($expiry_time < time()) {
-      return services_error(t('Token has expired.'));
+      return services_error(t('Token has expired.'), 401);
     }
 
     // Still in time but has it been used before
     if (db_result(db_query("SELECT count(*) FROM {services_timestamp_nonce}
         WHERE domain = '%s' AND nonce = '%s'",
         $domain, $nonce))) {
-      return services_error(t('Token has been used previously for a request. Re-try with another nonce key.'));
+      return services_error(t('Token has been used previously for a request. Re-try with another nonce key.', 401));
     }
     else{
       db_query("INSERT INTO {services_timestamp_nonce} (domain, timestamp, nonce)
@@ -171,12 +171,12 @@ function _services_keyauth_authenticate_call($method, $method_name, &$args) {
 
     //if (!services_keyauth_validate_key($api_key, $timestamp, $domain, $nonce, $method_name, $hash_parameters, $hash)) {
     if ($hash != services_get_hash($timestamp, $domain, $nonce, $method, $args)) {
-      return services_error(t('Invalid API key.'));
+      return services_error(t('Invalid API key.'), 401);
     }
     
     if (!db_result(db_query("SELECT COUNT(*) FROM {services_key_permissions} 
         WHERE kid = '%s' AND method = '%s'", $api_key, $method_name))) {
-      return services_error(t('Access denied.'));
+      return services_error(t('Access denied.'), 401);
     }
   }
 
diff --git services.module services.module
index 3750a55..f9ac4a4 100644
--- services.module
+++ services.module
@@ -128,7 +128,7 @@ function services_server($server_path = NULL) {
       exit;
     }
   }
-  // return 404 if the service doesn't exist
+  // return 404 if the server doesn't exist
   drupal_not_found();
 }
 
@@ -181,15 +181,15 @@ function services_get_server_info($server_info = NULL) {
 }
 
 /**
- * Prepare an error message for returning to the XMLRPC caller.
+ * Prepare an error message for returning to the server.
  */
-function services_error($message) {
+function services_error($message, $code=0, $exception=NULL) {
   $server_info = services_get_server_info();
 
   // Look for custom error handling function.
   // Should be defined in each server module.
   if ($server_info && module_hook($server_info->module, 'server_error')) {
-    return module_invoke($server_info->module, 'server_error', $message);
+    return module_invoke($server_info->module, 'server_error', $message, $code, $exception);
   }
 
   // No custom error handling function found.
@@ -276,11 +276,16 @@ function services_auth_invoke_custom($module, $method, &$arg1 = NULL, &$arg2 = N
  * This is the magic function through which all remote method calls must pass.
  */
 function services_method_call($method_name, $args = array(), $browsing = FALSE) {
-  $method = services_method_get($method_name);
+  if (is_array($method_name) && isset($method_name['#callback'])) {
+    $method = $method_name;
+  }
+  else {
+    $method = services_method_get($method_name);
+  }
 
   // Check that method exists.
   if (empty($method)) {
-    return services_error(t('Method %name does not exist.', array('%name' => $method_name)));
+    return services_error(t('Method %name does not exist', array('%name' => $method_name)), 406);
   }
 
   // Check for missing args
@@ -288,7 +293,7 @@ function services_method_call($method_name, $args = array(), $browsing = FALSE)
   foreach ($method['#args'] as $key => $arg) {
     if (!$arg['#optional']) {
       if (!isset($args[$key]) && !is_array($args[$key]) && !is_bool($args[$key])) {
-        return services_error(t('Missing required arguments.'));
+        return services_error(t('Missing required arguments.'), 406);
       }
     }
   }
@@ -298,7 +303,9 @@ function services_method_call($method_name, $args = array(), $browsing = FALSE)
     if ($browsing) {
       drupal_set_message(t('Authentication failed: !message', array('!message' => $auth_error)), 'error');
     }
-    return services_error($auth_error);
+    else {
+      return services_error($auth_error, 401);
+    }
   }
 
   // Load the proper file
@@ -309,6 +316,9 @@ function services_method_call($method_name, $args = array(), $browsing = FALSE)
   // Construct access arguments array
   if (isset($method['#access arguments'])) {
     $access_arguments = $method['#access arguments'];
+    if (isset($method['#access arguments append']) && $method['#access arguments append']) {
+      $access_arguments[] = $args;
+    }
   }
   else {
     // Just use the arguments array if no access arguments have been specified
@@ -317,7 +327,7 @@ function services_method_call($method_name, $args = array(), $browsing = FALSE)
 
   // Call default or custom access callback
   if (call_user_func_array($method['#access callback'], $access_arguments) != TRUE) {
-    return services_error(t('Access denied.'));
+    return services_error(t('Access denied'), 401);
   }
 
   // Change working directory to drupal root to call drupal function,
@@ -335,15 +345,155 @@ function services_method_call($method_name, $args = array(), $browsing = FALSE)
   return $result;
 }
 
-function services_get_all_resources() {
-  static $resource_cache;
-  if (!isset($resource_cache)) {
-    $resource_cache = module_invoke_all('service_resource');
-    foreach ($resource_cache as $name => &$res) {
-      $res['#name'] = $name;
+/**
+ * Registers a callback for formatting resource uri's.
+ * Use parameterless call to get the current formatter callback.
+ *
+ * @param mixed $callback
+ *  Optional. The callaback to register for uri formatting. No changes are made
+ *  if this parameter is omitted or NULL.
+ * @return mixed
+ *  Returns the registered callback for resource uri formatting
+ */
+function services_resource_uri_formatter($callback=NULL) {
+  static $formatter;
+
+  if ($callback!==NULL) {
+    $formatter = $callback;
+  }
+
+  return $formatter;
+}
+
+/**
+ * Formats a resource uri using the formatter registered through
+ * services_resource_uri_formatter().
+ *
+ * @param array $path
+ *  An array of strings containing the component parts of the path to the resource.
+ * @return string
+ *  Returns the formatted resource uri, or NULL if no formatter has been registered.
+ */
+function services_resource_uri($path) {
+  $formatter = services_resource_uri_formatter();
+  if ($formatter) {
+    return call_user_func($formatter, $path);
+  }
+  return NULL;
+}
+
+/**
+ * Gets all resource definitions.
+ *
+ * @return array
+ *  An array containing all resources.
+ */
+function services_get_all_resources($include_services=TRUE) {
+  $cache_key = 'services:resources' . ($include_services?'_with_services':'');
+
+  if (!$reset && ($cache = cache_get($cache_key)) && isset($cache->data)) {
+    return $cache->data;
+  }
+  else {
+    $resources = module_invoke_all('service_resource');
+    drupal_alter('service_resources', $resources);
+
+    $controllers = array();
+    services_process_resources($resources, $controllers);
+
+    foreach ($controllers as &$controller) {
+      if (!isset($controller['#access callback'])) {
+        $controller['#access callback'] = 'services_access_menu';
+      }
+
+      if (!isset($controller['#auth'])) {
+        $controller['#auth'] = TRUE;
+      }
+
+      if (!isset($controller['#key'])) {
+        $controller['#key'] = TRUE;
+      }
+    }
+
+    drupal_alter('service_resources_post_processing', $resources);
+    services_auth_invoke('alter_methods', $controllers);
+
+    if ($include_services) {
+      $services = services_get_all(FALSE);
+
+      // Include the file that has the necessary functions for translating
+      // methods to resources.
+      if (!empty($services)) {
+        module_load_include('inc', 'services', 'services.resource-translation');
+        $resources = array_merge(_services_services_as_resources($services), $resources);
+      }
+    }
+
+    cache_set($cache_key, $resources);
+    return $resources;
+  }
+}
+
+function services_process_resources(&$resources, &$controllers, $path=array()) {
+  foreach ($resources as $name => &$resource) {
+    if (drupal_substr($name, 0, 1) != '#') {
+      _services_process_resource(array_merge($path, array($name)), $resource, $controllers);
+    }
+  }
+}
+
+function _services_process_resource($name, &$resource, &$controllers) {
+  $path = join($name, '/');
+  $resource['#name'] = $path;
+
+  $keys = array('#retrieve','#create','#update','#delete');
+  foreach ($keys as $key) {
+    if (isset($resource[$key])) {
+      $controllers[$path . '/' . $key] = &$resource[$key];
+    }
+  }
+
+  if (isset($resource['#index'])) {
+    $controllers[$path . '/#index'] = &$resource['#index'];
+  }
+
+  if (isset($resource['#relationships'])) {
+    foreach ($resource['#relationships'] as $relname => $rel) {
+      // Run some inheritance logic
+      if (isset($resource['#retrieve'])) {
+        if (empty($rel['#args']) || $rel['#args'][0]['#name'] !== $resource['#retrieve']['#args'][0]['#name']) {
+          array_unshift($rel['#args'], $resource['#retrieve']['#args'][0]);
+        }
+        $resource['#relationships'][$relname] = array_merge($resource['#retrieve'], $rel);
+      }
+      $controllers[$path . '/relationship/' . $relname] = &$resource['#relationships'][$relname];
+    }
+  }
+
+  if (isset($resource['#actions'])) {
+    foreach ($resource['#actions'] as $actname => $act) {
+      // Run some inheritance logic
+      if (isset($resource['#update'])) {
+        $up = $resource['#update'];
+        unset($up['#args']);
+        $resource['#actions'][$actname] = array_merge($up, $act);
+      }
+      $controllers[$path . '/action/' . $actname] = &$resource['#actions'][$actname];
+    }
+  }
+
+  if (isset($resource['#targeted actions'])) {
+    foreach ($resource['#targeted actions'] as $actname => $act) {
+      // Run some inheritance logic
+      if (isset($resource['#update'])) {
+        if (empty($act['#args']) || $act['#args'][0]['#name'] !== $resource['#update']['#args'][0]['#name']) {
+          array_unshift($act['#args'], $resource['#update']['#args'][0]);
+        }
+        $resource['#targeted actions'][$actname] = array_merge($resource['#update'], $act);
+      }
+      $controllers[$path . '/targeted_action/' . $actname] = &$resource['#actions'][$actname];
     }
   }
-  return $resource_cache;
 }
 
 function services_delegate_access($perm) {
@@ -353,11 +503,15 @@ function services_delegate_access($perm) {
 /**
  * Gets all service definitions
  *
+ * @param bool $include_resources
+ *   Optional. When TRUE resource-based service definitions will be translated to
+ *   the appropriat method callas and included in the service listing.
+ *   Defaults to TRUE.
  * @return array
  *   An array containing all services and thir methods
  */
 function services_get_all($include_resources = TRUE) {
-  $cache_key = 'services:methods';
+  $cache_key = 'services:methods' . ($include_resources?'_with_resources':'');
 
   if (($cache = cache_get($cache_key)) && isset($cache->data)) {
     return $cache->data;
@@ -397,6 +551,24 @@ function services_get_all($include_resources = TRUE) {
     // Allow auth module to alter the methods
     services_auth_invoke('alter_methods', $methods);
 
+    // Add resources if wanted
+    if ($include_resources) {
+      $resources = services_get_all_resources(FALSE);
+
+      // Include the file that has the necessary functions for translating
+      // resources to method calls.
+      if (!empty($resources)) {
+        module_load_include('inc', 'services', 'services.resource-translation');
+
+        // Translate all resources
+        foreach ($resources as $name => $def) {
+          foreach(_services_resource_as_services($def) as $method) {
+            $methods[] = $method;
+          }
+        }
+      }
+    }
+
     cache_set($cache_key, $methods);
     return $methods;
   }
diff --git services.resource-translation.inc services.resource-translation.inc
new file mode 100644
index 0000000..03ba87e
--- /dev/null
+++ services.resource-translation.inc
@@ -0,0 +1,73 @@
+<?php
+// $Id$
+
+function _services_resource_as_services($resource) {
+  static $controllers = array(
+    '#create'=>'create',
+    '#delete'=>'delete',
+    '#retrieve'=>'retrieve',
+    '#update'=>'update',
+    '#index'=>'index',
+  ), $subcontrollers = array(
+    '#relationships' => 'related',
+    '#targeted actions' => 'targeted_action',
+  );
+
+  $methods = array();
+  $file = isset($resource['#file']) ? $resource['#file'] : array();
+
+  foreach ($controllers as $attr => $name) {
+    if (isset($resource[$attr])) {
+      $methods[] = _services_resource_controller_as_service($resource['#name'], $name, $resource[$attr], $file);
+    }
+  }
+
+  foreach ($subcontrollers as $attr => $name) {
+    if (isset($resource[$attr])) {
+      foreach ($resource[$attr] as $sc_name => $controller) {
+        $methods[] = _services_resource_controller_as_service($resource['#name'], $name . '_' . $sc_name, $controller, $file);
+      }
+    }
+  }
+
+  if (isset($resource['#actions'])) {
+    foreach ($resource['#actions'] as $sc_name => $controller) {
+      $methods[] = _services_resource_controller_as_service($resource['#name'], 'action_' . $sc_name, $controller, $file);
+    }
+  }
+
+  return $methods;
+}
+
+function _services_resource_controller_as_service($resource, $name, $controller, $file) {
+  $method = array_merge($controller, array(
+    '#method' => $resource . '_resource.' . $name,
+  ));
+
+  if (!empty($file) && !empty($method['#file'])) {
+    $method['#file'] = $file;
+  }
+
+  return $method;
+}
+
+function _services_services_as_resources($services) {
+  $resources = array();
+
+  foreach ($services as $service) {
+    $signature = preg_split('/\./', $service['#method']);
+
+    $controller = $service;
+    $controller['#args'] = array();
+
+    foreach($service['#args'] as $arg) {
+      $arg['#source'] = array(
+        'data' => $arg['#name'],
+      );
+      $controller['#args'][] = $arg;
+    }
+
+    $resources['service_' . $signature[0]]['#actions'][$signature[1]] = $controller;
+  }
+  return $resources;
+}
\ No newline at end of file
diff --git services/node_service/node_resource.inc services/node_service/node_resource.inc
new file mode 100644
index 0000000..bc7ed12
--- /dev/null
+++ services/node_service/node_resource.inc
@@ -0,0 +1,104 @@
+<?php
+// $Id$
+
+function _node_resource_retrieve($nid) {
+  $node = node_load($nid);
+  $node->uri = services_resource_uri(array('node', $node->nid));
+  return $node;
+}
+
+function _node_resource_create($node) {
+  $node = (object)$node;
+
+  if (!isset($node->type)) {
+    return services_error('Missing node type', 406);
+  }
+
+  // Load the required includes for drupal_execute
+  module_load_include('inc', 'node', 'node.pages');
+  $nid = NULL;
+
+  // Setup form_state
+  $values = (array)$node;
+  $form_state = array();
+  $form_state['values'] = $values;
+  $form_state['values']['op'] = t('Save');
+  $ret = drupal_execute($node->type . '_node_form', $form_state, $node);
+
+  // Fetch $nid out of $form_state
+  $nid = $form_state['nid'];
+
+  if ($errors = form_get_errors()) {
+    return services_error(implode("\n", $errors), 406);
+  }
+
+  return (object)array(
+    'nid' => $nid,
+    'uri' => services_resource_uri(array('node', $nid)),
+  );
+}
+
+function _node_resource_update($nid, $node) {
+  $node = (object)$node;
+  $node->nid = $nid;
+
+  $old_node = node_load($node->nid);
+  if ($old_node->nid) {
+    // Load the required includes for drupal_execute
+    module_load_include('inc', 'node', 'node.pages');
+
+    // Setup form_state.
+    $values = (array)$node;
+    $form_state = array();
+    $form_state['values'] = $values;
+    $form_state['values']['op'] = t('Save');
+    $form_state['node'] = (array)$old_node;
+
+    drupal_execute($old_node->type . '_node_form', $form_state, $old_node);
+
+    if ($errors = form_get_errors()) {
+      return services_error(implode("\n", $errors), 406);
+    }
+  }
+  else {
+    return services_error(t('Node not found'), 404);
+  }
+
+  return $node->nid;
+}
+
+function _node_resource_delete($nid) {
+  node_delete($nid);
+  return TRUE;
+}
+
+function _node_resource_index($page=0, $fields=array(), $parameters=array()) {
+  if (module_exists('query_builder')) {
+    $builder = new QueryBuilder();
+    $parameters = (array)$parameters;
+
+    if (isset($parameters['__describe'])) {
+      return $builder->describe();
+    }
+
+    if (is_string($fields) && !empty($fields)) {
+      $fields = preg_split('/,\s?/', $fields);
+    }
+
+    if (!user_access('administer nodes') || !isset($parameters['status'])) {
+      $parameters['status'] = 1;
+    }
+    list($sql, $params) = $builder->query($fields, $parameters);
+  }
+  else {
+    $sql = "SELECT * FROM {node} WHERE status=1 ORDER BY sticky DESC, created DESC";
+  }
+  $res = db_query_range($sql, $params, $page*20, 20);
+
+  $events = array();
+  while ($event = db_fetch_object($res)) {
+    $event->uri = services_resource_uri(array('node', $event->nid));
+    $events[] = $event;
+  }
+  return $events;
+}
\ No newline at end of file
diff --git services/node_service/node_resource.info services/node_service/node_resource.info
new file mode 100644
index 0000000..6eefd0d
--- /dev/null
+++ services/node_service/node_resource.info
@@ -0,0 +1,6 @@
+; $Id$
+name = Node Resource
+description = Provides a resource oriented service interface to nodes.
+package = Services - services
+core = 6.x
+php = 5.x
\ No newline at end of file
diff --git services/node_service/node_resource.models.inc services/node_service/node_resource.models.inc
new file mode 100644
index 0000000..f3c13d9
--- /dev/null
+++ services/node_service/node_resource.models.inc
@@ -0,0 +1,114 @@
+<?php
+// $Id$
+
+class NodeResourceFeedModel implements ResourceTimeFeedModel {
+  protected $nodes = NULL;
+
+  public function __construct($data) {
+    $this->nodes = $data;
+  }
+
+  public function current() {
+    $node = current($this->nodes);
+    if ($node!==FALSE) {
+      return new NodeResourceFeedModelItem($node);
+    }
+    return FALSE;
+  }
+
+  public function key() {
+    return key($this->nodes);
+  }
+
+  public function next() {
+    next($this->nodes);
+  }
+
+  public function rewind() {
+    reset($this->nodes);
+  }
+
+  public function valid() {
+    // It's safe to use current as there never should be a boolean
+    // in the node array.
+    return current($this->nodes)!==FALSE;
+  }
+}
+
+class NodeResourceFeedModelItem implements ResourceTimeFeedModelItem {
+  protected $node = NULL;
+
+  public function __construct($data) {
+    $this->node = $data;
+  }
+
+  /**
+   * Returns the raw node title
+   *
+   * @return string
+   *  The title of the node
+   */
+  public function getName() {
+    return $this->node->title;
+  }
+
+  /**
+   * Calls node_build_content to create a teaser
+   */
+  public function getDescription() {
+    if (!isset($this->node->content)) {
+      $this->node = node_build_content($this->node, TRUE, FALSE);
+    }
+    return $this->node->teaser;
+  }
+
+  /**
+   * Returns the absolute url to the node
+   *
+   * @return string
+   *  The node url
+   */
+  public function getUrl() {
+    return url('node/' . $this->node->nid, array('absolute' => TRUE));
+  }
+
+  /**
+   * Gets the created time for the node
+   *
+   * @return int
+   *  The created time of the node as a timestamp
+   */
+  public function getCreated() {
+    return $this->node->created;
+  }
+
+  /**
+   * Gets the created time for the node
+   *
+   * @return int
+   *  The created time of the node as a timestamp
+   */
+  public function getStarts() {
+    return $this->node->created;
+  }
+
+  /**
+   * Gets the created time for the node
+   *
+   * @return int
+   *  The created time of the node as a timestamp
+   */
+  public function getEnds() {
+    return $this->node->created;
+  }
+
+  /**
+   * Gets a associative array containing extra properties for the item.
+   *
+   * @return array
+   *  The extra properties of the item as an array
+   */
+  public function getProperties() {
+    return get_object_vars($this->node);
+  }
+}
\ No newline at end of file
diff --git services/node_service/node_resource.module services/node_service/node_resource.module
new file mode 100644
index 0000000..35d0ebf
--- /dev/null
+++ services/node_service/node_resource.module
@@ -0,0 +1,132 @@
+<?php
+// $Id$
+
+function node_resource_autoload_info() {
+  return array(
+    'NodeResourceFeedModel' => array(
+      'file' => 'node_resource.models.inc',
+    ),
+    'NodeResourceViewFeedModel' => array(
+      'file' => 'node_resource.models.inc',
+    ),
+  );
+}
+
+function node_resource_service_resource() {
+  return array(
+    'node' => array(
+      '#file' => array('file' => 'inc', 'module' => 'node_resource'),
+      '#retrieve' => array(
+        '#callback' => '_node_resource_retrieve',
+        '#args' => array(
+          array(
+            '#name' => 'nid',
+            '#optional' => FALSE,
+            '#source' => array('path' => 0),
+            '#type' => 'int',
+            '#description' => 'The nid of the node to get',
+          ),
+        ),
+        '#models' => array(
+          'ResourceFeedModel' => array(
+            'class' => 'NodeResourceFeedModel',
+            'arguments' => array('source'=>'single'),
+          ),
+        ),
+        '#access callback' => '_node_resource_access',
+        '#access arguments' => array('view'),
+        '#access arguments append' => TRUE,
+      ),
+      '#create' => array(
+        '#callback' => '_node_resource_create',
+        '#args' => array(
+          array(
+            '#name' => 'node',
+            '#optional' => FALSE,
+            '#source' => 'data',
+            '#description' => 'The node object to create',
+            '#type' => 'struct',
+          ),
+        ),
+        '#access callback' => '_node_resource_access',
+        '#access arguments' => array('create'),
+        '#access arguments append' => TRUE,
+      ),
+      '#update' => array(
+        '#callback' => '_node_resource_update',
+        '#args' => array(
+          array(
+            '#name' => 'node',
+            '#optional' => FALSE,
+            '#source' => 'data',
+            '#description' => 'The node data to update',
+            '#type' => 'struct',
+          ),
+        ),
+        '#access callback' => '_node_resource_access',
+        '#access arguments' => array('update'),
+        '#access arguments append' => TRUE,
+      ),
+      '#delete' => array(
+        '#callback' => '_node_resource_delete',
+        '#args' => array(
+          array(
+            '#name' => 'nid',
+            '#optional' => FALSE,
+            '#source' => array('path' => 0),
+          ),
+        ),
+        '#access callback' => '_node_resource_access',
+        '#access arguments' => array('delete'),
+        '#access arguments append' => TRUE,
+      ),
+      '#index' => array(
+        '#callback' => '_node_resource_index',
+        '#args' => array(
+          array(
+            '#name' => 'page',
+            '#optional' => TRUE,
+            '#type' => 'int',
+            '#description' => 'The zero-based index of the page to get, defaults to 0.',
+            '#default value' => 0,
+            '#source' => array('param' => 'page'),
+          ),
+          array(
+            '#name' => 'fields',
+            '#optional' => TRUE,
+            '#type' => 'string',
+            '#description' => 'The fields to get.',
+            '#default value' => '',
+            '#source' => array('param' => 'fields'),
+          ),
+          array(
+            '#name' => 'parameters',
+            '#optional' => TRUE,
+            '#type' => 'struct',
+            '#description' => 'Parameters',
+            '#default value' => NULL,
+            '#source' => 'param',
+          ),
+        ),
+        '#models' => array(
+          'ResourceFeedModel' => array(
+            'class' => 'NodeResourceFeedModel',
+          ),
+          'ResourceTimeFeedModel' => array(
+            'class' => 'NodeResourceFeedModel',
+          ),
+        ),
+        '#access arguments' => array('access content'),
+        '#access arguments append' => TRUE,
+      ),
+    ),
+  );
+}
+
+function _node_resource_access($op='view', $args=array()) {
+  if ($op!='create' && !empty($args)) {
+    $node = node_load($args[0]);
+  }
+  return node_access($op, $node);
+}
+
diff --git services/node_service/node_service.inc services/node_service/node_service.inc
index 4eddeae..7c3a39a 100644
--- services/node_service/node_service.inc
+++ services/node_service/node_service.inc
@@ -19,7 +19,7 @@
  */
 function node_service_get($nid, $fields = array()) {
   if (!$node = services_node_load(node_load(array('nid' => $nid)), $fields)) {
-    return services_error(t('Could not find the node.'));
+    return services_error(t('Could not find the node.'), 401);
   }
 
   return $node;
@@ -59,7 +59,7 @@ function node_service_view($nid, $fields = array(), $teaser = FALSE, $page = FAL
   $node = services_node_load(node_build_content(node_load($nid), $teaser, $page), $fields);
   
   if (!$node) {
-    return services_error(t("Could not find the node."));
+    return services_error(t("Could not find the node."), 404);
   }
   
   return $node;
@@ -118,7 +118,7 @@ function node_service_save($edit) {
       $nid = $node->nid;
     }
     else {
-      return services_error(t('Node not found'));
+      return services_error(t('Node not found'), 401);
     }
   }
   else {
@@ -133,7 +133,7 @@ function node_service_save($edit) {
     $nid = $form_state['nid'];
   }
   if ($errors = form_get_errors()) {
-    return services_error(implode("\n", $errors));
+    return services_error(implode("\n", $errors), 401);
   }
   return $nid;
 }
diff --git services/search_service/search_service.inc services/search_service/search_service.inc
index 23c6ef4..7aa501d 100644
--- services/search_service/search_service.inc
+++ services/search_service/search_service.inc
@@ -39,7 +39,7 @@ function search_service_nodes($keys, $simple = FALSE, $fields = array()) {
     }
     return $results;
   }
-  return services_error(t('Search returned no results.'));
+  return services_error(t('Search returned no results.'), 404);
 }
 
 /**
@@ -82,7 +82,7 @@ function search_service_content($keys, $simple = FALSE) {
     }
     return $results;
   }
-  return services_error(t('Search returned no results.'));
+  return services_error(t('Search returned no results.'), 401);
 }
 
 /**
@@ -94,5 +94,5 @@ function search_service_users($keys) {
   if ($results && is_array($results) && count($results)) {
     return $results;
   }
-  return services_error(t('Search returned no results.'));
+  return services_error(t('Search returned no results.'), 401);
 }
diff --git services/user_service/user_service.inc services/user_service/user_service.inc
index 525b33a..2f95999 100644
--- services/user_service/user_service.inc
+++ services/user_service/user_service.inc
@@ -15,7 +15,7 @@
 function user_service_delete($uid) {
   $account = user_load($uid);
   if (empty($account)) {
-    return services_error(t('There is no user with such ID.'));
+    return services_error(t('There is no user with such ID.'), 404);
   }
   user_delete($account, $uid);
 
@@ -44,7 +44,7 @@ function user_service_delete_access($uid) {
 function user_service_get($uid) {
   $account = user_load($uid);
   if (empty($account)) {
-    return services_error(t('There is no user with such ID.'));
+    return services_error(t('There is no user with such ID.'), 404);
   }
 
   // Everything went right.
@@ -75,7 +75,7 @@ function user_service_login($username, $password) {
 
   if ($user->uid) {
     // user is already logged in
-    return services_error(t('Already logged in as !user.', array('!user' => $user->name)));
+    return services_error(t('Already logged in as !user.', array('!user' => $user->name)), 406);
   }
 
   $user = user_authenticate(array('name' => $username, 'pass' => $password));
@@ -92,7 +92,7 @@ function user_service_login($username, $password) {
     return $return;
   }
   session_destroy();
-  return services_error(t('Wrong username or password.'));
+  return services_error(t('Wrong username or password.'), 401);
 }
 
 /**
@@ -103,7 +103,7 @@ function user_service_logout() {
 
   if (!$user->uid) {
     // User is not logged in
-    return services_error(t('User is not logged in.'));
+    return services_error(t('User is not logged in.'), 406);
   }
 
   watchdog('user', 'Session closed for %name.', array('%name' => theme('placeholder', $user->name)));
@@ -129,7 +129,7 @@ function user_service_save($account) {
   $update = user_load($account['uid']);	
   $account = isset($update->uid) ? user_save($update,$account) : user_save('', $account);  
   if (!$account) {
-    return services_error(t('Error on saving the user.'));
+    return services_error(t('Error on saving the user.'), 500);
   }
 
   // Everything went right.
diff --git services/views_service/views_service.inc services/views_service/views_service.inc
index afb2fea..c623b74 100644
--- services/views_service/views_service.inc
+++ services/views_service/views_service.inc
@@ -78,7 +78,7 @@ function views_service_get_access($view_name) {
 function views_service_export($view_name) {
   $view = views_get_view($view_name);
   if (empty($view)) {
-    return services_error('View does not exist.');
+    return services_error('View does not exist.', 404);
   }
 
   return $view->export();
@@ -113,7 +113,7 @@ function views_service_import($view_import, $view_name = '') {
 
   // Check if there is a any error
   if ($errors = form_set_error()) {
-    return services_error($errors);
+    return services_error($errors, 406);
   }
 
   // At this point, the new view was only cached and now its time
diff --git services_admin_browse.inc services_admin_browse.inc
index b1bea9d..a310614 100644
--- services_admin_browse.inc
+++ services_admin_browse.inc
@@ -329,8 +329,8 @@ function services_admin_settings_submit($form, $form_state) {
   // Allow the authorization module to handle submitted values.
   services_auth_invoke('security_settings_submit', $form_state);
 
-  // Clear the services cache so that methods are updated according to auth settings
-  cache_clear_all('services:methods', 'cache');
+  // Clear the services cache so that methods and resources are updated according to auth settings
+  cache_clear_all('services:', 'cache', TRUE);
 }
 
 /**
