diff --git a/SConstruct b/SConstruct
index 2bd5c4533144ca4d88e0a3639ca7b66540de788b..79462692f609b032571b7bf1bf58097065e9d692 100644
--- a/SConstruct
+++ b/SConstruct
@@ -14,6 +14,7 @@ env.Append(
    CPPPATH = [ '#' ],
    LIBS = [ 'iberty' ],
    DOXY_XREF_TYPES = [ 'bug', 'fixme', 'todo', 'idea' ],
+   DOXY_HTML_XSL = '#/doclib/html-munge.xsl',
 )
 
 import datetime
diff --git a/Socket/ClientSocketHandle.ct b/Socket/ClientSocketHandle.ct
index 0c6b61b86a710820e3410dbca00cb5552ee3a88d..3f5112fc173914fa047b8400f79630d8c0079239 100644
--- a/Socket/ClientSocketHandle.ct
+++ b/Socket/ClientSocketHandle.ct
@@ -20,7 +20,9 @@
 // Free Software Foundation, Inc.,
 // 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
-// Definition of non-inline template functions
+/** \file
+    \brief senf::ClientSocketHandle non-inline template implementation
+ */
 
 //#include "ClientSocketHandle.ih"
 
diff --git a/Socket/ClientSocketHandle.cti b/Socket/ClientSocketHandle.cti
index c6a934868128db5b25c51c9cd78c2d89ad9727e8..669aa38ffa203c05931464ccdd5df47b138dcd55 100644
--- a/Socket/ClientSocketHandle.cti
+++ b/Socket/ClientSocketHandle.cti
@@ -20,7 +20,9 @@
 // Free Software Foundation, Inc.,
 // 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
-// Definition of inline template functions
+/** \file
+    \brief senf::ClientSocketHandle inline template implementation
+ */
 
 //#include "ClientSocketHandle.ih"
 
diff --git a/Socket/ClientSocketHandle.hh b/Socket/ClientSocketHandle.hh
index a1f3b9243654b2eae18b8c40c60ee992be6ad263..96267f5df7bb7712a0b134df0bd5695f9dc4f136 100644
--- a/Socket/ClientSocketHandle.hh
+++ b/Socket/ClientSocketHandle.hh
@@ -20,6 +20,10 @@
 // Free Software Foundation, Inc.,
 // 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
+/** \file
+    \brief senf::ClientSocketHandle public header
+ */
+
 #ifndef HH_ClientSocketHandle_
 #define HH_ClientSocketHandle_ 1
 
@@ -37,7 +41,7 @@ namespace senf {
     
     template <class Policy> class ServerSocketHandle;
 
-    /** \brief
+    /** \brief Generic SocketHandle with client interface
 	
 	\todo Move all not template-parameter dependent code into a
 	non-template base class
diff --git a/Socket/SocketPolicy.ct b/Socket/SocketPolicy.ct
index 3f07f25c841601d8cc673be12d2a7a193c9c4272..d8b2f226550fae1ecdb86bdaefb311bd56a8eb99 100644
--- a/Socket/SocketPolicy.ct
+++ b/Socket/SocketPolicy.ct
@@ -20,7 +20,9 @@
 // Free Software Foundation, Inc.,
 // 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
-// Definition of non-inline template functions
+/** \file 
+    \brief Policy Framework non-inline template implemenation
+ */
 
 #include "SocketPolicy.ih"
 
diff --git a/Socket/SocketPolicy.hh b/Socket/SocketPolicy.hh
index 297a469aafc156e691f2ac5ea069d0696797b901..eb453aff28e7a4ae32fdebed4b8468ab7a66e77a 100644
--- a/Socket/SocketPolicy.hh
+++ b/Socket/SocketPolicy.hh
@@ -21,7 +21,7 @@
 // 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
 /** \file
-    \brief SocketPolicy public header
+    \brief Policy Framework public header
 
     \todo We should probably remove BufferingPolicy from the
     interface, it does not make much sense (how did I come to include
diff --git a/Socket/SocketPolicy.ih b/Socket/SocketPolicy.ih
index fac273ad16657abdbeb8cd23c9d0acf7f923dbcb..0e2b58fd63b241d80570c149eb6e010496a09707 100644
--- a/Socket/SocketPolicy.ih
+++ b/Socket/SocketPolicy.ih
@@ -20,6 +20,10 @@
 // Free Software Foundation, Inc.,
 // 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
+/** \file
+    \brief Policy Framework internal header
+ */
+
 #ifndef IH_SocketPolicy_
 #define IH_SocketPolicy_ 1
 
diff --git a/doclib/html-munge.xsl b/doclib/html-munge.xsl
new file mode 100644
index 0000000000000000000000000000000000000000..241bc8b868f32d07b683862bde7c7363d690505e
--- /dev/null
+++ b/doclib/html-munge.xsl
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+                version="1.0">
+
+  <xsl:output method="html" encoding="html" />
+
+  <xsl:template match="/">
+    <html>
+      <body bgcolor="#FFFFFF">
+        <xsl:apply-templates/>
+      </body>
+    </html>
+  </xsl:template>
+
+  <xsl:template match="dl[dt/b/a/text()='Bug:']">
+    <xsl:copy>
+      <xsl:for-each select="@*"><xsl:copy/></xsl:for-each>
+      <xsl:attribute name="class">xref-bug</xsl:attribute>
+      <xsl:apply-templates/>
+    </xsl:copy>
+  </xsl:template>
+
+  <xsl:template match="dl[dt/b/a/text()='Fixme:']">
+    <xsl:copy>
+      <xsl:for-each select="@*"><xsl:copy/></xsl:for-each>
+      <xsl:attribute name="class">xref-fixme</xsl:attribute>
+      <xsl:apply-templates/>
+    </xsl:copy>
+  </xsl:template>
+
+  <xsl:template match="dl[dt/b/a/text()='Todo:']">
+    <xsl:copy>
+      <xsl:for-each select="@*"><xsl:copy/></xsl:for-each>
+      <xsl:attribute name="class">xref-todo</xsl:attribute>
+      <xsl:apply-templates/>
+    </xsl:copy>
+  </xsl:template>
+
+  <xsl:template match="dl[dt/b/a/text()='Idea:']">
+    <xsl:copy>
+      <xsl:for-each select="@*"><xsl:copy/></xsl:for-each>
+      <xsl:attribute name="class">xref-idea</xsl:attribute>
+      <xsl:apply-templates/>
+    </xsl:copy>
+  </xsl:template>
+
+  <xsl:template match="*">
+    <xsl:copy>
+      <xsl:for-each select="@*"><xsl:copy/></xsl:for-each>
+      <xsl:apply-templates/>
+    </xsl:copy>
+  </xsl:template>
+
+</xsl:stylesheet>
diff --git a/doclib/senf.css b/doclib/senf.css
index f5f2de4e5beca3dcd0c8b850e60a7acfd2b53af4..ddfeff0c080df36bb928b08ad714d3fae96f537b 100644
--- a/doclib/senf.css
+++ b/doclib/senf.css
@@ -175,25 +175,24 @@ dl.bug, dl.fixme, dl.todo, dl.idea {
 	padding: 0 10px;
 }
 
-dl:contains("Bug:"), dl:contains("Fix:"), dl:contains("Todo:"), dl:contains("Idea:") { 
+dl.xref-bug, dl.xref-fix, dl.xref-todo, dl.xref-idea { 
 	border: 1px solid #CC8888;
-	padding: 4px;
+	padding: 2px 3px;
+	margin: 4px 0;
 	background-color: #FFEEEE;
 	color: #666666;
-	font-size: 6px;
-	line-height: 6px;
+	font-size: 9px;
 	overflow: hidden;
-	height: 6px;
 }
 
-dl:contains("Bug:"):hover, dl:contains("Fix:"):hover, 
-dl:contains("Todo:"):hover, dl:contains("Idea:"):hover { 
-	line-height: inherit;
-	font-size: inherit;
-	height: auto;
+dl.xref-bug dt, dl.xref-fix dt, dl.xref-todo dt, dl.xref-idea dt,
+dl.xref-bug dd, dl.xref-fix dd, dl.xref-todo dd, dl.xref-idea dd { 
+	display: inline;
+	margin: 0;
+	padding: 0;
 }
 
-dl:contains("Bug:") a, dl:contains("Fix:") a, dl:contains("Todo:") a, dl:contains("Idea:") a { 
+dl.xref-bug a, dl.xref-fix a, dl.xref-todo a, dl.xref-idea a { 
 	color: #6666FF;
 }
 
@@ -202,7 +201,7 @@ dl.fixme {
 	background-color: #FFFFDD;
 }
 
-dl:contains("Fix:") { 
+dl.xref-fix { 
 	border-color: #CCCC88;
 	background-color: #FFFFEE;
 }
@@ -212,7 +211,7 @@ dl.todo {
 	background-color: #DDFFDD;
 }
 
-dl:contains("Todo:") { 
+dl.xref-todo { 
 	border-color: #88CC88;
 	background-color: #EEFFEE;
 }
@@ -222,7 +221,7 @@ dl.idea {
 	background-color: #EEEEEE;
 }
 
-dl:contains("Idea:") { 
+dl.xref-idea { 
 	border-color:  #CCCCCC;
 	background-color: #F8F8F8;
 }
diff --git a/senfscons/SENFSCons.py b/senfscons/SENFSCons.py
index d2e0c488248961ba040efb9e3c8c1bca79c26cfc..a9961d60a7f2b61b5677576f74b318b371623fae 100644
--- a/senfscons/SENFSCons.py
+++ b/senfscons/SENFSCons.py
@@ -151,11 +151,13 @@ def Doxygen(env, doxyfile = "Doxyfile", extra_sources = []):
     #        ||| WITHIN THE DOXYGEN BUILDER
     docs = env.Doxygen(doxyfile)[:]
     xmlnode = None
+    htmlnode = None
     tagnode = None
     for doc in docs:
         if isinstance(doc,SCons.Node.FS.Dir): continue
         if doc.name == 'xml.stamp' : xmlnode = doc
-        if os.path.splitext(doc.name)[1] == '.stamp' : continue # file stamp
+        if doc.name == 'html.stamp' : htmlnode = doc
+        if os.path.splitext(doc.name)[1] == '.stamp' : continue # ignore other file stamps
         # otherwise it must be the tag file
         tagnode = doc
 
@@ -164,10 +166,21 @@ def Doxygen(env, doxyfile = "Doxyfile", extra_sources = []):
         # references
         env.AddPostAction(
             docs,
-            env.Action("xsltproc -o %(target)s.temp %(template)s %(target)s && mv %(target)s.temp %(target)s"
+            env.Action("xsltproc --nonet -o %(target)s.temp %(template)s %(target)s && mv %(target)s.temp %(target)s"
                        % { 'target': tagnode.abspath,
                            'template': os.path.join(basedir,"tagmunge.xsl") }))
 
+    if htmlnode and env.get('DOXY_HTML_XSL'):
+        xslfile = env.File(env['DOXY_HTML_XSL'])
+        env.AddPostAction(
+            docs,
+            env.Action(("for html in %s/*.html; do " +
+                        "xsltproc --nonet --html -o $${html}.new %s $${html} && mv $${html}.new $${html}; " +
+                        "done")
+                       % (htmlnode.dir.abspath, xslfile.abspath)))
+        for doc in docs:
+            env.Depends(doc,xslfile)
+
     if xmlnode:
         xrefs = []
         for type in env.get("DOXY_XREF_TYPES",[ "bug", "todo" ]):