Index: qPloneCaptchas/trunk/skins/captchas_discussion/3.0/discussion_reply.cpy
===================================================================
--- qPloneCaptchas/trunk/skins/captchas_discussion/3.0/discussion_reply.cpy	(revision 58)
+++ qPloneCaptchas/trunk/skins/captchas_discussion/3.0/discussion_reply.cpy	(revision 59)
@@ -11,4 +11,5 @@
 from Products.PythonScripts.standard import url_quote_plus
 from Products.CMFCore.utils import getToolByName
+from Products.CMFPlone import PloneMessageFactory as _
 mtool = getToolByName(context, 'portal_membership')
 dtool = getToolByName(context, 'portal_discussion')
@@ -55,10 +56,13 @@
 # return to the discussable object.
 redirect_target = context.plone_utils.getDiscussionThread(tb)[0]
-view = redirect_target.getTypeInfo().getActionById('view')
+view = redirect_target.getTypeInfo().getActionInfo('object/view',
+                                                   redirect_target)['url']
 anchor = reply.getId()
 
 from Products.CMFPlone.utils import transaction_note
-transaction_note('Added comment to %s at %s' % (parent.title_or_id(), reply.absolute_url()))
+transaction_note('Added comment to %s at %s' % (parent.title_or_id(),
+                                                reply.absolute_url()))
 
-target = '%s/%s?portal_status_message=Comment+added#%s' % (redirect_target.absolute_url(), view, anchor)
+context.plone_utils.addPortalMessage(_(u'Comment added.'))
+target = '%s#%s' % (view, anchor)
 return req.RESPONSE.redirect(target)
Index: qPloneCaptchas/trunk/skins/captchas_discussion/3.0/discussion_reply.cpy.metadata
===================================================================
--- qPloneCaptchas/trunk/skins/captchas_discussion/3.0/discussion_reply.cpy.metadata	(revision 59)
+++ qPloneCaptchas/trunk/skins/captchas_discussion/3.0/discussion_reply.cpy.metadata	(revision 59)
@@ -0,0 +1,5 @@
+[validators]
+validators=captcha_validator
+
+[actions]
+action.failure=traverse_to:string:discussion_reply_form
Index: qPloneCaptchas/trunk/skins/captchas_discussion/3.0/discussion_reply_form.cpt
===================================================================
--- qPloneCaptchas/trunk/skins/captchas_discussion/3.0/discussion_reply_form.cpt	(revision 59)
+++ qPloneCaptchas/trunk/skins/captchas_discussion/3.0/discussion_reply_form.cpt	(revision 59)
@@ -0,0 +1,177 @@
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"
+      xmlns:tal="http://xml.zope.org/namespaces/tal"
+      xmlns:metal="http://xml.zope.org/namespaces/metal"
+      xmlns:i18n="http://xml.zope.org/namespaces/i18n"
+      metal:use-macro="here/main_template/macros/master"
+      i18n:domain="plone">
+<body>
+
+<metal:block fill-slot="top_slot"
+             tal:define="dummy python:request.set('disable_border',1)" />
+
+<metal:block fill-slot="sub" />
+
+<div metal:fill-slot="main"
+     tal:define="errors options/state/getErrors;
+                 thread python:putils.getDiscussionThread(here);
+                 discussable python:thread[0];
+                 replies python:thread[1:]">
+
+    <tal:discussable define="template python:getattr(here, discussable.getLayout(), None);
+                             macros template/macros | nothing;
+                             main_macro macros/main | nothing;
+                             showDiscussable python:main_macro;">
+
+        <div class="comment" 
+             tal:condition="showDiscussable"
+             tal:define="here python:discussable">
+            <div metal:use-macro="main_macro"/>
+        </div>
+    </tal:discussable>
+
+    <tal:thread tal:repeat="reply replies">
+        <tal:block tal:define="level repeat/reply/index">
+            <div class="comment"
+                 tal:attributes="style python:'margin-left:'+str((int(level)+1)*2)+'em'">
+               <h3>
+                   <tal:block replace="structure portal/discussionitem_icon.gif"/>
+                   <span tal:replace="reply/pretty_title_or_id">Comment title</span>
+               </h3>
+               <div class="documentByLine"
+                    tal:define="anonymous_creator python:reply.Creator()=='Anonymous User'">
+                   <span i18n:translate="label_comment_by">Posted by</span>
+                   <span tal:content="reply/Creator"
+                         tal:condition="not:anonymous_creator">Poster Name</span>
+                   <span i18n:translate="label_anonymous_user"
+                         tal:condition="anonymous_creator">Anonymous User</span>
+                   <span i18n:translate="label_commented_at">at</span> 
+                   <span tal:replace="python:toLocalizedTime(reply.ModificationDate(),
+                                      long_format=1)">8/23/2001 12:40:44 PM</span>
+               </div>
+               <div class="commentBody"
+                    tal:content="structure reply/CookedBody">
+                    This is the body text of the comment.
+               </div>
+           </div>    
+                 
+        </tal:block>
+    </tal:thread>
+
+    <form name="edit_form"
+          class="enableAutoFocus"
+          method="post"
+          action="talkback"
+          tal:attributes="action string:$here_url/$template_id">
+
+        <fieldset>
+
+            <legend i18n:translate="legend_add_comment">Add comment</legend>
+            <p i18n:translate="description_add_comment">
+                You can add a comment by filling out the form below. Plain text
+                formatting.
+            </p>
+
+            <input type="hidden" name="Creator" value=""
+                   tal:attributes="value member/getUserName" />
+
+            <div tal:condition="isAnon">
+                <dl class="portalMessage warning">
+                    <dt i18n:translate="">
+                        Info
+                    </dt>
+                    <dd i18n:translate="legend_note_reply_anonymous">
+                        You are not logged in. You may optionally enter your
+                        username and password below. If you don't enter anything,
+                        this comment will be posted as 'Anonymous User'.
+                    </dd>
+                </dl>
+
+                <div class="field">
+
+                    <label for="username" i18n:translate="label_name">Name</label>
+
+                    <input name="username"
+                           id="username"
+                           value="" alt="Username" title="Name"
+                           size="40"
+                           i18n:attributes="title label_name; alt label_username;" />
+
+                </div>
+
+                <div class="field">
+
+                    <label for="password" i18n:translate="label_password">Password</label>
+
+                    <input type="password"
+                           id="password"
+                           name="password"
+                           value="" alt="Password" title="Password"
+                           size="40"
+                           i18n:attributes="title label_password; alt label_password;" />
+
+                </div>
+
+            </div>
+
+
+        <div class="field"
+        tal:define="error errors/subject|nothing;"
+        tal:attributes="class python:test(error, 'field error', 'field')">
+
+                <label for="subject" i18n:translate="label_subject">Subject</label>
+
+        <span class="fieldRequired" title="Required"
+              i18n:attributes="title title_required;"
+              i18n:translate="label_required">(Required)</span>
+
+            <div tal:content="error">Validation error output</div>
+
+                <input name="subject"
+                       id="subject"
+                       value=""
+                       size="40"
+                       tal:attributes="value request/subject|request/title_override|nothing;" />
+
+            </div>
+
+        <div class="field"
+        tal:define="error errors/body_text|nothing;"
+        tal:attributes="class python:test(error, 'field error', 'field')">
+
+          <label for="body_text" i18n:translate="label_comment">Comment</label>
+
+        <span class="fieldRequired" title="Required"
+              i18n:attributes="title title_required;"
+              i18n:translate="label_required">(Required)</span>
+
+            <div tal:content="error">Validation error output</div>
+
+                <textarea name="body_text"
+                          id="body_text"
+                          cols="40"
+                          rows="8"
+                          tal:content="request/body_text|request/text_override | nothing"
+                        ></textarea>
+
+            </div>
+            <div metal:use-macro="here/captcha_widget/macros/captcha"></div>
+            <div class="formControls">
+
+                <input class="context"
+                       type="submit"
+                       value="Save"
+                       name="form.button.Save"
+                       i18n:attributes="value label_save;"
+                       tal:attributes="name string:discussion_reply:method;" />
+
+            </div>
+          <input type="hidden" name="form.submitted" value="1" />
+
+        </fieldset>
+
+    </form>
+
+</div>
+
+</body>
+</html>
Index: qPloneCaptchas/trunk/skins/captchas_discussion/3.0/discussion_reply_form.cpt.metadata
===================================================================
--- qPloneCaptchas/trunk/skins/captchas_discussion/3.0/discussion_reply_form.cpt.metadata	(revision 59)
+++ qPloneCaptchas/trunk/skins/captchas_discussion/3.0/discussion_reply_form.cpt.metadata	(revision 59)
@@ -0,0 +1,9 @@
+[default]
+title=Reply to Comment
+
+[validators]
+validators = validate_talkback
+
+[actions]
+action.success = traverse_to:string:discussion_reply
+action.failure = traverse_to:string:discussion_reply_form
