diff --git a/mercurial/templates/gitweb/map b/mercurial/templates/gitweb/map
index a9454beb9dd8a455c1d405aa9846eacaf60b1266_bWVyY3VyaWFsL3RlbXBsYXRlcy9naXR3ZWIvbWFw..69ea10d5b00c499f14f9b8f285a09163a592ef3e_bWVyY3VyaWFsL3RlbXBsYXRlcy9naXR3ZWIvbWFw 100644
--- a/mercurial/templates/gitweb/map
+++ b/mercurial/templates/gitweb/map
@@ -263,7 +263,8 @@
 shortlog = shortlog.tmpl
 graph = graph.tmpl
 phasetag = '{ifeq(phase, 'public', '', '<span class="phasetag" title="{phase|escape}">{phase|escape}</span> ')}'
+obsoletetag = '{if(obsolete, '<span class="obsoletetag" title="obsolete">obsolete</span> ')}'
 tagtag = '<span class="tagtag" title="{name|escape}">{name|escape}</span> '
 branchtag = '<span class="branchtag" title="{name|escape}">{name|escape}</span> '
 inbranchtag = '<span class="inbranchtag" title="{name|escape}">{name|escape}</span> '
 bookmarktag = '<span class="bookmarktag" title="{name|escape}">{name|escape}</span> '
@@ -266,8 +267,8 @@
 tagtag = '<span class="tagtag" title="{name|escape}">{name|escape}</span> '
 branchtag = '<span class="branchtag" title="{name|escape}">{name|escape}</span> '
 inbranchtag = '<span class="inbranchtag" title="{name|escape}">{name|escape}</span> '
 bookmarktag = '<span class="bookmarktag" title="{name|escape}">{name|escape}</span> '
-alltags = '<span class="logtags">{phasetag}{inbranch%inbranchtag}{branches%branchtag}{tags%tagtag}{bookmarks%bookmarktag}</span>'
+alltags = '<span class="logtags">{phasetag}{obsoletetag}{inbranch%inbranchtag}{branches%branchtag}{tags%tagtag}{bookmarks%bookmarktag}</span>'
 shortlogentry = '
   <tr class="parity{parity}">
     <td class="age"><i class="age">{date|rfc822date}</i></td>
diff --git a/mercurial/templates/monoblue/map b/mercurial/templates/monoblue/map
index a9454beb9dd8a455c1d405aa9846eacaf60b1266_bWVyY3VyaWFsL3RlbXBsYXRlcy9tb25vYmx1ZS9tYXA=..69ea10d5b00c499f14f9b8f285a09163a592ef3e_bWVyY3VyaWFsL3RlbXBsYXRlcy9tb25vYmx1ZS9tYXA= 100644
--- a/mercurial/templates/monoblue/map
+++ b/mercurial/templates/monoblue/map
@@ -222,7 +222,8 @@
   <dd><a href="{url|urlescape}comparison/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a></dd>'
 shortlog = shortlog.tmpl
 phasetag = '{ifeq(phase, 'public', '', '<span class="phasetag" title="{phase|escape}">{phase|escape}</span> ')}'
+obsoletetag = '{if(obsolete, '<span class="obsoletetag" title="obsolete">obsolete</span> ')}'
 tagtag = '<span class="tagtag" title="{name|escape}">{name|escape}</span> '
 branchtag = '<span class="branchtag" title="{name|escape}">{name|escape}</span> '
 inbranchtag = '<span class="inbranchtag" title="{name|escape}">{name|escape}</span> '
 bookmarktag = '<span class="bookmarktag" title="{name|escape}">{name|escape}</span> '
@@ -225,8 +226,8 @@
 tagtag = '<span class="tagtag" title="{name|escape}">{name|escape}</span> '
 branchtag = '<span class="branchtag" title="{name|escape}">{name|escape}</span> '
 inbranchtag = '<span class="inbranchtag" title="{name|escape}">{name|escape}</span> '
 bookmarktag = '<span class="bookmarktag" title="{name|escape}">{name|escape}</span> '
-alltags = '<span class="logtags">{phasetag}{inbranch%inbranchtag}{branches%branchtag}{tags%tagtag}{bookmarks%bookmarktag}</span>'
+alltags = '<span class="logtags">{phasetag}{obsoletetag}{inbranch%inbranchtag}{branches%branchtag}{tags%tagtag}{bookmarks%bookmarktag}</span>'
 shortlogentry = '
   <tr class="parity{parity}">
     <td class="nowrap age">{date|rfc822date}</td>
diff --git a/mercurial/templates/paper/map b/mercurial/templates/paper/map
index a9454beb9dd8a455c1d405aa9846eacaf60b1266_bWVyY3VyaWFsL3RlbXBsYXRlcy9wYXBlci9tYXA=..69ea10d5b00c499f14f9b8f285a09163a592ef3e_bWVyY3VyaWFsL3RlbXBsYXRlcy9wYXBlci9tYXA= 100644
--- a/mercurial/templates/paper/map
+++ b/mercurial/templates/paper/map
@@ -199,8 +199,9 @@
     </td>
   </tr>'
 phasetag = '{ifeq(phase, 'public', '', '<span class="phase">{phase|escape}</span> ')}'
+obsoletetag = '{if(obsolete, '<span class="obsolete">obsolete</span> ')}'
 changelogtag = '<span class="tag">{name|escape}</span> '
 changesettag = '<span class="tag">{tag|escape}</span> '
 changesetbookmark = '<span class="tag">{bookmark|escape}</span> '
 changelogbranchhead = '<span class="branchhead">{name|escape}</span> '
 changelogbranchname = '<span class="branchname">{name|escape}</span> '
@@ -202,9 +203,9 @@
 changelogtag = '<span class="tag">{name|escape}</span> '
 changesettag = '<span class="tag">{tag|escape}</span> '
 changesetbookmark = '<span class="tag">{bookmark|escape}</span> '
 changelogbranchhead = '<span class="branchhead">{name|escape}</span> '
 changelogbranchname = '<span class="branchname">{name|escape}</span> '
-alltags = '{phasetag}{inbranch%changelogbranchname}{branches%changelogbranchhead}{tags%changelogtag}{bookmarks%changelogtag}'
+alltags = '{phasetag}{obsoletetag}{inbranch%changelogbranchname}{branches%changelogbranchhead}{tags%changelogtag}{bookmarks%changelogtag}'
 
 filediffparent = '
   <tr>
diff --git a/mercurial/templates/spartan/changelogentry.tmpl b/mercurial/templates/spartan/changelogentry.tmpl
index a9454beb9dd8a455c1d405aa9846eacaf60b1266_bWVyY3VyaWFsL3RlbXBsYXRlcy9zcGFydGFuL2NoYW5nZWxvZ2VudHJ5LnRtcGw=..69ea10d5b00c499f14f9b8f285a09163a592ef3e_bWVyY3VyaWFsL3RlbXBsYXRlcy9zcGFydGFuL2NoYW5nZWxvZ2VudHJ5LnRtcGw= 100644
--- a/mercurial/templates/spartan/changelogentry.tmpl
+++ b/mercurial/templates/spartan/changelogentry.tmpl
@@ -22,6 +22,10 @@
   <th class="phase">phase:</th>
   <td class="phase">{phase|escape}</td>
  </tr>')}
+ {if(obsolete, '<tr>
+  <th class="obsolete">obsolete:</th>
+  <td class="obsolete">yes</td>
+ </tr>')}
  <tr>
   <th class="files"><a href="{url|urlescape}file/{node|short}{sessionvars%urlparameter}">files</a>:</th>
   <td class="files">{files}</td>
diff --git a/mercurial/templates/spartan/changeset.tmpl b/mercurial/templates/spartan/changeset.tmpl
index a9454beb9dd8a455c1d405aa9846eacaf60b1266_bWVyY3VyaWFsL3RlbXBsYXRlcy9zcGFydGFuL2NoYW5nZXNldC50bXBs..69ea10d5b00c499f14f9b8f285a09163a592ef3e_bWVyY3VyaWFsL3RlbXBsYXRlcy9zcGFydGFuL2NoYW5nZXNldC50bXBs 100644
--- a/mercurial/templates/spartan/changeset.tmpl
+++ b/mercurial/templates/spartan/changeset.tmpl
@@ -37,6 +37,10 @@
  <th class="phase">phase:</th>
  <td class="phase">{phase|escape}</td>
 </tr>')}
+{if(obsolete, '<tr>
+ <th class="obsolete">obsolete:</th>
+ <td class="obsolete">yes</td>
+</tr>')}
 <tr>
  <th class="files">files:</th>
  <td class="files">{files}</td>
diff --git a/mercurial/templates/static/style-gitweb.css b/mercurial/templates/static/style-gitweb.css
index a9454beb9dd8a455c1d405aa9846eacaf60b1266_bWVyY3VyaWFsL3RlbXBsYXRlcy9zdGF0aWMvc3R5bGUtZ2l0d2ViLmNzcw==..69ea10d5b00c499f14f9b8f285a09163a592ef3e_bWVyY3VyaWFsL3RlbXBsYXRlcy9zdGF0aWMvc3R5bGUtZ2l0d2ViLmNzcw== 100644
--- a/mercurial/templates/static/style-gitweb.css
+++ b/mercurial/templates/static/style-gitweb.css
@@ -126,6 +126,10 @@
 	background-color: #dfafff;
 	border-color: #e2b8ff #ce48ff #ce48ff #e2b8ff;
 }
+span.logtags span.obsoletetag {
+	background-color: #dddddd;
+	border-color: #e4e4e4 #a3a3a3 #a3a3a3 #e4e4e4;
+}
 span.logtags span.tagtag {
 	background-color: #ffffaa;
 	border-color: #ffffcc #ffee00 #ffee00 #ffffcc;
diff --git a/mercurial/templates/static/style-monoblue.css b/mercurial/templates/static/style-monoblue.css
index a9454beb9dd8a455c1d405aa9846eacaf60b1266_bWVyY3VyaWFsL3RlbXBsYXRlcy9zdGF0aWMvc3R5bGUtbW9ub2JsdWUuY3Nz..69ea10d5b00c499f14f9b8f285a09163a592ef3e_bWVyY3VyaWFsL3RlbXBsYXRlcy9zdGF0aWMvc3R5bGUtbW9ub2JsdWUuY3Nz 100644
--- a/mercurial/templates/static/style-monoblue.css
+++ b/mercurial/templates/static/style-monoblue.css
@@ -237,6 +237,10 @@
   background-color: #dfafff;
   border-color: #e2b8ff #ce48ff #ce48ff #e2b8ff;
 }
+span.logtags span.obsoletetag {
+  background-color: #dddddd;
+  border-color: #e4e4e4 #a3a3a3 #a3a3a3 #e4e4e4;
+}
 span.logtags span.tagtag {
   background-color: #ffffaa;
   border-color: #ffffcc #ffee00 #ffee00 #ffffcc;
diff --git a/mercurial/templates/static/style-paper.css b/mercurial/templates/static/style-paper.css
index a9454beb9dd8a455c1d405aa9846eacaf60b1266_bWVyY3VyaWFsL3RlbXBsYXRlcy9zdGF0aWMvc3R5bGUtcGFwZXIuY3Nz..69ea10d5b00c499f14f9b8f285a09163a592ef3e_bWVyY3VyaWFsL3RlbXBsYXRlcy9zdGF0aWMvc3R5bGUtcGFwZXIuY3Nz 100644
--- a/mercurial/templates/static/style-paper.css
+++ b/mercurial/templates/static/style-paper.css
@@ -146,6 +146,15 @@
   vertical-align: baseline;
 }
 
+.obsolete {
+  color: #999;
+  font-size: 70%;
+  border-bottom: 1px dashed #999;
+  font-weight: normal;
+  margin-left: .5em;
+  vertical-align: baseline;
+}
+
 .tag {
   color: #999;
   font-size: 70%;
diff --git a/tests/test-hgweb.t b/tests/test-hgweb.t
index a9454beb9dd8a455c1d405aa9846eacaf60b1266_dGVzdHMvdGVzdC1oZ3dlYi50..69ea10d5b00c499f14f9b8f285a09163a592ef3e_dGVzdHMvdGVzdC1oZ3dlYi50 100644
--- a/tests/test-hgweb.t
+++ b/tests/test-hgweb.t
@@ -340,7 +340,7 @@
 
   $ get-with-headers.py --twice localhost:$HGPORT 'static/style-gitweb.css' - date etag server
   200 Script output follows
-  content-length: 9151
+  content-length: 9261
   content-type: text/css
   
   body { font-family: sans-serif; font-size: 12px; border:solid #d9d8d1; border-width:1px; margin:10px; background: white; color: black; }
@@ -471,6 +471,10 @@
   	background-color: #dfafff;
   	border-color: #e2b8ff #ce48ff #ce48ff #e2b8ff;
   }
+  span.logtags span.obsoletetag {
+  	background-color: #dddddd;
+  	border-color: #e4e4e4 #a3a3a3 #a3a3a3 #e4e4e4;
+  }
   span.logtags span.tagtag {
   	background-color: #ffffaa;
   	border-color: #ffffcc #ffee00 #ffee00 #ffffcc;
diff --git a/tests/test-obsolete.t b/tests/test-obsolete.t
index a9454beb9dd8a455c1d405aa9846eacaf60b1266_dGVzdHMvdGVzdC1vYnNvbGV0ZS50..69ea10d5b00c499f14f9b8f285a09163a592ef3e_dGVzdHMvdGVzdC1vYnNvbGV0ZS50 100644
--- a/tests/test-obsolete.t
+++ b/tests/test-obsolete.t
@@ -1015,6 +1015,30 @@
   orphan: 2 changesets
   phase-divergent: 1 changesets
 
+#if serve
+
+  $ hg serve -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
+  $ cat hg.pid >> $DAEMON_PIDS
+
+check obsolete changeset
+
+  $ get-with-headers.py localhost:$HGPORT 'log?rev=first(obsolete())&style=paper' | grep '<span class="obsolete">'
+     <span class="phase">draft</span> <span class="obsolete">obsolete</span> 
+  $ get-with-headers.py localhost:$HGPORT 'log?rev=first(obsolete())&style=coal' | grep '<span class="obsolete">'
+     <span class="phase">draft</span> <span class="obsolete">obsolete</span> 
+  $ get-with-headers.py localhost:$HGPORT 'log?rev=first(obsolete())&style=gitweb' | grep '<span class="logtags">'
+    <span class="logtags"><span class="phasetag" title="draft">draft</span> <span class="obsoletetag" title="obsolete">obsolete</span> </span>
+  $ get-with-headers.py localhost:$HGPORT 'log?rev=first(obsolete())&style=monoblue' | grep '<span class="logtags">'
+          <span class="logtags"><span class="phasetag" title="draft">draft</span> <span class="obsoletetag" title="obsolete">obsolete</span> </span>
+  $ get-with-headers.py localhost:$HGPORT 'log?rev=first(obsolete())&style=spartan' | grep 'class="obsolete"'
+    <th class="obsolete">obsolete:</th>
+    <td class="obsolete">yes</td>
+
+  $ killdaemons.py
+
+  $ rm hg.pid access.log errors.log
+#endif
+
 Test incoming/outcoming with changesets obsoleted remotely, known locally
 ===============================================================================