diff -Naur -x .svn trac-branch/trac/htdocs/css/wiki.css trac-branchA/trac/htdocs/css/wiki.css
--- trac-branch/trac/htdocs/css/wiki.css	2009-07-25 16:27:54.000000000 +0200
+++ trac-branchA/trac/htdocs/css/wiki.css	2009-07-25 16:36:03.000000000 +0200
@@ -17,7 +17,7 @@
 #changeinfo br { clear: left }
 #changeinfo .options { padding: 0 0 1em 1em }
 #changeinfo .options, #changeinfo .buttons { clear: left }
-#delete, #save { margin-left: 6em }
+#delete, #rename, #save { margin-left: 6em } 
 #preview {
  background: #f4f4f4 url(../draft.png);
  margin: 1em 0 2em;
diff -Naur -x .svn trac-branch/trac/wiki/templates/wiki_rename.html trac-branchA/trac/wiki/templates/wiki_rename.html
--- trac-branch/trac/wiki/templates/wiki_rename.html	1970-01-01 01:00:00.000000000 +0100
+++ trac-branchA/trac/wiki/templates/wiki_rename.html	2009-07-25 16:36:03.000000000 +0200
@@ -0,0 +1,40 @@
+<!DOCTYPE html
+    PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"
+      xmlns:py="http://genshi.edgewall.org/"
+      xmlns:xi="http://www.w3.org/2001/XInclude">
+  <xi:include href="layout.html" />
+  <head>
+    <title>$title</title>
+  </head>
+
+  <body>
+    <div id="content" class="wiki">
+      <h1>Rename <a href="${href.wiki(page.name)}">$page.name</a></h1>
+      <form id="rename" action="${href.wiki(page.name)}" method="post">
+        <input type="hidden" name="action" value="rename" />
+        <p>
+          <label for="new_name">New name:</label>
+          <input type="text" id="new_name" name="new_name" size="40" value="$page.name" />
+        </p>
+        <fieldset id="inplace" class="group">
+          <legend>Rename in-place</legend>
+          <p class="hint">Renaming the page will rename all existing versions
+          of the page in place. <br />
+          The history of the renamed page will be exactly the same as the one
+          of the original page.</p>
+          <input type="checkbox" id="leave_redirection" name="leave_redirection"/>
+          <label for="leave_redirection">Leave a redirection to the new page.</label>
+          <p class="hint">If you choose to leave a redirection, this will 
+          re-create the $page.name page with a content pointing to the new
+          page.</p>
+          <div class="buttons">
+            <input type="submit" name="cancel" value="Cancel" />
+            <input type="submit" name="rename" value="Rename" />
+          </div>
+        </fieldset>
+      </form>
+    </div>
+  </body>
+</html>
diff -Naur -x .svn trac-branch/trac/wiki/templates/wiki_view.html trac-branchA/trac/wiki/templates/wiki_view.html
--- trac-branch/trac/wiki/templates/wiki_view.html	2009-07-25 16:28:00.000000000 +0200
+++ trac-branchA/trac/wiki/templates/wiki_view.html	2009-07-25 16:36:03.000000000 +0200
@@ -62,7 +62,8 @@
 
       <py:with vars="modify_perm = 'WIKI_MODIFY' in perm(page.resource);
                      delete_perm = 'WIKI_DELETE' in perm(page.resource);
-                     admin_perm = 'WIKI_ADMIN' in perm(page.resource)">
+                     admin_perm = 'WIKI_ADMIN' in perm(page.resource);
+                     rename_perm = 'WIKI_RENAME' in perm(page.resource)">
         <py:if test="admin_perm or (not page.readonly and (modify_perm or delete_perm))">
           <div class="buttons">
             <py:if test="modify_perm">
@@ -92,7 +93,15 @@
                 ${attach_file_form(attachments)}
               </py:if>
             </py:if>
-            <py:if test="page.exists and delete_perm">
+            <py:if test="page.exists and rename_perm"> 
+	             <form method="get" action="${href.wiki(page.name)}"> 
+	                <div id="rename"> 
+	                  <input type="hidden" name="action" value="rename" /> 
+	                  <input type="submit" value="${_('Rename page')}" /> 
+	                </div> 
+	              </form> 
+	            </py:if> 
+              <py:if test="page.exists and delete_perm">
               <form method="get" action="${href.wiki(page.name)}">
                 <div id="delete">
                   <input type="hidden" name="action" value="delete" />
diff -Naur -x .svn trac-branch/trac/wiki/web_ui.py trac-branchA/trac/wiki/web_ui.py
--- trac-branch/trac/wiki/web_ui.py	2009-07-25 16:28:00.000000000 +0200
+++ trac-branchA/trac/wiki/web_ui.py	2009-07-25 16:36:03.000000000 +0200
@@ -94,7 +94,7 @@
     # IPermissionRequestor methods
 
     def get_permission_actions(self):
-        actions = ['WIKI_CREATE', 'WIKI_DELETE', 'WIKI_MODIFY', 'WIKI_VIEW']
+        actions = ['WIKI_CREATE', 'WIKI_DELETE', 'WIKI_MODIFY', 'WIKI_RENAME', 'WIKI_VIEW']
         return actions + [('WIKI_ADMIN', actions)]
 
     # IRequestHandler methods
@@ -149,8 +149,12 @@
                 get_diff_options(req)
                 req.redirect(req.href.wiki(versioned_page.name, action='diff',
                                            old_version=old_version))
+            elif action == 'rename':
+                return self._do_rename(req, page)
         elif action == 'delete':
-            return self._render_confirm(req, versioned_page)
+            return self._render_confirm_delete(req, versioned_page)
+        elif action == 'rename':
+            return self._render_rename_form(req, page)
         elif action == 'edit':
             return self._render_editor(req, versioned_page)
         elif action == 'diff':
@@ -269,6 +273,47 @@
                                   version=version, name=page.name))
             req.redirect(req.href.wiki(page.name))
 
+    def _do_rename(self, req, page):
+        if page.readonly:
+            req.perm(page.resource).require('WIKI_ADMIN')
+        else:
+            req.perm(page.resource).require('WIKI_RENAME')
+ 	 
+        if 'cancel' in req.args:
+            req.redirect(get_resource_url(self.env, page.resource, req.href))
+ 	 
+        new_name = req.args.get('new_name', '').rstrip('/')
+        old_name = page.name
+        old_version = page.version
+        leave_redirection = req.args.get('leave_redirection')
+ 	 
+        # verify input parameters
+        warn = None
+        if not new_name:
+            warn = _("New name is mandatory for a rename")
+        elif new_name == old_name:
+            warn = _("New name must be different from old name.")
+        if warn:
+            add_warning(req, warn)
+            return self._render_confirm_rename(req, page)
+        
+        db = self.env.get_db_cnx()
+        page.rename(new_name, db)
+
+        if leave_redirection:
+            redirection_page = WikiPage(self.env, old_name)
+            redirection_page.text = _("See [wiki:%(page)s].", page=new_name)
+            author = get_reporter_id(req)
+            comment = _("[wiki:'%(new_name)s@%(old_version)d' %(old_name)s] "
+                        "was renamed to %(new_name)s",
+                        old_name=old_name, old_version=old_version,
+                        new_name=new_name)
+            redirection_page.save(author, comment, req.remote_addr, None, db)
+
+        db.commit()
+       
+        req.redirect(req.href.wiki(leave_redirection and old_name or new_name)) 
+
     def _do_save(self, req, page):
         if page.readonly:
             req.perm(page.resource).require('WIKI_ADMIN')
@@ -294,7 +339,7 @@
             add_warning(req, _("Page not modified, showing latest version."))
             return self._render_view(req, page)
 
-    def _render_confirm(self, req, page):
+    def _render_confirm_delete(self, req, page):
         if page.readonly:
             req.perm(page.resource).require('WIKI_ADMIN')
         else:
@@ -319,6 +364,16 @@
         self._wiki_ctxtnav(req, page)
         return 'wiki_delete.html', data, None
 
+    def _render_rename_form(self, req, page):
+        if page.readonly:
+            req.perm(page.resource).require('WIKI_ADMIN')
+        else:
+            req.perm(page.resource).require('WIKI_RENAME')
+           
+            data = self._page_data(req, page, 'rename')
+            self._wiki_ctxtnav(req, page)
+            return 'wiki_rename.html', data, None
+
     def _render_diff(self, req, page):
         if not page.exists:
             raise TracError(_('Version %(num)s of page "%(name)s" does not '
@@ -384,7 +439,7 @@
                      _('Version %(num)s', num=next_version))
 
         data = self._page_data(req, page, 'diff')
-        data.update({ 
+        data.update({
             'change': {'date': date, 'author': author, 'ipnr': ipnr,
                        'comment': comment},
             'new_version': new_version, 'old_version': old_version,
@@ -424,7 +479,7 @@
         author = get_reporter_id(req, 'author')
         comment = req.args.get('comment', '')
         editrows = req.args.get('editrows')
-        
+       
         if editrows:
             pref = req.session.get('wiki_editrows', '20')
             if editrows != pref:
@@ -448,7 +503,7 @@
             data.update({'diff': diff_data, 'changes': changes,
                          'action': 'preview', 'merge': action == 'merge',
                          'longcol': 'Version', 'shortcol': 'v'})
-        
+       
         self._wiki_ctxtnav(req, page)
         return 'wiki_edit.html', data, None
 
@@ -518,7 +573,7 @@
                             next_version = v
             except ValueError:
                 version = None
-            
+           
         prefix = self.PAGE_TEMPLATES_PREFIX
         templates = [template[len(prefix):] for template in
                      WikiSystem(self.env).get_pages(prefix) if
@@ -538,7 +593,7 @@
             parent = page.name[:page.name.rindex('/')]
             add_link(req, 'up', req.href.wiki(parent, version=None),
                      _("View parent page"))
-        
+       
         if next_version:
             add_link(req, 'next',
                      req.href.wiki(page.name, version=next_version),
@@ -565,13 +620,13 @@
             'version': version
         })
         return 'wiki_view.html', data, None
-    
+   
     def _wiki_ctxtnav(self, req, page):
         """Add the normal wiki ctxtnav entries."""
         add_ctxtnav(req, _('Start Page'), req.href.wiki('WikiStart'))
         add_ctxtnav(req, _('Index'), req.href.wiki('TitleIndex'))
         if page.exists:
-            add_ctxtnav(req, _('History'), req.href.wiki(page.name, 
+            add_ctxtnav(req, _('History'), req.href.wiki(page.name,
                                                          action='history'))
             add_ctxtnav(req, _('Last Change'),
                         req.href.wiki(page.name, action='diff',
@@ -648,7 +703,7 @@
                        '%s: %s' % (name, shorten_line(text)),
                        datetime.fromtimestamp(ts, utc), author,
                        shorten_result(text, terms))
-        
+       
         # Attachments
         for result in AttachmentModule(self.env).get_search_results(
             req, wiki_realm, terms):

