diff --git services.module services.module
index ceb218f..d5a2ee3 100644
--- services.module
+++ services.module
@@ -360,6 +360,13 @@ function services_method_call($method_name, $args = array()) {
     services_session_restart($sessid);
   }
   
+  // Check access
+  $access_arguments = isset($method['#access arguments']) ? $method['#access arguments'] : $args;
+  // Call default or custom access callback
+  if (call_user_func_array($method['#access callback'], $access_arguments) != true) {
+    return services_error(t('Access denied.'));
+  }
+  
   // Change working directory to drupal root to call drupal function,
   // then change it back to server module root to handle return.
   $server_root = getcwd();
@@ -418,6 +425,13 @@ function services_get_all() {
       if (!isset($methods[$key]['#auth'])) {
         $methods[$key]['#auth'] = true;
       }
+      
+      if (!isset($methods[$key]['#access callback'])) {
+        $methods[$key]['#access callback'] = 'user_access';
+        if (!isset($methods[$key]['#access arguments'])) {
+          $methods[$key]['#access arguments'] = array('access services');
+        }
+      }
 
       if (!isset($methods[$key]['#args'])) {
         $methods[$key]['#args'] = array();
diff --git services/node_service/node_service.module services/node_service/node_service.module
index c01d5a8..3771008 100644
--- services/node_service/node_service.module
+++ services/node_service/node_service.module
@@ -13,6 +13,10 @@ function node_service_help($section) {
   }
 }
 
+function node_service_perm() {
+  return array('load raw node data');
+}
+
 /**
  * Implementation of hook_service()
  */
@@ -23,6 +27,7 @@ function node_service_service() {
     array(
       '#method'   => 'node.load',
       '#callback' => 'node_service_load',
+      '#access callback' => 'node_service_load_access',
       '#args'     => array(
         array(
           '#name'         => 'nid',
@@ -40,6 +45,7 @@ function node_service_service() {
     array(
       '#method'   => 'node.save',
       '#callback' => 'node_service_save',
+      '#access callback' => 'node_service_save_access',
       '#args'     => array(
         array(
           '#name'         => 'node',
@@ -52,6 +58,7 @@ function node_service_service() {
     array(
       '#method'   => 'node.delete',
       '#callback' => 'node_delete',
+      '#access callback' => 'node_service_delete_access',
       '#args'     => array(
         array(
           '#name'         => 'nid',
@@ -74,6 +81,11 @@ function node_service_load($nid, $fields = array()) {
   return $node;
 }
 
+function node_service_load_access($nid) {
+  $node = node_load($nid);
+  return node_access('view', $node) && user_access('load raw node data');
+}
+
 function node_service_save($edit) {
   
   // validate node  
@@ -86,4 +98,16 @@ function node_service_save($edit) {
   node_save($node);
   watchdog('content', t('@type: updated %title.', array('@type' => t($node->type), '%title' => $node->title)), WATCHDOG_NOTICE, l(t('view'), 'node/'. $node->nid));
   return $node;
+}
+
+function node_service_save_access($node) {
+  if (isset($node['nid'])) {
+    return node_access('update', $node);
+  }
+  return node_access('create', $node['type']);
+}
+
+function node_service_delete_access($nid) {
+  $node = node_load($nid);
+  return node_access('delete', $node);
 }
\ No newline at end of file
diff --git services/system_service/system_service.module services/system_service/system_service.module
index 221c276..e7e7471 100644
--- services/system_service/system_service.module
+++ services/system_service/system_service.module
@@ -13,6 +13,10 @@ function system_service_help($section) {
   }
 }
 
+function system_service_perm() {
+  return array('send mail from remote', 'get variable from remote', 'set variable from remote', 'check module exists from remote');
+}
+
 /**
  * Implementation of hook_service()
  */
@@ -31,6 +35,7 @@ function system_service_service() {
     array(
       '#method'   => 'system.mail',
       '#callback' => 'system_service_mail',
+      '#access arguments' => array('send mail from remote'),
       '#args'     => array(
         array(
           '#name'         => 'mailkey',
@@ -72,6 +77,7 @@ function system_service_service() {
     array(
       '#method'   => 'system.getVariable',
       '#callback' => 'system_service_getvariable',
+      '#access arguments' => array('get variable from remote'),
       '#args'     => array(
         array(
           '#name'         => 'name',
@@ -89,6 +95,7 @@ function system_service_service() {
     array(
       '#method'   => 'system.setVariable',
       '#callback' => 'system_service_setvariable',
+      '#access arguments' => array('set variable from remote'),
       '#args'     => array(
         array(
           '#name'         => 'name',
@@ -107,6 +114,7 @@ function system_service_service() {
     array(
       '#method'   => 'system.moduleExists',
       '#callback' => 'system_service_module_exists',
+      '#access arguments' => array('check module exists from remote'),
       '#args'     => array(
         array(
           '#name'         => 'module',
diff --git services/views_service/views_service.module services/views_service/views_service.module
index aa8c6cd..9d86787 100644
--- services/views_service/views_service.module
+++ services/views_service/views_service.module
@@ -22,7 +22,6 @@ function views_service_service() {
     array(
       '#method'   => 'views.getView',
       '#callback' => 'views_service_get_view',
-      '#args'     => array('string', 'array', 'array'),
       '#args'     => array(
         array(
           '#name'         => 'view_name',
@@ -45,6 +44,7 @@ function views_service_service() {
     array(
       '#method'   => 'views.exportView',
       '#callback' => 'views_service_export_view',
+      '#access arguments' => array('administer views'),
       '#args'     => array('string'),
       '#args'     => array(
         array(
@@ -62,6 +62,7 @@ function views_service_service() {
     array(
       '#method'   => 'views.importView',
       '#callback' => 'views_service_import_view',
+      '#access arguments' => array('administer views'),
       '#args'     => array('string'),
       '#args'     => array(
         array(
@@ -85,6 +86,11 @@ function views_service_get_view($view_name, $fields = array(), $args = array())
     return services_error('View does not exist.');
   }
   
+  // Check access
+  if (!views_access($view)) {
+    return services_error('You do not have access to this view.');
+  }
+  
   $result = views_build_view('result', $view, $args);
   while ($node = db_fetch_object($result['result'])) {
     $nodes[] = services_node_load(node_load(array('nid' => $node->nid)), $fields);
