diff --git a/plone/app/discussion/browser/javascripts/comments.js b/plone/app/discussion/browser/javascripts/comments.js
new file mode 100644
index 0000000..091ae6e
--- /dev/null
+++ b/plone/app/discussion/browser/javascripts/comments.js
@@ -0,0 +1,126 @@
+jq(document).ready(function() {
+
+ /*****************************************************************
+ * Show the reply button only when Javascript is enabled.
+ * Otherwise hide it, since the reply functions relies on jQuery.
+ *****************************************************************/
+ jq(".reply-to-comment-button").css("display" , "inline");
+
+
+ /*****************************************************************
+ * Create reply to comment form.
+ *****************************************************************/
+ jq(".reply-to-comment-button").bind("click", function(e){
+
+ var comment_div = jq(this).parents().filter(".comment");
+ var comment_id = comment_div.attr("id");
+
+ var reply_button = comment_div.find(".reply-to-comment-button");
+
+ /* Clone the reply div at the end of the page template that contains
+ * the regular comment form and insert it after the reply button of the
+ * current comment.
+ */
+ var reply_div = jq("#commenting").clone(true);
+ reply_div.appendTo(comment_div).css("display", "none");
+
+ /* Remove id="reply" attribute, since we use it to uniquely
+ the main reply form. */
+ reply_div.removeAttr("id")
+
+ /* Hide the reply button (only hide, because we may want to show it
+ * again if the user hits the cancel button).
+ */
+ jq(reply_button).css("display", "none");
+
+ /* Fetch the reply form inside the reply div */
+ var reply_form = reply_div.find("form");
+
+ /* Add a hidden field with the id of the comment */
+ reply_form.append("");
+
+ /* Change the form action to @@reply-to-comment */
+ var old_action = reply_form.attr("action");
+ var new_action = old_action.replace("@@add-comment", "@@reply-to-comment");
+ reply_form.attr("action", new_action);
+
+ /* Add a remove-reply-to-comment Javascript function to remove the form */
+ var cancel_reply_button = reply_div.find(".cancelreplytocomment");
+ cancel_reply_button.attr("id", comment_id);
+
+ /* Remove already typed in text from the reply form. */
+ reply_form.find(".field").find("input").attr("value", "")
+ reply_form.find(".field").find("textarea").attr("value", "")
+
+ /* Show the reply layer with a slide down effect */
+ reply_div.slideDown("slow");
+
+ /* Show the cancel button in the reply-to-comment form */
+ cancel_reply_button.css("display", "inline");
+
+ });
+
+
+ /*****************************************************************
+ * Remove reply to comment form.
+ *****************************************************************/
+ jq(".cancelreplytocomment").bind("click", function(e){
+
+ reply_to_comment_button = jq(this).parents().filter(".comment").find(".reply-to-comment-button");
+
+ /* Find the reply-to-comment form and hide and remove it again. */
+ reply_to_comment_form = jq(this).parents().filter(".reply")
+ reply_to_comment_form.slideUp("slow", function() { jq(this).remove(); } );
+
+ /* Show the reply-to-comment button again. */
+ reply_to_comment_button.css("display", "inline");
+
+ });
+
+ /*****************************************************************
+ * Remove comment.
+ *****************************************************************/
+ jq("input[name='form.button.DeleteComment']").click(function(e){
+ e.preventDefault();
+ var form = jq(this).parent();
+ var target = jq(form).attr("action");
+ var comment = jq(form).parent()
+ jq.ajax({
+ type: "GET",
+ url: target,
+ success: function(msg){
+ // fade out row
+ jq(comment).fadeOut("normal", function(){
+ jq(this).remove();
+ });
+ },
+ error: function(msg){
+ alert("Error sending AJAX request:" + target);
+ },
+ });
+ });
+
+ /*****************************************************************
+ * Publish comment.
+ *****************************************************************/
+ jq("input[name='form.button.PublishComment']").click(function(e){
+ e.preventDefault();
+ var button = jq(this);
+ var form = jq(this).parent();
+ var target = jq(form).attr("action");
+ var comment = jq(form).parent()
+ jq.ajax({
+ type: "GET",
+ url: target,
+ success: function(msg){
+ // fade out row
+ jq(button).fadeOut("normal", function(){
+ jq(form).remove();
+ });
+ },
+ error: function(msg){
+ alert("Error sending AJAX request:" + target);
+ },
+ });
+ });
+ });
\ No newline at end of file
diff --git a/plone/app/discussion/profiles/default/jsregistry.xml b/plone/app/discussion/profiles/default/jsregistry.xml
index 8082ab0..2b2a766 100644
--- a/plone/app/discussion/profiles/default/jsregistry.xml
+++ b/plone/app/discussion/profiles/default/jsregistry.xml
@@ -1,7 +1,7 @@