diff --git resources/comment_resource.inc resources/comment_resource.inc
index 586a38d..cc3f7d5 100644
--- resources/comment_resource.inc
+++ resources/comment_resource.inc
@@ -107,6 +107,7 @@ function _comment_resource_definition() {
               'description'  => t('Number of comments to load.'),
               'source'       => 'data',
               'optional'     => TRUE,
+              'default value'=> 10,
             ),
             array(
               'name'         => 'start',
@@ -114,6 +115,7 @@ function _comment_resource_definition() {
               'description'  => t('If count is set to non-zero value, you can pass also non-zero value for start. For example to get comments from 5 to 15, pass count=10 and start=5.'),
               'source'       => 'data',
               'optional'     => TRUE,
+              'default value'=> 0,
             ),
           ),
         ),
@@ -150,12 +152,13 @@ function _comment_resource_definition() {
               'optional'      => FALSE,
             ),
             array(
-              'name'         => 'since',
-              'type'         => 'int',
-              'optional'     => TRUE,
-              'description'  => t('Timestamp to count from (defaults to time of last user acces to node).'),
+              'name'          => 'since',
+              'type'          => 'int',
+              'optional'      => TRUE,
+              'description'   => t('Timestamp to count from (defaults to time of last user acces to node).'),
               'source'        => 'data',
               'optional'      => TRUE,
+              'default value' => 0,
             ),
           ),
         ),
@@ -174,35 +177,24 @@ function _comment_resource_definition() {
  */
 
 function _comment_resource_create($comment) {
-  if (!is_object($comment)) {
-    $comment = (object) $comment;
-  }
-
-  // If the submitted comment does not contain a uid, set it to anonymous.
-  if (!isset($comment->uid)) {
-    $comment->uid = 0;
-  }
+  $comment = (object)$comment;
 
-  // If the submitted comment does not contain a nid, then return an error.
-  if (!isset($comment->nid)) {
-    return services_error(t("No node specified."));
-  }
+  $form_state['values'] = (array)$comment;
+  $form_state['values']['op'] = t('Save');
 
-  // If a cid is present then the user is trying to edit an existing comment.
-  if (isset($comment->cid) && ($comment->cid != 0)) {
-    $initial_comment = _comment_load($comment->cid);
-    $admin = user_access("administer comments");
+  $comment_empty = (object)array(
+    'nid' => $comment->nid,
+    'cid' => NULL,
+  );
 
-    if ($initial_comment->uid == 0 && !$admin) {
-      return services_error(t("Anonymous comments can't be edited"));
-    }
+  $ret = drupal_form_submit('comment_form', $form_state, $comment_empty);
 
-    if (($initial_comment->uid != $comment->uid || comment_num_replies($comment->cid) != 0) && !$admin) {
-      return services_error(t("User does not have permission to edit this comment"));
-    }
+  // Error if needed.
+  if ($errors = form_get_errors()) {
+    return services_error(implode(" ", $errors), 406);
   }
 
-  comment_save($comment);
+  $comment = $form_state['comment'];
 
   return (object)array(
     'cid' => $comment->cid,
@@ -233,24 +225,25 @@ function _comment_resource_retrieve($cid) {
  *   Unique identifier for the comment (cid) or FALSE if there was a problem.
  */
 function _comment_resource_update($cid, $comment) {
+  $comment = (object)$comment;
+  
   $comment->cid = $cid;
 
-  $old_comment = (array) _comment_load($comment->cid);
-  if ($old_comment['cid']) {
-    // Setup form_state.
-    $form_state = array();
-    $form_state['values'] = (array) $comment;
-    $form_state['values']['op'] = t('Save');
-    $form_state['comment'] = $old_comment;
+  $old_comment = comment_load($comment->cid);
+  if (empty($old_comment)) {
+    return services_error(t('Comment not found'), 404);
+  }
+  
+  // Setup form_state.
+  $form_state = array();
+  $form_state['values'] = (array) $comment;
+  $form_state['values']['op'] = t('Save');
+  $form_state['comment'] = $old_comment;
 
-    drupal_execute('comment_form', $form_state, $old_comment);
+  drupal_form_submit('comment_form', $form_state, $old_comment);
 
-    if ($errors = form_get_errors()) {
-      return services_error(implode("\n", $errors), 406);
-    }
-  }
-  else {
-    return services_error(t('Comment not found'), 404);
+  if ($errors = form_get_errors()) {
+    return services_error(implode("\n", $errors), 406);
   }
 
   return $comment->cid;
@@ -269,12 +262,13 @@ function _comment_resource_delete($cid) {
   module_load_include('inc', 'comment', 'comment.admin');
 
   // The following is from comment_confirm_delete_submit in comment.admin.inc
-  $comment = _comment_load($cid);
+  $comment = comment_load($cid);
+  if (empty($comment)) {
+    return services_error(t('There is no comment found with id !cid', array('!cid' => $cid)));
+  }
 
   // Delete comment and its replies.
-  _comment_delete_thread($comment);
-
-  _comment_update_node_statistics($comment->nid);
+  comment_delete($cid);
 
   // Clear the cache so an anonymous user sees that his comment was deleted.
   cache_clear_all();
@@ -294,11 +288,11 @@ function _comment_resource_delete($cid) {
  * @return
  *   An array of comment objects.
  */
-function _comment_resource_load_node_comments($nid, $count = 0, $start = 0) {
+function _comment_resource_load_node_comments($nid, $count, $start) {
   $comments = array();
-  $result = db_query_range('SELECT c.cid FROM {comment} c WHERE c.nid = :nid', 0, 10, array(':nid' => $nid));
+  $result = db_query_range('SELECT c.cid FROM {comment} c WHERE c.nid = :nid', $start, $count, array(':nid' => $nid));
   foreach ($result as $record) {
-        $comments[] = comment_load($record->cid);
+    $comments[] = comment_load($record->cid);
   }
   return $comments;
 }
@@ -326,7 +320,7 @@ function _comment_resource_count_all($nid) {
  * @return
  *   Number of comments that node has.
  */
-function _comment_resource_count_new($nid, $since = 0) {
+function _comment_resource_count_new($nid, $since) {
   return comment_num_new($nid, $since);
 }
 
@@ -338,28 +332,33 @@ function _comment_resource_access($op = 'view', $args = array()) {
     return TRUE;
   }
 
-  if ($op=='create') {
+  if ($op == 'create') {
     $comment = (object)$args[0];
   }
   else {
     $comment = comment_load($args[0]);
   }
 
+  // If the submitted comment does not contain a nid, then return an error.
+  if (!isset($comment->nid)) {
+    return services_error(t("No node specified."));
+  }
+
+  $node = node_load($comment->nid);
+
   switch ($op) {
     case 'view':
-      // Check if the user has access to comments and that the node has comments enabled
-      return $comment->status && user_access('access comments') && _comment_resource_node_access($comment->nid);
-    case 'edit':
-      // Check if the user may edit the comment, and has access to the input format
-      return comment_access('edit', $comment) && filter_access($comment->format);
+      // Check if the user has access to comments
+      // and that the node has comments enabled.
+      return $comment->status && user_access('access comments')
+          && node_access('view', $node);
     case 'create':
-      // Check if the user may post comments, and has access to the used format and
-      // check if the node has comments enabled, and that the user has access to the node
-      return user_access('post comments') && filter_access($comment->format) &&
-        _comment_resource_node_access($comment->nid, COMMENT_NODE_READ_WRITE);
     case 'delete':
-      // Check if the user may edit the comment
-      return comment_access('edit', $comment);
+    case 'edit':
+      // Check if the user may post comments, node has comments enabled
+      // and that the user has access to the node.
+      return user_access('post comments') &&  node_access('view', $node)
+          && ($node->comment == COMMENT_NODE_OPEN);
   }
 }
 
diff --git services.info services.info
index 4b79c43..a03b9e9 100644
--- services.info
+++ services.info
@@ -15,6 +15,7 @@ files[] = serviers.services.api.php
 files[] = tests/functional/NoAuthEndpointTestRunner.test
 files[] = tests/functional/ServicesResourceNodeTests.test
 files[] = tests/functional/ServicesResourceSystemTests.test
+files[] = tests/functional/ServicesResourceCommentTests.test
 files[] = tests/functional/ServicesEndpointTests.test
 files[] = tests/unit/TestServicesModule.test
 files[] = tests/services.test
diff --git tests/functional/ServicesResourceCommentTests.test tests/functional/ServicesResourceCommentTests.test
index bd9a2ca..ac8197e 100644
--- tests/functional/ServicesResourceCommentTests.test
+++ tests/functional/ServicesResourceCommentTests.test
@@ -12,7 +12,7 @@
  */
 class ServicesResourceCommentTests extends ServicesWebTestCase {
   // Class variables
-  protected $privilegedUser = NULL ;
+  protected $privileged_user = NULL ;
   // Endpoint details.
   protected $endpoint = NULL;
 
@@ -27,6 +27,10 @@ class ServicesResourceCommentTests extends ServicesWebTestCase {
     );
     // Set up endpoint.
     $this->endpoint =  $this->saveNewEndpoint();
+
+    // Create and log in our privileged user.
+    $this->privileged_user = $this->drupalCreateUser();
+    $this->drupalLogin($this->privileged_user);
   }
 
   /**
@@ -35,52 +39,236 @@ class ServicesResourceCommentTests extends ServicesWebTestCase {
   public static function getInfo() {
    return array(
      'name'        => t('Resource Comment'),
-     'description' => t('test the resource comment methods and actions.'),
+     'description' => t('Test the resource Comment methods and actions.'),
      'group'       => t('Services'),
    );
   }
+  
+  /**
+   * Test create comment.
+   */
+  public function testCommentCreate() {
+    $node = $this->drupalCreateNode();
+
+    // Create comment.
+    $comment = $this->getCommentValues($node->nid);
+
+    $response_array = $this->servicesPost($this->endpoint->path . '/comment', array('comment' => $comment));
+    $commentResourceCreateReturn = $response_array['body'];
+    $this->assertTrue(isset($commentResourceCreateReturn->cid), t('Comment was successfully created'), 'CommentResource: Create');
+
+    // Assert subject and body of comment are the same as we created.
+    $newComment = comment_load($commentResourceCreateReturn->cid);
+    $this->assertTrue($newComment->subject == $comment['subject'], t('Subject was the same'), 'CommentResource: Create');
+    $this->assertTrue($newComment->comment_body[LANGUAGE_NONE][0]['value'] == $comment['comment_body'][LANGUAGE_NONE][0]['value'], t('Body was the same'), 'CommentResource: Create');
+
+    // Try to create comment with full_html filter that is disabled by default.
+    $comment = array(
+      'subject' => $this->randomString(),
+      'comment_body' => array(
+        LANGUAGE_NONE => array(
+          array(
+            'value' => $this->randomString(),
+            'format' => 'full_html',
+          )
+        )
+      ),
+      'name' => $this->privileged_user->name,
+      'language' => LANGUAGE_NONE,
+      'nid' => $node->nid,
+      'uid' => $this->privileged_user->uid,
+      'cid' => NULL,
+      'pid' => 0,
+    );
+    $response_array = $this->servicesPost($this->endpoint->path . '/comment', array('comment' => $comment));
+
+    $this->assertTrue(strpos($response_array['status'], t('An illegal choice has been detected.')), t('User cannot post comment with full_html filter chosen.'), 'CommentResource: Create');
+  }
 
-  public function drupalCreateComment() {
+  /**
+   * Test retrieve method.
+   */
+  function testCommentRetrieve() {
+    $path = $this->endpoint->path;
+
+    // Create node.
     $node = $this->drupalCreateNode();
-    $comment->nid = $node->nid;
-    $comment->subject = 'Testing';
-    $comment->comment_body = array(LANGUAGE_NONE => array(array('value' => $this->randomString())));
-    $comment->filter = 'plain_text';
-    $comment->language = LANGUAGE_NONE;
-    $comment->uid = $this->privilegedUser->uid;
-    //Created so simpletest has no exceptions
-    $comment->cid = NULL;
-    $comment->pid = NULL;
-    
+
+    $comment_args = $this->getCommentValues($node->nid);
+
+    $comment = (object)$comment_args;
+
     comment_save($comment);
-    $this->assertTrue($comment->cid == 1, t('Successfully created comment'), 'Simpletest Comment Create');
+    $comment_args['cid'] = $comment->cid;
+
+    $response = $this->servicesGet($path . '/comment/' . $comment->cid);
+
+    $comment_retrieve = (array)$response['body'];
+
+    $comment_intersect = array_intersect_assoc($comment_retrieve, $comment_args);
+
+    // Unset save_value as we don't have this key in arguments.
+    unset($comment_intersect['comment_body'][LANGUAGE_NONE][0]['safe_value']);
+
+    $this->assertEqual($comment_args, $comment_intersect, t('Comment retrieved properly.'), 'CommentResource: Retrieve');
   }
+
   /**
-   * testing node_resource Index
+   * Test update method.
    */
-  public function testCreateComment() {
-    // Create and log in our privileged user.
-    $this->privilegedUser = $this->drupalCreateUser(array(
-      'administer services',
-    ));
-    $this->drupalLogin($this->privilegedUser);
+  function testCommentUpdate() {
+    $path = $this->endpoint->path;
+
+    // Create node.
     $node = $this->drupalCreateNode();
-    $comment = array(
-      'subject' => 'testing',
-      'comment_body' => array(LANGUAGE_NONE => array(array('value' => $this->randomString()))),
-      'format' => 'plain_text',
-      'name' => $this->privilegedUser->name,
+
+    $comment_args = $this->getCommentValues($node->nid);
+
+    $comment = (object)$comment_args;
+
+    comment_save($comment);
+    $cid = $comment->cid;
+    $comment_args['cid'] = $cid;
+
+    $comment_update = $comment_args;
+    $comment_update['subject'] = $this->randomString();
+    $comment_update['comment_body'][LANGUAGE_NONE][0]['value'] = $this->randomString();
+
+    $response = $this->servicesPut($path . '/comment/' . $cid, array('data' => $comment_update));
+
+    $comment_load = (array)comment_load($cid);
+
+    $comment_intersect = array_intersect_assoc($comment_load, $comment_update);
+
+    // Unset save_value as we don't have this key in arguments.
+    unset($comment_intersect['comment_body'][LANGUAGE_NONE][0]['safe_value']);
+
+    $this->assertEqual($comment_update, $comment_intersect, t('Comment updated properly.'), 'CommentResource: Update');
+  }
+
+  /**
+   * Test delete method.
+   */
+  function testCommentDelete() {
+    $path = $this->endpoint->path;
+
+    // Create node with commenting.
+    $node = $this->drupalCreateNode();
+
+    $comment_args = $this->getCommentValues($node->nid);
+
+    $comment = (object)$comment_args;
+
+    comment_save($comment);
+    $cid = $comment->cid;
+    $comment_args['cid'] = $cid;
+
+    $response = $this->servicesDelete($path . '/comment/' . $cid);
+
+    $comment_load = comment_load($cid);
+
+    $this->assertTrue(empty($comment_load), t('Comment deleted properly.'), 'CommentResource: Delete');
+  }
+
+  /**
+   * Test loadNodeComments method.
+   */
+  function testCommentLoadNodeComments() {
+    $path = $this->endpoint->path;
+
+    // Create node with commenting.
+    $node = $this->drupalCreateNode();
+    $nid = $node->nid;
+
+    // Generate 15 comments for node.
+    $comments = array();
+    for ($i = 0; $i < 15; $i++) {
+      $comment = (object)$this->getCommentValues($nid);
+      comment_save($comment);
+      $comments[] = comment_load($comment->cid);
+    }
+
+    // Generate some comments for another node.
+    $node2 = $this->drupalCreateNode();
+    for ($i = 0; $i < 5; $i++) {
+      $comment = (object)$this->getCommentValues($node2->nid);
+      comment_save($comment);
+    }
+
+    // Load all comments of the first node.
+    $response = $this->servicesPost($path . '/comment/loadNodeComments', array('nid' => $nid));
+    $this->assertEqual(array_slice($comments, 0, 10), $response['body'], t('Received all 15 comments.'), 'CommentResource: loadNodeComments');
+
+    // Load only 5 comments of the first node.
+    $response = $this->servicesPost($path . '/comment/loadNodeComments', array('nid' => $nid, 'count' => 5));
+    $this->assertEqual(array_slice($comments, 0, 5), $response['body'], t('Received last 5 comments.'), 'CommentResource: loadNodeComments');
+
+    // Load only 5 comments of the first node starting from fifth comment.
+    $response = $this->servicesPost($path . '/comment/loadNodeComments', array('nid' => $nid, 'count' => 5, 'start' => 5));
+    $this->assertEqual(array_slice($comments, 5, 5), $response['body'], t('Received 5 comments starting from fifth comment.'), 'CommentResource: loadNodeComments');
+  }
+
+  /**
+   * Test countAll method.
+   */
+  function testCommentCountAll() {
+    $path = $this->endpoint->path;
+    // Generate comments.
+    $settings = array('comment' => 1);
+    $node = $this->drupalCreateNode($settings);
+    for ($i = 0; $i < 5; $i++) {
+      $comment = (object)$this->getCommentValues($node->nid);
+      comment_save($comment);
+    }
+
+    $response = $this->servicesPost($path . '/comment/countAll', array('nid' => $node->nid));
+    $this->assertEqual($response['body'], 5, t('Counted number of comments properly.'), 'CommentResource: countAll');
+  }
+
+  /**
+   * Test countNew method.
+   */
+  function testCommentCountNew() {
+    $path = $this->endpoint->path;
+    // Generate comments.
+    $node = $this->drupalCreateNode();
+    $nid = $node->nid;
+    for ($i = 0; $i < 5; $i++) {
+      $comment = (object)$this->getCommentValues($nid);
+      $comment->created = REQUEST_TIME + $i;
+      comment_save($comment);
+      $comments[] = comment_load($comment->cid);
+    }
+
+    $response = $this->servicesPost($path . '/comment/countNew', array('nid' => $node->nid));
+    $this->assertEqual($response['body'], 5, t('Received number of all new comments.'), 'CommentResource: countNew');
+
+    $since = $comments[2]->created;
+
+    $response = $this->servicesPost($path . '/comment/countNew', array('nid' => $node->nid, 'since' => $since));
+    $this->assertEqual($response['body'], 2, t('Received number of new comments.'), 'CommentResource: countNew');
+  }
+
+  /**
+   * Default values of comment for creating.
+   */
+  public function getCommentValues($nid) {
+    return array(
+      'subject' => $this->randomString(),
+      'comment_body' => array(
+        LANGUAGE_NONE => array(
+          array(
+            'value' => $this->randomString(),
+            'format' => filter_default_format(),
+          )
+        )
+      ),
+      'name' => $this->privileged_user->name,
       'language' => LANGUAGE_NONE,
-      'nid' => $node->nid,
+      'nid' => $nid,
+      'uid' => $this->privileged_user->uid,
       'cid' => NULL,
-      'pid' => NULL,
+      'pid' => 0,
     );
-
-    $responseArray = $this->servicesPost($this->endpoint->path . '/comment', array('comment' => $comment));
-    $commentResourceCreateReturn = $responseArray['body'];
-    $this->assertTrue(isset($commentResourceCreateReturn['cid']), t('Comment was successfully created'), 'CommentResource: Create');
-    $newComment = comment_load($commentResourceCreateReturn['cid']);
-    $this->assertTrue($newComment->subject == $comment['subject'], t('Subject was the same'), 'CommentResource: Create');
-    $this->assertTrue($newComment->comment_body[LANGUAGE_NONE][0]['value'] == $comment['comment_body'][LANGUAGE_NONE][0]['value'], t('Body was the same'), 'CommentResource: Create');
   }
 }
