diff --git a/trac/trac/wiki/model.py b/trac/trac/wiki/model.py
index fe2b0bf..c6ed03b 100644
--- a/trac/trac/wiki/model.py
+++ b/trac/trac/wiki/model.py
@@ -57,12 +57,12 @@ class WikiPage(object):
         if version is not None:
             cursor.execute("SELECT version,time,author,text,comment,readonly "
                            "FROM wiki "
-                           "WHERE name=%s AND version=%s",
+                           "WHERE name=%s AND version=%s AND deleted IS NULL",
                            (name, int(version)))
         else:
             cursor.execute("SELECT version,time,author,text,comment,readonly "
                            "FROM wiki "
-                           "WHERE name=%s ORDER BY version DESC LIMIT 1",
+                           "WHERE name=%s AND deleted IS NULL ORDER BY version DESC LIMIT 1",
                            (name,))
         row = cursor.fetchone()
         if row:
@@ -89,12 +89,12 @@ class WikiPage(object):
             cursor = db.cursor()
             if version is None:
                 # Delete a wiki page completely
-                cursor.execute("DELETE FROM wiki WHERE name=%s", (self.name,))
+                cursor.execute("UPDATE wiki SET deleted=%s WHERE name=%s AND deleted IS NULL", (datetime.now(utc), self.name,))
                 self.env.log.info('Deleted page %s' % self.name)
             else:
                 # Delete only a specific page version
-                cursor.execute("DELETE FROM wiki WHERE name=%s and version=%s",
-                               (self.name, version))
+                cursor.execute("UPDATE wiki SET deleted=%s WHERE name=%s and version=%s AND deleted IS NULL",
+                               (datetime.now(utc), self.name,  version))
                 self.env.log.info('Deleted version %d of page %s'
                                   % (version, self.name))
 
@@ -127,14 +127,17 @@ class WikiPage(object):
         def do_save(db):
             cursor = db.cursor()
             if new_text:
+                cursor.execute("SELECT max(version)+1 FROM wiki WHERE name=%s", (self.name,))
+                (new_version,) = cursor.fetchone()
+
                 cursor.execute("""
                     INSERT INTO wiki (name,version,time,author,ipnr,text,
                                       comment,readonly)
                     VALUES (%s,%s,%s,%s,%s,%s,%s,%s)
-                    """, (self.name, self.version + 1, to_utimestamp(t),
+                    """, (self.name, new_version, to_utimestamp(t),
                           author, remote_addr, self.text, comment,
                           self.readonly))
-                self.version += 1
+                self.version = new_version
                 self.resource = self.resource(version=self.version)
             else:
                 cursor.execute("UPDATE wiki SET readonly=%s WHERE name=%s",
diff --git a/trac/trac/db_default.py b/trac/trac/db_default.py
index 13ac7d9..04501f0 100644
--- a/trac/trac/db_default.py
+++ b/trac/trac/db_default.py
@@ -17,7 +17,7 @@
 from trac.db import Table, Column, Index
 
 # Database version identifier. Used for automatic upgrades.
-db_version = 26
+db_version = 27
 
 def __mkreports(reports):
     """Utility function used to create report data in same syntax as the
@@ -82,6 +82,7 @@ schema = [
         Column('text'),
         Column('comment'),
         Column('readonly', type='int'),
+        Column('deleted', type='int'),        
         Index(['time'])],
 
     # Version control cache
diff --git a/trac/trac/upgrades/db27.py b/trac/trac/upgrades/db27.py
new file mode 100644
index 0000000..02da65c
--- /dev/null
+++ b/trac/trac/upgrades/db27.py
@@ -0,0 +1,6 @@
+
+def do_upgrade(env, ver, cursor):
+    """Add deleted column to wiki table (see http://trac.edgewall.org/ticket/9222)"""
+    cursor.execute("""
+    ALTER TABLE wiki ADD COLUMN deleted integer;
+        """)
diff --git a/trac/trac/wiki/api.py b/trac/trac/wiki/api.py
index 17bc685..d372e8e 100644
--- a/trac/trac/wiki/api.py
+++ b/trac/trac/wiki/api.py
@@ -218,7 +218,7 @@ class WikiSystem(Component):
     def pages(self, db):
         """Return the names of all existing wiki pages."""
         cursor = db.cursor()
-        cursor.execute("SELECT DISTINCT name FROM wiki")
+        cursor.execute("SELECT DISTINCT name FROM wiki WHERE deleted IS NULL")
         return set(row[0] for row in cursor)
 
     # Public API
diff --git a/trac/trac/wiki/model.py b/trac/trac/wiki/model.py
index c6ed03b..05d8660 100644
--- a/trac/trac/wiki/model.py
+++ b/trac/trac/wiki/model.py
@@ -44,6 +44,7 @@ class WikiPage(object):
             self._fetch(name, version, db)
         else:
             self.version = 0
+            self.deleted = 0            
             self.text = self.comment = self.author = ''
             self.time = None
             self.readonly = 0
@@ -55,19 +56,20 @@ class WikiPage(object):
             db = self.env.get_db_cnx()
         cursor = db.cursor()
         if version is not None:
-            cursor.execute("SELECT version,time,author,text,comment,readonly "
+            cursor.execute("SELECT version,time,author,text,comment,readonly,deleted "
                            "FROM wiki "
                            "WHERE name=%s AND version=%s AND deleted IS NULL",
                            (name, int(version)))
         else:
-            cursor.execute("SELECT version,time,author,text,comment,readonly "
+            cursor.execute("SELECT version,time,author,text,comment,readonly,deleted "
                            "FROM wiki "
                            "WHERE name=%s AND deleted IS NULL ORDER BY version DESC LIMIT 1",
                            (name,))
         row = cursor.fetchone()
         if row:
-            version, time, author, text, comment, readonly = row
+            version, time, author, text, comment, readonly,deleted = row
             self.version = int(version)
+            self.deleted = deleted
             self.author = author
             self.time = from_utimestamp(time)
             self.text = text
@@ -75,13 +77,14 @@ class WikiPage(object):
             self.readonly = readonly and int(readonly) or 0
         else:
             self.version = 0
+            self.deleted = None
             self.text = self.comment = self.author = ''
             self.time = None
             self.readonly = 0
             
     exists = property(fget=lambda self: self.version > 0)
 
-    def delete(self, version=None, db=None):
+    def delete(self, version=None, db=None, authname=None):
         assert self.exists, 'Cannot delete non-existent page'
         
         @self.env.with_transaction(db)
@@ -89,12 +92,13 @@ class WikiPage(object):
             cursor = db.cursor()
             if version is None:
                 # Delete a wiki page completely
-                cursor.execute("UPDATE wiki SET deleted=%s WHERE name=%s AND deleted IS NULL", (datetime.now(utc), self.name,))
+                cursor.execute("UPDATE wiki SET deleted=%s, author=%s WHERE name=%s AND deleted IS NULL", (
+                    to_utimestamp(datetime.now(utc)), authname, self.name,))
                 self.env.log.info('Deleted page %s' % self.name)
             else:
                 # Delete only a specific page version
-                cursor.execute("UPDATE wiki SET deleted=%s WHERE name=%s and version=%s AND deleted IS NULL",
-                               (datetime.now(utc), self.name,  version))
+                cursor.execute("UPDATE wiki SET deleted=%s, author=%s WHERE name=%s and version=%s AND deleted IS NULL",
+                               (to_utimestamp(datetime.now(utc)), authname, self.name,  version))
                 self.env.log.info('Deleted version %d of page %s'
                                   % (version, self.name))
 
@@ -198,7 +202,7 @@ class WikiPage(object):
             db = self.env.get_db_cnx()
         cursor = db.cursor()
         cursor.execute("SELECT version,time,author,comment,ipnr FROM wiki "
-                       "WHERE name=%s AND version<=%s "
+                       "WHERE name=%s AND version<=%s AND deleted IS NULL "
                        "ORDER BY version DESC", (self.name, self.version))
         for version, ts, author, comment, ipnr in cursor:
             yield version, from_utimestamp(ts), author, comment, ipnr
diff --git a/trac/trac/wiki/web_ui.py b/trac/trac/wiki/web_ui.py
index 0fc141c..694eb7c 100644
--- a/trac/trac/wiki/web_ui.py
+++ b/trac/trac/wiki/web_ui.py
@@ -256,10 +256,10 @@ class WikiModule(Component):
             if version and old_version and version > old_version:
                 # delete from `old_version` exclusive to `version` inclusive:
                 for v in range(old_version, version):
-                    page.delete(v + 1, db)
+                    page.delete(v + 1, db, req.authname)
             else:
                 # only delete that `version`, or the whole page if `None`
-                page.delete(version, db)
+                page.delete(version, db, req.authname)
 
         if not page.exists:
             add_notice(req, _('The page %(name)s has been deleted.',
@@ -687,15 +687,18 @@ class WikiModule(Component):
         if 'wiki' in filters:
             wiki_realm = Resource('wiki')
             cursor = db.cursor()
-            cursor.execute("SELECT time,name,comment,author,version "
+            cursor.execute("SELECT time,name,comment,author,version,deleted "
                            "FROM wiki WHERE time>=%s AND time<=%s",
                            (to_utimestamp(start), to_utimestamp(stop)))
-            for ts, name, comment, author, version in cursor:
+            for ts, name, comment, author, version, deleted in cursor:
                 wiki_page = wiki_realm(id=name, version=version)
                 if 'WIKI_VIEW' not in req.perm(wiki_page):
                     continue
                 yield ('wiki', from_utimestamp(ts), author,
-                       (wiki_page, comment))
+                       (wiki_page, deleted, False, comment))
+                if deleted is not None:
+                    yield ('wiki', from_utimestamp(deleted), author,
+                           (wiki_page, deleted, True, _("Marked deleted")))
 
             # Attachments
             for event in AttachmentModule(self.env).get_timeline_events(
@@ -703,19 +706,26 @@ class WikiModule(Component):
                 yield event
 
     def render_timeline_event(self, context, field, event):
-        wiki_page, comment = event[3]
+        wiki_page, deleted, delete_event, comment = event[3]
         if field == 'url':
+            if deleted:
+                # TODO link to some kind of 'restore page' feature
+                return "javascript:alert('%s')" % _("This page is longer available.")
             return context.href.wiki(wiki_page.id, version=wiki_page.version)
         elif field == 'title':
             name = tag.em(get_resource_name(self.env, wiki_page))
-            if wiki_page.version > 1:
-                return tag_('%(page)s edited', page=name)
+            if delete_event:
+                return tag_('%(page)s version %(version)s deleted',
+                            page=name, version=wiki_page.version)
+            elif wiki_page.version > 1:
+                return tag_('%(page)s edited (version %(version)s)',
+                            page=name, version=wiki_page.version)
             else:
                 return tag_('%(page)s created', page=name)
         elif field == 'description':
             markup = format_to(self.env, None, context(resource=wiki_page),
                                comment)
-            if wiki_page.version > 1:
+            if wiki_page.version > 1 and deleted is None:
                 diff_href = context.href.wiki(
                     wiki_page.id, version=wiki_page.version, action='diff')
                 markup = tag(markup,
@@ -740,6 +750,7 @@ class WikiModule(Component):
                        "(SELECT name,max(version) AS ver "
                        "FROM wiki GROUP BY name) w2 "
                        "WHERE w1.version = w2.ver AND w1.name = w2.name "
+                       "AND w1.deleted IS NULL "
                        "AND " + sql_query, args)
 
         wiki_realm = Resource('wiki')
diff --git a/trac/trac/db_default.py b/trac/trac/db_default.py
index 04501f0..86bb8cb 100644
--- a/trac/trac/db_default.py
+++ b/trac/trac/db_default.py
@@ -82,7 +82,7 @@ schema = [
         Column('text'),
         Column('comment'),
         Column('readonly', type='int'),
-        Column('deleted', type='int'),        
+        Column('deleted', type='int64'),
         Index(['time'])],
 
     # Version control cache
diff --git a/trac/trac/upgrades/db27.py b/trac/trac/upgrades/db27.py
index 02da65c..191220f 100644
--- a/trac/trac/upgrades/db27.py
+++ b/trac/trac/upgrades/db27.py
@@ -1,6 +1,26 @@
+from trac.db import Table, Column, Index, DatabaseManager
 
 def do_upgrade(env, ver, cursor):
     """Add deleted column to wiki table (see http://trac.edgewall.org/ticket/9222)"""
-    cursor.execute("""
-    ALTER TABLE wiki ADD COLUMN deleted integer;
-        """)
+    cursor.execute("CREATE TEMPORARY TABLE wiki_old AS SELECT * FROM wiki")
+    cursor.execute("DROP TABLE wiki")
+
+    table = Table('wiki', key=('name', 'version'))[
+        Column('name'),
+        Column('version', type='int'),
+        Column('time', type='int64'),
+        Column('author'),
+        Column('ipnr'),
+        Column('text'),
+        Column('comment'),
+        Column('readonly', type='int'),
+        Column('deleted', type='int64'),
+        Index(['time'])]
+
+    db_connector, _ = DatabaseManager(env).get_connector()
+    for stmt in db_connector.to_sql(table):
+        cursor.execute(stmt)
+
+    cursor.execute("INSERT INTO wiki (name,version,time,author,ipnr,text,comment,readonly,time) "
+                   "SELECT name,version,time,author,ipnr,text,comment,readonly,time FROM wiki_old")
+    cursor.execute("DROP TABLE wiki_old")
