diff --git services/comment_service/comment_service.info services/comment_service/comment_service.info
new file mode 100644
index 0000000..76c772f
--- /dev/null
+++ services/comment_service/comment_service.info
@@ -0,0 +1,5 @@
+; $Id$
+name = Comment Service
+description = Provides a comment service.
+package = Services - services
+dependencies = services comment
diff --git services/comment_service/comment_service.module services/comment_service/comment_service.module
new file mode 100644
index 0000000..06b65c8
--- /dev/null
+++ services/comment_service/comment_service.module
@@ -0,0 +1,150 @@
+<?php
+// $Id$
+
+/**
+ * Implementation of hook_help().
+ */
+function comment_service_help($section) {
+  switch ($section) {
+    case 'admin/help#services_comment':
+      return t('<p>Provides comment methods to services applications. Requires services.module.</p>');
+    case 'admin/modules#description':
+      return t('Provides comment methods to services applications. Requires services.module.');
+  }
+}
+
+/**
+ * Implementation of hook_service().
+ */
+function comment_service_service() {
+  return array(
+
+    // node.comments.save
+    array(
+      '#method'   => 'node.comments.save',
+      '#callback' => 'comment_service_save',
+      '#args'     => array(
+        array(
+          '#name'         => 'comment',
+          '#type'         => 'struct',
+          '#optional'     => FALSE,
+          '#description'  => t('A comment object.'))),
+      '#return' => 'int',
+      '#help' => t('This method adds a comment to a node and returns a comment id.  If the comment object contains a numeric "cid", then the comment will be updated. Required fields: nid, comment. Optional fields: cid (comment id), pid (parent comment), subject, mail, homepage')),
+
+    // node.comments.all
+    array(
+      '#method'   => 'node.comments.all',
+      '#callback' => 'comment_service_node_comments_all',
+      '#args'     => array(
+        array(
+          '#name'         => 'nid',
+          '#type'         => 'int',
+          '#optional'     => false,
+          '#description'  => t('A node id.')),
+        array(
+          '#name'         => 'fields',
+          '#type'         => 'array',
+          '#optional'     => TRUE,
+          '#description'  => t('A list of fields to return.'))),
+      '#return' => 'array',
+      '#help'   => t('This method returns all of the comments on a given node.')),
+
+    // node.comments.countAll
+    array(
+      '#method'   => 'node.comments.countAll',
+      '#callback' => 'comment_service_node_comments_count_all',
+      '#args'     => array(
+        array('#name' => 'nid',
+          '#type'         => 'int',
+          '#optional'     => false,
+          '#description'  => t('A node id.'))),
+      '#return' => 'int',
+      '#help'   => t('This method returns the number of comments on a given node.')),
+
+    // node.comments.countNew
+    array(
+      '#method'   => 'node.comments.countNew',
+      '#callback' => 'comment_service_node_comments_count_new',
+      '#args'      => array(
+        array(
+          '#name'         => 'nid',
+          '#type'         => 'int',
+          '#optional'     => false,
+          '#description'  => t('A node id')),
+        array(
+          '#name'         => 'since',
+          '#type'         => 'int',
+          '#optional'     => true,
+          '#description'  => t('Time to count from (defaults to time of last user acces to node).'))),
+      '#return' => 'int',
+      '#help'   => t('This method returns the number of new comments on a given node since a given timestamp.')),
+  );
+}
+
+/**
+ * Adds a new comment to a node and returns the cid.
+ * If a cid is specified in $comment->cid then that comment is edited.
+ */
+function comment_service_save($comment) {
+  global $user;
+
+  if (isset($comment['cid']) && ($comment['cid'] != 0)) {
+    // user is trying to edit a comment
+    $initial_comment = _comment_load($comment['cid']);
+    $admin = user_access("administer comments");
+
+    if ($initial_comment->uid == 0 && !$admin) {
+      return services_error(t("Anonymous comments can't be edited"));
+    }
+
+    if ($initial_comment->uid != $user->uid && !$admin) {
+      return services_error(t("User does not have permission to edit this comment"));
+    }
+  }
+
+  $comment['uid'] = $user->uid;
+  $comment['name'] = $user->name;
+  $comment['timestamp'] = time();
+
+  return comment_save($comment);
+}
+
+/**
+ * Returns the comments of a specified node.
+ */
+function comment_service_node_comments_all($nid, $fields = array()) {
+  $result = db_query("SELECT * FROM {comments} c, {users} u WHERE u.uid = c.uid AND nid = %d ORDER BY thread DESC", $nid);
+  $comments = array();
+
+  while ($comment = db_fetch_object($result)) {
+    $temp = NULL;
+
+    // loop through and get only requested fields
+    if (count($fields) > 0) {
+      foreach ($fields as $field) {
+        $temp->{$field} = $comment->{$field};
+      }
+    } 
+    else {
+      $temp = $comment;
+    }
+    $comments[] = $temp;
+  }
+
+  return $comments;
+}
+
+/**
+ * Returns the number of comments on a given node id.
+ */
+function comment_service_node_comments_count_all($nid) {
+  return comment_num_all($nid);
+}
+
+/**
+ * Returns the number of new comments on a given node id since timestamp.
+ */
+function comment_service_node_comments_count_new($nid, $since = 0) {
+  return comment_num_new($nid, $timestamp);
+}
\ No newline at end of file
