You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by mi...@apache.org on 2019/04/29 09:34:15 UTC

[maven-doxia] branch DOXIA-575 updated (02ba076 -> 04070b8)

This is an automated email from the ASF dual-hosted git repository.

michaelo pushed a change to branch DOXIA-575
in repository https://gitbox.apache.org/repos/asf/maven-doxia.git.


 discard 02ba076  [DOXIA-575] Add support for (X)HTML5
     new 04070b8  [DOXIA-575] Add support for (X)HTML5

This update added new revisions after undoing existing revisions.
That is to say, some revisions that were in the old version of the
branch are not in the new version.  This situation occurs
when a user --force pushes a change and generates a repository
containing something like this:

 * -- * -- B -- O -- O -- O   (02ba076)
            \
             N -- N -- N   refs/heads/DOXIA-575 (04070b8)

You should already have received notification emails for all of the O
revisions, and so the following emails describe only the N revisions
from the common base, B.

Any revisions marked "omit" are not gone; other references still
refer to them.  Any revisions marked "discard" are gone forever.

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../maven/doxia/parser/Xhtml5BaseParser.java       |  6 ---
 .../maven/doxia/sink/impl/Xhtml5BaseSink.java      |  6 ---
 .../maven/doxia/parser/Xhtml5BaseParserTest.java   |  5 --
 .../maven/doxia/sink/impl/AbstractSinkTest.java    |  7 +--
 .../maven/doxia/sink/impl/SinkAdapterTest.java     |  4 +-
 .../org/apache/maven/doxia/sink/impl/TextSink.java | 14 +++---
 .../sink/impl/WellformednessCheckingSink.java      |  8 +--
 .../maven/doxia/sink/impl/Xhtml5BaseSinkTest.java  | 11 ++--
 .../doxia/module/xhtml5/AbstractXhtml5Sink.java    |  4 --
 .../maven/doxia/module/xhtml5/Xhtml5Markup.java    |  4 --
 .../maven/doxia/module/xhtml5/Xhtml5Parser.java    |  4 --
 .../doxia/module/xhtml5/Xhtml5ParserModule.java    |  2 -
 .../maven/doxia/module/xhtml5/Xhtml5Sink.java      |  4 --
 .../doxia/module/xhtml5/Xhtml5SinkFactory.java     |  4 --
 .../doxia/module/xhtml5/Xhtml5ParserTest.java      | 12 ++---
 .../maven/doxia/module/xhtml5/Xhtml5SinkTest.java  |  5 --
 .../xhtml5/Xhtml5SinkWithLanguageIdTest.java       |  4 --
 .../src/test/resources/fun.html                    | 58 +++++++++++-----------
 .../src/test/resources/index.xml.vm                |  8 +--
 19 files changed, 56 insertions(+), 114 deletions(-)


[maven-doxia] 01/01: [DOXIA-575] Add support for (X)HTML5

Posted by mi...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

michaelo pushed a commit to branch DOXIA-575
in repository https://gitbox.apache.org/repos/asf/maven-doxia.git

commit 04070b889a2489d9b976b5fc865fd4e4e863b5c8
Author: Graham Leggett <mi...@apache.org>
AuthorDate: Thu Apr 11 16:54:21 2019 +0200

    [DOXIA-575] Add support for (X)HTML5
    
    This closes #16
---
 .../org/apache/maven/doxia/markup/HtmlMarkup.java  | 405 ++++++++++-
 ...{XhtmlBaseParser.java => Xhtml5BaseParser.java} | 810 ++++++++++-----------
 .../apache/maven/doxia/parser/XhtmlBaseParser.java |  38 +-
 .../maven/doxia/sink/impl/RandomAccessSink.java    | 230 +++++-
 .../apache/maven/doxia/sink/impl/SinkAdapter.java  | 228 ++++++
 .../doxia/sink/impl/SinkEventAttributeSet.java     | 187 +++++
 .../{XhtmlBaseSink.java => Xhtml5BaseSink.java}    | 707 +++++++++++++-----
 .../maven/doxia/sink/impl/XhtmlBaseSink.java       | 250 +++++--
 ...seParserTest.java => Xhtml5BaseParserTest.java} | 291 +++++---
 .../maven/doxia/parser/XhtmlBaseParserTest.java    | 135 ++--
 .../maven/doxia/sink/impl/AbstractSinkTest.java    | 436 ++++++++++-
 .../maven/doxia/sink/impl/SinkAdapterTest.java     | 143 +++-
 .../doxia/sink/impl/SinkEventTestingSink.java      | 228 ++++++
 .../maven/doxia/sink/impl/SinkTestDocument.java    |  14 +-
 .../org/apache/maven/doxia/sink/impl/TextSink.java | 228 ++++++
 .../sink/impl/WellformednessCheckingSink.java      | 228 ++++++
 ...mlBaseSinkTest.java => Xhtml5BaseSinkTest.java} | 649 ++++++++++++++---
 .../maven/doxia/sink/impl/XhtmlBaseSinkTest.java   |  16 +-
 .../maven/doxia/xsd/AbstractXmlValidator.java      |  25 +-
 .../org/apache/maven/doxia/module/apt/AptSink.java |  81 ++-
 .../apache/maven/doxia/module/apt/AptSinkTest.java |  98 ++-
 .../doxia/module/confluence/ConfluenceSink.java    |  70 +-
 .../module/confluence/ConfluenceSinkTest.java      | 103 +++
 .../maven/doxia/module/docbook/DocBookSink.java    | 113 ++-
 .../doxia/module/docbook/DocBookSinkTest.java      | 108 ++-
 .../maven/doxia/module/fml/FmlContentParser.java   |   4 +-
 .../apache/maven/doxia/module/fml/FmlParser.java   |   6 +-
 .../maven/doxia/module/fml/FmlParserTest.java      |  12 +-
 .../org/apache/maven/doxia/module/fo/FoSink.java   |  63 +-
 .../apache/maven/doxia/module/fo/FoSinkTest.java   |  94 +++
 .../apache/maven/doxia/module/itext/ITextSink.java |  76 +-
 .../apache/maven/doxia/module/latex/LatexSink.java |  64 +-
 .../maven/doxia/module/latex/LatexSinkTest.java    |  96 +++
 .../doxia/module/markdown/MarkdownParserTest.java  |   8 +-
 .../org/apache/maven/doxia/module/rtf/RtfSink.java |  68 +-
 .../apache/maven/doxia/module/twiki/TWikiSink.java | 132 ++--
 .../maven/doxia/module/twiki/TWikiSinkTest.java    |  96 +++
 .../apache/maven/doxia/module/xdoc/XdocParser.java |   3 +-
 .../maven/doxia/module/xdoc/XdocSinkTest.java      |  96 +++
 .../maven/doxia/module/xhtml/XhtmlParser.java      |   4 +-
 .../maven/doxia/module/xhtml/XhtmlSinkTest.java    |  96 +++
 doxia-modules/doxia-module-xhtml5/pom.xml          |  56 ++
 .../doxia/module/xhtml5/AbstractXhtml5Sink.java    |  30 +
 .../maven/doxia/module/xhtml5/Xhtml5Markup.java    |  36 +
 .../maven/doxia/module/xhtml5/Xhtml5Parser.java}   |  42 +-
 .../doxia/module/xhtml5/Xhtml5ParserModule.java    |  40 +
 .../maven/doxia/module/xhtml5/Xhtml5Sink.java      | 366 ++++++++++
 .../doxia/module/xhtml5/Xhtml5SinkFactory.java     |  47 ++
 .../doxia-module-xhtml5/src/site/site.xml          |  43 ++
 .../doxia/module/xhtml5/Xhtml5IdentityTest.java    |  87 +++
 .../doxia/module/xhtml5/Xhtml5ParserTest.java      | 196 +++++
 .../maven/doxia/module/xhtml5/Xhtml5SinkTest.java} | 150 +++-
 .../xhtml5/Xhtml5SinkWithLanguageIdTest.java       |  45 ++
 .../src/test/resources/download.apt.vm             |  79 ++
 .../src/test/resources/file.with.dot.in.name.xml   |  20 +
 .../src/test/resources/fun.html                    |  66 ++
 .../src/test/resources/index.xml.vm                | 231 ++++++
 .../src/test/resources/test.xhtml                  | 152 ++++
 doxia-modules/pom.xml                              |   1 +
 .../java/org/apache/maven/doxia/sink/Sink.java     | 336 ++++++++-
 .../maven/doxia/sink/SinkEventAttributes.java      |  35 +
 pom.xml                                            |   3 +
 62 files changed, 7580 insertions(+), 1220 deletions(-)

diff --git a/doxia-core/src/main/java/org/apache/maven/doxia/markup/HtmlMarkup.java b/doxia-core/src/main/java/org/apache/maven/doxia/markup/HtmlMarkup.java
index 356e790..da7b1b1 100644
--- a/doxia-core/src/main/java/org/apache/maven/doxia/markup/HtmlMarkup.java
+++ b/doxia-core/src/main/java/org/apache/maven/doxia/markup/HtmlMarkup.java
@@ -25,11 +25,13 @@ import javax.swing.text.html.HTML.Tag;
 /**
  * List of <code>Html</code> tags.
  * <p>
- *   This should contain all valid XHTML 1.0 tags, comprising the tags in
- *   {@link javax.swing.text.html.HTML.Tag} plus several others.
+ * This should contain all valid XHTML 1.0 and HTML5 tags, comprising the tags
+ * in {@link javax.swing.text.html.HTML.Tag} plus several others.
  * </p>
  *
- * @see <a href="http://www.w3.org/TR/html401/index/elements.html">http://www.w3.org/TR/html401/index/elements.html</a>
+ * @see <a href=
+ *      "https://www.w3.org/TR/2012/WD-html-markup-20121011/elements-by-function.html">
+ *      https://www.w3.org/TR/2012/WD-html-markup-20121011/elements-by-function.html</a>
  *
  * @author ltheussl
  * @version $Id$
@@ -101,6 +103,39 @@ public interface HtmlMarkup
     /** Xhtml tag for <code>area</code>. */
     Tag AREA = Tag.AREA;
 
+    /** Html5 tag for <code>article</code>. */
+    Tag ARTICLE = new Tag()
+    {
+        /** {@inheritDoc} */
+        @Override
+        public String toString()
+        {
+            return "article";
+        }
+    };
+
+    /** Html5 tag for <code>aside</code>. */
+    Tag ASIDE = new Tag()
+    {
+        /** {@inheritDoc} */
+        @Override
+        public String toString()
+        {
+            return "aside";
+        }
+    };
+
+    /** Html5 tag for <code>audio</code>. */
+    Tag AUDIO = new Tag()
+    {
+        /** {@inheritDoc} */
+        @Override
+        public String toString()
+        {
+            return "audio";
+        }
+    };
+
     /** Xhtml tag for <code>b</code>. */
     Tag B = Tag.B;
 
@@ -110,6 +145,17 @@ public interface HtmlMarkup
     /** Xhtml tag for <code>basefont</code>. */
     Tag BASEFONT = Tag.BASEFONT;
 
+    /** Html5 tag for <code>bdi</code>. */
+    Tag BDI = new Tag()
+    {
+        /** {@inheritDoc} */
+        @Override
+        public String toString()
+        {
+            return "bdi";
+        }
+    };
+
     /** Xhtml tag for <code>bdo</code>. */
     Tag BDO = new Tag()
     {
@@ -144,6 +190,17 @@ public interface HtmlMarkup
         }
     };
 
+    /** Html5 tag for <code>canvas</code>. */
+    Tag CANVAS = new Tag()
+    {
+        /** {@inheritDoc} */
+        @Override
+        public String toString()
+        {
+            return "canvas";
+        }
+    };
+
     /** Xhtml tag for <code>caption</code>. */
     Tag CAPTION = Tag.CAPTION;
 
@@ -178,6 +235,39 @@ public interface HtmlMarkup
         }
     };
 
+    /** Html5 tag for <code>command</code>. */
+    Tag COMMAND = new Tag()
+    {
+        /** {@inheritDoc} */
+        @Override
+        public String toString()
+        {
+            return "command";
+        }
+    };
+
+    /** Html5 tag for <code>data</code>. */
+    Tag DATA = new Tag()
+    {
+        /** {@inheritDoc} */
+        @Override
+        public String toString()
+        {
+            return "data";
+        }
+    };
+
+    /** Html5 tag for <code>datalist</code>. */
+    Tag DATALIST = new Tag()
+    {
+        /** {@inheritDoc} */
+        @Override
+        public String toString()
+        {
+            return "datalist";
+        }
+    };
+
     /** Xhtml tag for <code>dd</code>. */
     Tag DD = Tag.DD;
 
@@ -192,9 +282,31 @@ public interface HtmlMarkup
         }
     };
 
+    /** Html5 tag for <code>details</code>. */
+    Tag DETAILS = new Tag()
+    {
+        /** {@inheritDoc} */
+        @Override
+        public String toString()
+        {
+            return "details";
+        }
+    };
+
     /** Xhtml tag for <code>dfn</code>. */
     Tag DFN = Tag.DFN;
 
+    /** Html5 tag for <code>dialog</code>. */
+    Tag DIALOG = new Tag()
+    {
+        /** {@inheritDoc} */
+        @Override
+        public String toString()
+        {
+            return "dialog";
+        }
+    };
+
     /** Xhtml tag for <code>dir</code>. */
     Tag DIR = Tag.DIR;
 
@@ -210,6 +322,17 @@ public interface HtmlMarkup
     /** Xhtml tag for <code>em</code>. */
     Tag EM = Tag.EM;
 
+    /** Html5 tag for <code>embed</code>. */
+    Tag EMBED = new Tag()
+    {
+        /** {@inheritDoc} */
+        @Override
+        public String toString()
+        {
+            return "embed";
+        }
+    };
+
     /** Xhtml tag for <code>fieldset</code>. */
     Tag FIELDSET = new Tag()
     {
@@ -221,9 +344,42 @@ public interface HtmlMarkup
         }
     };
 
+    /** Html5 tag for <code>figcaption</code>. */
+    Tag FIGCAPTION = new Tag()
+    {
+        /** {@inheritDoc} */
+        @Override
+        public String toString()
+        {
+            return "figcaption";
+        }
+    };
+
+    /** Html5 tag for <code>figure</code>. */
+    Tag FIGURE = new Tag()
+    {
+        /** {@inheritDoc} */
+        @Override
+        public String toString()
+        {
+            return "figure";
+        }
+    };
+
     /** Xhtml tag for <code>font</code>. */
     Tag FONT = Tag.FONT;
 
+    /** Html5 tag for <code>footer</code>. */
+    Tag FOOTER = new Tag()
+    {
+        /** {@inheritDoc} */
+        @Override
+        public String toString()
+        {
+            return "footer";
+        }
+    };
+
     /** Xhtml tag for <code>form</code>. */
     Tag FORM = Tag.FORM;
 
@@ -254,6 +410,28 @@ public interface HtmlMarkup
     /** Xhtml tag for <code>head</code>. */
     Tag HEAD = Tag.HEAD;
 
+    /** Html5 tag for <code>header</code>. */
+    Tag HEADER = new Tag()
+    {
+        /** {@inheritDoc} */
+        @Override
+        public String toString()
+        {
+            return "header";
+        }
+    };
+
+    /** Html5 tag for <code>hgroup</code>. */
+    Tag HGROUP = new Tag()
+    {
+        /** {@inheritDoc} */
+        @Override
+        public String toString()
+        {
+            return "hgroup";
+        }
+    };
+
     /** Xhtml tag for <code>hr</code>. */
     Tag HR = Tag.HR;
 
@@ -328,12 +506,56 @@ public interface HtmlMarkup
     /** Xhtml tag for <code>map</code>. */
     Tag MAP = Tag.MAP;
 
+    /** Html5 tag for <code>main</code>. */
+    Tag MAIN = new Tag()
+    {
+        /** {@inheritDoc} */
+        @Override
+        public String toString()
+        {
+            return "main";
+        }
+    };
+
+    /** Html5 tag for <code>mark</code>. */
+    Tag MARK = new Tag()
+    {
+        /** {@inheritDoc} */
+        @Override
+        public String toString()
+        {
+            return "mark";
+        }
+    };
+
     /** Xhtml tag for <code>menu</code>. */
     Tag MENU = Tag.MENU;
 
     /** Xhtml tag for <code>meta</code>. */
     Tag META = Tag.META;
 
+    /** Html5 tag for <code>meter</code>. */
+    Tag METER = new Tag()
+    {
+        /** {@inheritDoc} */
+        @Override
+        public String toString()
+        {
+            return "meter";
+        }
+    };
+
+    /** Html5 tag for <code>nav</code>. */
+    Tag NAV = new Tag()
+    {
+        /** {@inheritDoc} */
+        @Override
+        public String toString()
+        {
+            return "nav";
+        }
+    };
+
     /** Xhtml tag for <code>noframes</code>. */
     Tag NOFRAMES = Tag.NOFRAMES;
 
@@ -368,15 +590,48 @@ public interface HtmlMarkup
     /** Xhtml tag for <code>option</code>. */
     Tag OPTION = Tag.OPTION;
 
+    /** Html5 tag for <code>output</code>. */
+    Tag OUTPUT = new Tag()
+    {
+        /** {@inheritDoc} */
+        @Override
+        public String toString()
+        {
+            return "output";
+        }
+    };
+
     /** Xhtml tag for <code>p</code>. */
     Tag P = Tag.P;
 
     /** Xhtml tag for <code>param</code>. */
     Tag PARAM = Tag.PARAM;
 
+    /** Html5 tag for <code>picture</code>. */
+    Tag PICTURE = new Tag()
+    {
+        /** {@inheritDoc} */
+        @Override
+        public String toString()
+        {
+            return "picture";
+        }
+    };
+
     /** Xhtml tag for <code>pre</code>. */
     Tag PRE = Tag.PRE;
 
+    /** Html5 tag for <code>progress</code>. */
+    Tag PROGRESS = new Tag()
+    {
+        /** {@inheritDoc} */
+        @Override
+        public String toString()
+        {
+            return "progress";
+        }
+    };
+
     /** Xhtml tag for <code>q</code>. */
     Tag Q = new Tag()
     {
@@ -388,6 +643,61 @@ public interface HtmlMarkup
         }
     };
 
+    /** Html5 tag for <code>rb</code>. */
+    Tag RB = new Tag()
+    {
+        /** {@inheritDoc} */
+        @Override
+        public String toString()
+        {
+            return "rb";
+        }
+    };
+
+    /** Html5 tag for <code>rp</code>. */
+    Tag RP = new Tag()
+    {
+        /** {@inheritDoc} */
+        @Override
+        public String toString()
+        {
+            return "rp";
+        }
+    };
+
+    /** Html5 tag for <code>rt</code>. */
+    Tag RT = new Tag()
+    {
+        /** {@inheritDoc} */
+        @Override
+        public String toString()
+        {
+            return "rt";
+        }
+    };
+
+    /** Html5 tag for <code>rtc</code>. */
+    Tag RTC = new Tag()
+    {
+        /** {@inheritDoc} */
+        @Override
+        public String toString()
+        {
+            return "rtc";
+        }
+    };
+
+    /** Html5 tag for <code>ruby</code>. */
+    Tag RUBY = new Tag()
+    {
+        /** {@inheritDoc} */
+        @Override
+        public String toString()
+        {
+            return "ruby";
+        }
+    };
+
     /** Xhtml tag for <code>s</code>. */
     Tag S = Tag.S;
 
@@ -397,12 +707,34 @@ public interface HtmlMarkup
     /** Xhtml tag for <code>script</code>. */
     Tag SCRIPT = Tag.SCRIPT;
 
+    /** Html5 tag for <code>section</code>. */
+    Tag SECTION = new Tag()
+    {
+        /** {@inheritDoc} */
+        @Override
+        public String toString()
+        {
+            return "section";
+        }
+    };
+
     /** Xhtml tag for <code>select</code>. */
     Tag SELECT = Tag.SELECT;
 
     /** Xhtml tag for <code>small</code>. */
     Tag SMALL = Tag.SMALL;
 
+    /** Html5 tag for <code>source</code>. */
+    Tag SOURCE = new Tag()
+    {
+        /** {@inheritDoc} */
+        @Override
+        public String toString()
+        {
+            return "source";
+        }
+    };
+
     /** Xhtml tag for <code>span</code>. */
     Tag SPAN = Tag.SPAN;
 
@@ -418,6 +750,17 @@ public interface HtmlMarkup
     /** Xhtml tag for <code>sub</code>. */
     Tag SUB = Tag.SUB;
 
+    /** Html5 tag for <code>summary</code>. */
+    Tag SUMMARY = new Tag()
+    {
+        /** {@inheritDoc} */
+        @Override
+        public String toString()
+        {
+            return "summary";
+        }
+    };
+
     /** Xhtml tag for <code>sup</code>. */
     Tag SUP = Tag.SUP;
 
@@ -438,6 +781,17 @@ public interface HtmlMarkup
     /** Xhtml tag for <code>td</code>. */
     Tag TD = Tag.TD;
 
+    /** Html5 tag for <code>template</code>. */
+    Tag TEMPLATE = new Tag()
+    {
+        /** {@inheritDoc} */
+        @Override
+        public String toString()
+        {
+            return "template";
+        }
+    };
+
     /** Xhtml tag for <code>textarea</code>. */
     Tag TEXTAREA = Tag.TEXTAREA;
 
@@ -466,12 +820,34 @@ public interface HtmlMarkup
         }
     };
 
+    /** Html5 tag for <code>time</code>. */
+    Tag TIME = new Tag()
+    {
+        /** {@inheritDoc} */
+        @Override
+        public String toString()
+        {
+            return "time";
+        }
+    };
+
     /** Xhtml tag for <code>title</code>. */
     Tag TITLE = Tag.TITLE;
 
     /** Xhtml tag for <code>tr</code>. */
     Tag TR = Tag.TR;
 
+    /** Html5 tag for <code>track</code>. */
+    Tag TRACK = new Tag()
+    {
+        /** {@inheritDoc} */
+        @Override
+        public String toString()
+        {
+            return "track";
+        }
+    };
+
     /** Xhtml tag for <code>tt</code>. */
     Tag TT = Tag.TT;
 
@@ -483,4 +859,27 @@ public interface HtmlMarkup
 
     /** Xhtml tag for <code>var</code>. */
     Tag VAR = Tag.VAR ;
+
+    /** Html5 tag for <code>video</code>. */
+    Tag VIDEO = new Tag()
+    {
+        /** {@inheritDoc} */
+        @Override
+        public String toString()
+        {
+            return "video";
+        }
+    };
+
+    /** Html5 tag for <code>wbr</code>. */
+    Tag WBR = new Tag()
+    {
+        /** {@inheritDoc} */
+        @Override
+        public String toString()
+        {
+            return "wbr";
+        }
+    };
+
 }
diff --git a/doxia-core/src/main/java/org/apache/maven/doxia/parser/XhtmlBaseParser.java b/doxia-core/src/main/java/org/apache/maven/doxia/parser/Xhtml5BaseParser.java
similarity index 53%
copy from doxia-core/src/main/java/org/apache/maven/doxia/parser/XhtmlBaseParser.java
copy to doxia-core/src/main/java/org/apache/maven/doxia/parser/Xhtml5BaseParser.java
index c13fa1a..70dac8d 100644
--- a/doxia-core/src/main/java/org/apache/maven/doxia/parser/XhtmlBaseParser.java
+++ b/doxia-core/src/main/java/org/apache/maven/doxia/parser/Xhtml5BaseParser.java
@@ -23,6 +23,7 @@ import java.io.Reader;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
+import java.util.Stack;
 import java.util.TreeSet;
 
 import javax.swing.text.html.HTML.Attribute;
@@ -33,20 +34,14 @@ import org.apache.maven.doxia.sink.Sink;
 import org.apache.maven.doxia.sink.SinkEventAttributes;
 import org.apache.maven.doxia.sink.impl.SinkEventAttributeSet;
 import org.apache.maven.doxia.util.DoxiaUtils;
-
 import org.codehaus.plexus.util.StringUtils;
 import org.codehaus.plexus.util.xml.pull.XmlPullParser;
 import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
 
 /**
- * Common base parser for xhtml events.
- *
- * @author <a href="mailto:jason@maven.org">Jason van Zyl</a>
- * @author ltheussl
- * @version $Id$
- * @since 1.1
+ * Common base parser for xhtml5 events.
  */
-public class XhtmlBaseParser
+public class Xhtml5BaseParser
     extends AbstractXmlParser
         implements HtmlMarkup
 {
@@ -68,18 +63,18 @@ public class XhtmlBaseParser
     /** Counts section level. */
     private int sectionLevel;
 
+    /** Counts heading level. */
+    private int headingLevel;
+
     /** Verbatim flag, true whenever we are inside a &lt;pre&gt; tag. */
     private boolean inVerbatim;
 
-    /** Used to recognize the case of img inside figure. */
-    private boolean inFigure;
+    /** Used to keep track of closing tags for content events */
+    private Stack<String> divStack = new Stack<String>();
 
     /** Used to wrap the definedTerm with its definition, even when one is omitted */
     boolean hasDefinitionListItem = false;
 
-    /** Decoration properties, eg for texts. */
-    private final SinkEventAttributeSet decoration = new SinkEventAttributeSet();
-
     /** Map of warn messages with a String as key to describe the error type and a Set as value.
      * Using to reduce warn messages. */
     private Map<String, Set<String>> warnMessages;
@@ -107,7 +102,7 @@ public class XhtmlBaseParser
     /**
      * {@inheritDoc}
      *
-     * Adds all XHTML (HTML 4.0) entities to the parser so that they can be recognized and resolved
+     * Adds all XHTML (HTML 5.2) entities to the parser so that they can be recognized and resolved
      * without additional DTD.
      */
     @Override
@@ -115,288 +110,27 @@ public class XhtmlBaseParser
         throws XmlPullParserException
     {
         super.initXmlParser( parser );
-
-        // the entities taken from org.apache.maven.doxia.document.io.xpp3.DocumentXpp3Reader,
-        // which is generated automatically
-
-        // ----------------------------------------------------------------------
-        // Latin 1 entities
-        // ----------------------------------------------------------------------
-
-        parser.defineEntityReplacementText( "nbsp", "\u00a0" );
-        parser.defineEntityReplacementText( "iexcl", "\u00a1" );
-        parser.defineEntityReplacementText( "cent", "\u00a2" );
-        parser.defineEntityReplacementText( "pound", "\u00a3" );
-        parser.defineEntityReplacementText( "curren", "\u00a4" );
-        parser.defineEntityReplacementText( "yen", "\u00a5" );
-        parser.defineEntityReplacementText( "brvbar", "\u00a6" );
-        parser.defineEntityReplacementText( "sect", "\u00a7" );
-        parser.defineEntityReplacementText( "uml", "\u00a8" );
-        parser.defineEntityReplacementText( "copy", "\u00a9" );
-        parser.defineEntityReplacementText( "ordf", "\u00aa" );
-        parser.defineEntityReplacementText( "laquo", "\u00ab" );
-        parser.defineEntityReplacementText( "not", "\u00ac" );
-        parser.defineEntityReplacementText( "shy", "\u00ad" );
-        parser.defineEntityReplacementText( "reg", "\u00ae" );
-        parser.defineEntityReplacementText( "macr", "\u00af" );
-        parser.defineEntityReplacementText( "deg", "\u00b0" );
-        parser.defineEntityReplacementText( "plusmn", "\u00b1" );
-        parser.defineEntityReplacementText( "sup2", "\u00b2" );
-        parser.defineEntityReplacementText( "sup3", "\u00b3" );
-        parser.defineEntityReplacementText( "acute", "\u00b4" );
-        parser.defineEntityReplacementText( "micro", "\u00b5" );
-        parser.defineEntityReplacementText( "para", "\u00b6" );
-        parser.defineEntityReplacementText( "middot", "\u00b7" );
-        parser.defineEntityReplacementText( "cedil", "\u00b8" );
-        parser.defineEntityReplacementText( "sup1", "\u00b9" );
-        parser.defineEntityReplacementText( "ordm", "\u00ba" );
-        parser.defineEntityReplacementText( "raquo", "\u00bb" );
-        parser.defineEntityReplacementText( "frac14", "\u00bc" );
-        parser.defineEntityReplacementText( "frac12", "\u00bd" );
-        parser.defineEntityReplacementText( "frac34", "\u00be" );
-        parser.defineEntityReplacementText( "iquest", "\u00bf" );
-        parser.defineEntityReplacementText( "Agrave", "\u00c0" );
-        parser.defineEntityReplacementText( "Aacute", "\u00c1" );
-        parser.defineEntityReplacementText( "Acirc", "\u00c2" );
-        parser.defineEntityReplacementText( "Atilde", "\u00c3" );
-        parser.defineEntityReplacementText( "Auml", "\u00c4" );
-        parser.defineEntityReplacementText( "Aring", "\u00c5" );
-        parser.defineEntityReplacementText( "AElig", "\u00c6" );
-        parser.defineEntityReplacementText( "Ccedil", "\u00c7" );
-        parser.defineEntityReplacementText( "Egrave", "\u00c8" );
-        parser.defineEntityReplacementText( "Eacute", "\u00c9" );
-        parser.defineEntityReplacementText( "Ecirc", "\u00ca" );
-        parser.defineEntityReplacementText( "Euml", "\u00cb" );
-        parser.defineEntityReplacementText( "Igrave", "\u00cc" );
-        parser.defineEntityReplacementText( "Iacute", "\u00cd" );
-        parser.defineEntityReplacementText( "Icirc", "\u00ce" );
-        parser.defineEntityReplacementText( "Iuml", "\u00cf" );
-        parser.defineEntityReplacementText( "ETH", "\u00d0" );
-        parser.defineEntityReplacementText( "Ntilde", "\u00d1" );
-        parser.defineEntityReplacementText( "Ograve", "\u00d2" );
-        parser.defineEntityReplacementText( "Oacute", "\u00d3" );
-        parser.defineEntityReplacementText( "Ocirc", "\u00d4" );
-        parser.defineEntityReplacementText( "Otilde", "\u00d5" );
-        parser.defineEntityReplacementText( "Ouml", "\u00d6" );
-        parser.defineEntityReplacementText( "times", "\u00d7" );
-        parser.defineEntityReplacementText( "Oslash", "\u00d8" );
-        parser.defineEntityReplacementText( "Ugrave", "\u00d9" );
-        parser.defineEntityReplacementText( "Uacute", "\u00da" );
-        parser.defineEntityReplacementText( "Ucirc", "\u00db" );
-        parser.defineEntityReplacementText( "Uuml", "\u00dc" );
-        parser.defineEntityReplacementText( "Yacute", "\u00dd" );
-        parser.defineEntityReplacementText( "THORN", "\u00de" );
-        parser.defineEntityReplacementText( "szlig", "\u00df" );
-        parser.defineEntityReplacementText( "agrave", "\u00e0" );
-        parser.defineEntityReplacementText( "aacute", "\u00e1" );
-        parser.defineEntityReplacementText( "acirc", "\u00e2" );
-        parser.defineEntityReplacementText( "atilde", "\u00e3" );
-        parser.defineEntityReplacementText( "auml", "\u00e4" );
-        parser.defineEntityReplacementText( "aring", "\u00e5" );
-        parser.defineEntityReplacementText( "aelig", "\u00e6" );
-        parser.defineEntityReplacementText( "ccedil", "\u00e7" );
-        parser.defineEntityReplacementText( "egrave", "\u00e8" );
-        parser.defineEntityReplacementText( "eacute", "\u00e9" );
-        parser.defineEntityReplacementText( "ecirc", "\u00ea" );
-        parser.defineEntityReplacementText( "euml", "\u00eb" );
-        parser.defineEntityReplacementText( "igrave", "\u00ec" );
-        parser.defineEntityReplacementText( "iacute", "\u00ed" );
-        parser.defineEntityReplacementText( "icirc", "\u00ee" );
-        parser.defineEntityReplacementText( "iuml", "\u00ef" );
-        parser.defineEntityReplacementText( "eth", "\u00f0" );
-        parser.defineEntityReplacementText( "ntilde", "\u00f1" );
-        parser.defineEntityReplacementText( "ograve", "\u00f2" );
-        parser.defineEntityReplacementText( "oacute", "\u00f3" );
-        parser.defineEntityReplacementText( "ocirc", "\u00f4" );
-        parser.defineEntityReplacementText( "otilde", "\u00f5" );
-        parser.defineEntityReplacementText( "ouml", "\u00f6" );
-        parser.defineEntityReplacementText( "divide", "\u00f7" );
-        parser.defineEntityReplacementText( "oslash", "\u00f8" );
-        parser.defineEntityReplacementText( "ugrave", "\u00f9" );
-        parser.defineEntityReplacementText( "uacute", "\u00fa" );
-        parser.defineEntityReplacementText( "ucirc", "\u00fb" );
-        parser.defineEntityReplacementText( "uuml", "\u00fc" );
-        parser.defineEntityReplacementText( "yacute", "\u00fd" );
-        parser.defineEntityReplacementText( "thorn", "\u00fe" );
-        parser.defineEntityReplacementText( "yuml", "\u00ff" );
-
-        // ----------------------------------------------------------------------
-        // Special entities
-        // ----------------------------------------------------------------------
-
-        parser.defineEntityReplacementText( "OElig", "\u0152" );
-        parser.defineEntityReplacementText( "oelig", "\u0153" );
-        parser.defineEntityReplacementText( "Scaron", "\u0160" );
-        parser.defineEntityReplacementText( "scaron", "\u0161" );
-        parser.defineEntityReplacementText( "Yuml", "\u0178" );
-        parser.defineEntityReplacementText( "circ", "\u02c6" );
-        parser.defineEntityReplacementText( "tilde", "\u02dc" );
-        parser.defineEntityReplacementText( "ensp", "\u2002" );
-        parser.defineEntityReplacementText( "emsp", "\u2003" );
-        parser.defineEntityReplacementText( "thinsp", "\u2009" );
-        parser.defineEntityReplacementText( "zwnj", "\u200c" );
-        parser.defineEntityReplacementText( "zwj", "\u200d" );
-        parser.defineEntityReplacementText( "lrm", "\u200e" );
-        parser.defineEntityReplacementText( "rlm", "\u200f" );
-        parser.defineEntityReplacementText( "ndash", "\u2013" );
-        parser.defineEntityReplacementText( "mdash", "\u2014" );
-        parser.defineEntityReplacementText( "lsquo", "\u2018" );
-        parser.defineEntityReplacementText( "rsquo", "\u2019" );
-        parser.defineEntityReplacementText( "sbquo", "\u201a" );
-        parser.defineEntityReplacementText( "ldquo", "\u201c" );
-        parser.defineEntityReplacementText( "rdquo", "\u201d" );
-        parser.defineEntityReplacementText( "bdquo", "\u201e" );
-        parser.defineEntityReplacementText( "dagger", "\u2020" );
-        parser.defineEntityReplacementText( "Dagger", "\u2021" );
-        parser.defineEntityReplacementText( "permil", "\u2030" );
-        parser.defineEntityReplacementText( "lsaquo", "\u2039" );
-        parser.defineEntityReplacementText( "rsaquo", "\u203a" );
-        parser.defineEntityReplacementText( "euro", "\u20ac" );
-
-        // ----------------------------------------------------------------------
-        // Symbol entities
-        // ----------------------------------------------------------------------
-
-        parser.defineEntityReplacementText( "fnof", "\u0192" );
-        parser.defineEntityReplacementText( "Alpha", "\u0391" );
-        parser.defineEntityReplacementText( "Beta", "\u0392" );
-        parser.defineEntityReplacementText( "Gamma", "\u0393" );
-        parser.defineEntityReplacementText( "Delta", "\u0394" );
-        parser.defineEntityReplacementText( "Epsilon", "\u0395" );
-        parser.defineEntityReplacementText( "Zeta", "\u0396" );
-        parser.defineEntityReplacementText( "Eta", "\u0397" );
-        parser.defineEntityReplacementText( "Theta", "\u0398" );
-        parser.defineEntityReplacementText( "Iota", "\u0399" );
-        parser.defineEntityReplacementText( "Kappa", "\u039a" );
-        parser.defineEntityReplacementText( "Lambda", "\u039b" );
-        parser.defineEntityReplacementText( "Mu", "\u039c" );
-        parser.defineEntityReplacementText( "Nu", "\u039d" );
-        parser.defineEntityReplacementText( "Xi", "\u039e" );
-        parser.defineEntityReplacementText( "Omicron", "\u039f" );
-        parser.defineEntityReplacementText( "Pi", "\u03a0" );
-        parser.defineEntityReplacementText( "Rho", "\u03a1" );
-        parser.defineEntityReplacementText( "Sigma", "\u03a3" );
-        parser.defineEntityReplacementText( "Tau", "\u03a4" );
-        parser.defineEntityReplacementText( "Upsilon", "\u03a5" );
-        parser.defineEntityReplacementText( "Phi", "\u03a6" );
-        parser.defineEntityReplacementText( "Chi", "\u03a7" );
-        parser.defineEntityReplacementText( "Psi", "\u03a8" );
-        parser.defineEntityReplacementText( "Omega", "\u03a9" );
-        parser.defineEntityReplacementText( "alpha", "\u03b1" );
-        parser.defineEntityReplacementText( "beta", "\u03b2" );
-        parser.defineEntityReplacementText( "gamma", "\u03b3" );
-        parser.defineEntityReplacementText( "delta", "\u03b4" );
-        parser.defineEntityReplacementText( "epsilon", "\u03b5" );
-        parser.defineEntityReplacementText( "zeta", "\u03b6" );
-        parser.defineEntityReplacementText( "eta", "\u03b7" );
-        parser.defineEntityReplacementText( "theta", "\u03b8" );
-        parser.defineEntityReplacementText( "iota", "\u03b9" );
-        parser.defineEntityReplacementText( "kappa", "\u03ba" );
-        parser.defineEntityReplacementText( "lambda", "\u03bb" );
-        parser.defineEntityReplacementText( "mu", "\u03bc" );
-        parser.defineEntityReplacementText( "nu", "\u03bd" );
-        parser.defineEntityReplacementText( "xi", "\u03be" );
-        parser.defineEntityReplacementText( "omicron", "\u03bf" );
-        parser.defineEntityReplacementText( "pi", "\u03c0" );
-        parser.defineEntityReplacementText( "rho", "\u03c1" );
-        parser.defineEntityReplacementText( "sigmaf", "\u03c2" );
-        parser.defineEntityReplacementText( "sigma", "\u03c3" );
-        parser.defineEntityReplacementText( "tau", "\u03c4" );
-        parser.defineEntityReplacementText( "upsilon", "\u03c5" );
-        parser.defineEntityReplacementText( "phi", "\u03c6" );
-        parser.defineEntityReplacementText( "chi", "\u03c7" );
-        parser.defineEntityReplacementText( "psi", "\u03c8" );
-        parser.defineEntityReplacementText( "omega", "\u03c9" );
-        parser.defineEntityReplacementText( "thetasym", "\u03d1" );
-        parser.defineEntityReplacementText( "upsih", "\u03d2" );
-        parser.defineEntityReplacementText( "piv", "\u03d6" );
-        parser.defineEntityReplacementText( "bull", "\u2022" );
-        parser.defineEntityReplacementText( "hellip", "\u2026" );
-        parser.defineEntityReplacementText( "prime", "\u2032" );
-        parser.defineEntityReplacementText( "Prime", "\u2033" );
-        parser.defineEntityReplacementText( "oline", "\u203e" );
-        parser.defineEntityReplacementText( "frasl", "\u2044" );
-        parser.defineEntityReplacementText( "weierp", "\u2118" );
-        parser.defineEntityReplacementText( "image", "\u2111" );
-        parser.defineEntityReplacementText( "real", "\u211c" );
-        parser.defineEntityReplacementText( "trade", "\u2122" );
-        parser.defineEntityReplacementText( "alefsym", "\u2135" );
-        parser.defineEntityReplacementText( "larr", "\u2190" );
-        parser.defineEntityReplacementText( "uarr", "\u2191" );
-        parser.defineEntityReplacementText( "rarr", "\u2192" );
-        parser.defineEntityReplacementText( "darr", "\u2193" );
-        parser.defineEntityReplacementText( "harr", "\u2194" );
-        parser.defineEntityReplacementText( "crarr", "\u21b5" );
-        parser.defineEntityReplacementText( "lArr", "\u21d0" );
-        parser.defineEntityReplacementText( "uArr", "\u21d1" );
-        parser.defineEntityReplacementText( "rArr", "\u21d2" );
-        parser.defineEntityReplacementText( "dArr", "\u21d3" );
-        parser.defineEntityReplacementText( "hArr", "\u21d4" );
-        parser.defineEntityReplacementText( "forall", "\u2200" );
-        parser.defineEntityReplacementText( "part", "\u2202" );
-        parser.defineEntityReplacementText( "exist", "\u2203" );
-        parser.defineEntityReplacementText( "empty", "\u2205" );
-        parser.defineEntityReplacementText( "nabla", "\u2207" );
-        parser.defineEntityReplacementText( "isin", "\u2208" );
-        parser.defineEntityReplacementText( "notin", "\u2209" );
-        parser.defineEntityReplacementText( "ni", "\u220b" );
-        parser.defineEntityReplacementText( "prod", "\u220f" );
-        parser.defineEntityReplacementText( "sum", "\u2211" );
-        parser.defineEntityReplacementText( "minus", "\u2212" );
-        parser.defineEntityReplacementText( "lowast", "\u2217" );
-        parser.defineEntityReplacementText( "radic", "\u221a" );
-        parser.defineEntityReplacementText( "prop", "\u221d" );
-        parser.defineEntityReplacementText( "infin", "\u221e" );
-        parser.defineEntityReplacementText( "ang", "\u2220" );
-        parser.defineEntityReplacementText( "and", "\u2227" );
-        parser.defineEntityReplacementText( "or", "\u2228" );
-        parser.defineEntityReplacementText( "cap", "\u2229" );
-        parser.defineEntityReplacementText( "cup", "\u222a" );
-        parser.defineEntityReplacementText( "int", "\u222b" );
-        parser.defineEntityReplacementText( "there4", "\u2234" );
-        parser.defineEntityReplacementText( "sim", "\u223c" );
-        parser.defineEntityReplacementText( "cong", "\u2245" );
-        parser.defineEntityReplacementText( "asymp", "\u2248" );
-        parser.defineEntityReplacementText( "ne", "\u2260" );
-        parser.defineEntityReplacementText( "equiv", "\u2261" );
-        parser.defineEntityReplacementText( "le", "\u2264" );
-        parser.defineEntityReplacementText( "ge", "\u2265" );
-        parser.defineEntityReplacementText( "sub", "\u2282" );
-        parser.defineEntityReplacementText( "sup", "\u2283" );
-        parser.defineEntityReplacementText( "nsub", "\u2284" );
-        parser.defineEntityReplacementText( "sube", "\u2286" );
-        parser.defineEntityReplacementText( "supe", "\u2287" );
-        parser.defineEntityReplacementText( "oplus", "\u2295" );
-        parser.defineEntityReplacementText( "otimes", "\u2297" );
-        parser.defineEntityReplacementText( "perp", "\u22a5" );
-        parser.defineEntityReplacementText( "sdot", "\u22c5" );
-        parser.defineEntityReplacementText( "lceil", "\u2308" );
-        parser.defineEntityReplacementText( "rceil", "\u2309" );
-        parser.defineEntityReplacementText( "lfloor", "\u230a" );
-        parser.defineEntityReplacementText( "rfloor", "\u230b" );
-        parser.defineEntityReplacementText( "lang", "\u2329" );
-        parser.defineEntityReplacementText( "rang", "\u232a" );
-        parser.defineEntityReplacementText( "loz", "\u25ca" );
-        parser.defineEntityReplacementText( "spades", "\u2660" );
-        parser.defineEntityReplacementText( "clubs", "\u2663" );
-        parser.defineEntityReplacementText( "hearts", "\u2665" );
-        parser.defineEntityReplacementText( "diams", "\u2666" );
     }
 
     /**
      * <p>
-     *   Goes through a common list of possible html start tags. These include only tags that can go into
-     *   the body of a xhtml document and so should be re-usable by different xhtml-based parsers.
+     *   Goes through a common list of possible html5 start tags. These include only tags that can go into
+     *   the body of an xhtml5 document and so should be re-usable by different xhtml-based parsers.
      * </p>
      * <p>
      *   The currently handled tags are:
      * </p>
      * <p>
      *   <code>
-     *      &lt;h2&gt;, &lt;h3&gt;, &lt;h4&gt;, &lt;h5&gt;, &lt;h6&gt;, &lt;p&gt;, &lt;pre&gt;,
-     *      &lt;ul&gt;, &lt;ol&gt;, &lt;li&gt;, &lt;dl&gt;, &lt;dt&gt;, &lt;dd&gt;, &lt;b&gt;, &lt;strong&gt;,
-     *      &lt;i&gt;, &lt;em&gt;, &lt;code&gt;, &lt;samp&gt;, &lt;tt&gt;, &lt;a&gt;, &lt;table&gt;, &lt;tr&gt;,
-     *      &lt;th&gt;, &lt;td&gt;, &lt;caption&gt;, &lt;br/&gt;, &lt;hr/&gt;, &lt;img/&gt;.
+     *      &lt;article&gt;, &lt;nav&gt;, &lt;aside&gt;, &lt;section&gt;, &lt;h2&gt;, &lt;h3&gt;, &lt;h4&gt;,
+     *      &lt;h5&gt;, &lt;h6&gt;, &lt;header&gt;, &lt;main&gt;, &lt;footer&gt;, &lt;em&gt;, &lt;strong&gt;,
+     *      &lt;small&gt;, &lt;s&gt;, &lt;cite&gt;, &lt;q&gt;, &lt;dfn&gt;, &lt;abbr&gt;, &lt;i&gt;,
+     *      &lt;b&gt;, &lt;code&gt;, &lt;samp&gt;, &lt;kbd&gt;, &lt;sub&gt;, &lt;sup&gt;, &lt;u&gt;,
+     *      &lt;mark&gt;, &lt;ruby&gt;, &lt;rb&gt;, &lt;rt&gt;, &lt;rtc&gt;, &lt;rp&gt;, &lt;bdi&gt;,
+     *      &lt;bdo&gt;, &lt;span&gt;, &lt;ins&gt;, &lt;del&gt;, &lt;p&gt;, &lt;pre&gt;, &lt;ul&gt;,
+     *      &lt;ol&gt;, &lt;li&gt;, &lt;dl&gt;, &lt;dt&gt;, &lt;dd&gt;, &lt;a&gt;, &lt;table&gt;,
+     *      &lt;tr&gt;, &lt;th&gt;, &lt;td&gt;, &lt;caption&gt;, &lt;br/&gt;, &lt;wbr/&gt;, &lt;hr/&gt;,
+     *      &lt;img/&gt;.
      *   </code>
      * </p>
      *
@@ -410,43 +144,194 @@ public class XhtmlBaseParser
 
         SinkEventAttributeSet attribs = getAttributesFromParser( parser );
 
-        if ( parser.getName().equals( HtmlMarkup.H2.toString() ) )
+        if ( parser.getName().equals( HtmlMarkup.ARTICLE.toString() ) )
+        {
+            sink.article( attribs );
+        }
+        else if ( parser.getName().equals( HtmlMarkup.NAV.toString() ) )
+        {
+            sink.navigation( attribs );
+        }
+        else if ( parser.getName().equals( HtmlMarkup.ASIDE.toString() ) )
+        {
+            sink.sidebar( attribs );
+        }
+        else if ( parser.getName().equals( HtmlMarkup.SECTION.toString() ) )
+        {
+            handleSectionStart( sink, attribs );
+        }
+        else if ( parser.getName().equals( HtmlMarkup.H2.toString() ) )
         {
-            handleSectionStart( sink, Sink.SECTION_LEVEL_1, attribs );
+            handleHeadingStart( sink, Sink.SECTION_LEVEL_1, attribs );
         }
         else if ( parser.getName().equals( HtmlMarkup.H3.toString() ) )
         {
-            handleSectionStart( sink, Sink.SECTION_LEVEL_2, attribs );
+            handleHeadingStart( sink, Sink.SECTION_LEVEL_2, attribs );
         }
         else if ( parser.getName().equals( HtmlMarkup.H4.toString() ) )
         {
-            handleSectionStart( sink, Sink.SECTION_LEVEL_3, attribs );
+            handleHeadingStart( sink, Sink.SECTION_LEVEL_3, attribs );
         }
         else if ( parser.getName().equals( HtmlMarkup.H5.toString() ) )
         {
-            handleSectionStart( sink, Sink.SECTION_LEVEL_4, attribs );
+            handleHeadingStart( sink, Sink.SECTION_LEVEL_4, attribs );
         }
         else if ( parser.getName().equals( HtmlMarkup.H6.toString() ) )
         {
-            handleSectionStart( sink, Sink.SECTION_LEVEL_5, attribs );
+            handleHeadingStart( sink, Sink.SECTION_LEVEL_5, attribs );
         }
-        else if ( parser.getName().equals( HtmlMarkup.U.toString() ) )
+        else if ( parser.getName().equals( HtmlMarkup.HEADER.toString() ) )
         {
-            decoration.addAttribute( SinkEventAttributes.DECORATION, "underline" );
+            sink.header( attribs );
         }
-        else if ( parser.getName().equals( HtmlMarkup.S.toString() )
-                || parser.getName().equals( HtmlMarkup.STRIKE.toString() )
-                || parser.getName().equals( "del" ) )
+        else if ( parser.getName().equals( HtmlMarkup.MAIN.toString() ) )
         {
-            decoration.addAttribute( SinkEventAttributes.DECORATION, "line-through" );
+            sink.content( attribs );
         }
-        else if ( parser.getName().equals( HtmlMarkup.SUB.toString() ) )
+        else if ( parser.getName().equals( HtmlMarkup.FOOTER.toString() ) )
+        {
+            sink.footer( attribs );
+        }
+        else if ( parser.getName().equals( HtmlMarkup.EM.toString() ) )
+        {
+            attribs.addAttributes( SinkEventAttributeSet.Semantics.EMPHASIS );
+            sink.inline( attribs );
+        }
+        else if ( parser.getName().equals( HtmlMarkup.STRONG.toString() ) )
+        {
+            attribs.addAttributes( SinkEventAttributeSet.Semantics.STRONG );
+            sink.inline( attribs );
+        }
+        else if ( parser.getName().equals( HtmlMarkup.SMALL.toString() ) )
+        {
+            attribs.addAttributes( SinkEventAttributeSet.Semantics.SMALL );
+            sink.inline( attribs );
+        }
+        else if ( parser.getName().equals( HtmlMarkup.S.toString() ) )
+        {
+            attribs.addAttributes( SinkEventAttributeSet.Semantics.LINE_THROUGH );
+            sink.inline( attribs );
+            /* deprecated line-through support */
+        }
+        else if ( parser.getName().equals( HtmlMarkup.CITE.toString() ) )
+        {
+            attribs.addAttributes( SinkEventAttributeSet.Semantics.CITATION );
+            sink.inline( attribs );
+        }
+        else if ( parser.getName().equals( HtmlMarkup.Q.toString() ) )
+        {
+            attribs.addAttributes( SinkEventAttributeSet.Semantics.QUOTE );
+            sink.inline( attribs );
+        }
+        else if ( parser.getName().equals( HtmlMarkup.DFN.toString() ) )
+        {
+            attribs.addAttributes( SinkEventAttributeSet.Semantics.DEFINITION );
+            sink.inline( attribs );
+        }
+        else if ( parser.getName().equals( HtmlMarkup.ABBR.toString() ) )
+        {
+            attribs.addAttributes( SinkEventAttributeSet.Semantics.ABBREVIATION );
+            sink.inline( attribs );
+        }
+        else if ( parser.getName().equals( HtmlMarkup.I.toString() ) )
+        {
+            attribs.addAttributes( SinkEventAttributeSet.Semantics.ITALIC );
+            sink.inline( attribs );
+        }
+        else if ( parser.getName().equals( HtmlMarkup.B.toString() ) )
+        {
+            attribs.addAttributes( SinkEventAttributeSet.Semantics.BOLD );
+            sink.inline( attribs );
+        }
+        else if ( parser.getName().equals( HtmlMarkup.CODE.toString() ) )
+        {
+            attribs.addAttributes( SinkEventAttributeSet.Semantics.CODE );
+            sink.inline( attribs );
+        }
+        else if ( parser.getName().equals( HtmlMarkup.VAR.toString() ) )
         {
-            decoration.addAttribute( SinkEventAttributes.VALIGN, "sub" );
+            attribs.addAttributes( SinkEventAttributeSet.Semantics.VARIABLE );
+            sink.inline( attribs );
+        }
+        else if ( parser.getName().equals( HtmlMarkup.SAMP.toString() ) )
+        {
+            attribs.addAttributes( SinkEventAttributeSet.Semantics.SAMPLE );
+            sink.inline( attribs );
+        }
+        else if ( parser.getName().equals( HtmlMarkup.KBD.toString() ) )
+        {
+            attribs.addAttributes( SinkEventAttributeSet.Semantics.KEYBOARD );
+            sink.inline( attribs );
         }
         else if ( parser.getName().equals( HtmlMarkup.SUP.toString() ) )
         {
-            decoration.addAttribute( SinkEventAttributes.VALIGN, "sup" );
+            attribs.addAttributes( SinkEventAttributeSet.Semantics.SUPERSCRIPT );
+            sink.inline( attribs );
+        }
+        else if ( parser.getName().equals( HtmlMarkup.SUB.toString() ) )
+        {
+            attribs.addAttributes( SinkEventAttributeSet.Semantics.SUBSCRIPT );
+            sink.inline( attribs );
+        }
+        else if ( parser.getName().equals( HtmlMarkup.U.toString() ) )
+        {
+            attribs.addAttributes( SinkEventAttributeSet.Semantics.ANNOTATION );
+            sink.inline( attribs );
+        }
+        else if ( parser.getName().equals( HtmlMarkup.MARK.toString() ) )
+        {
+            attribs.addAttributes( SinkEventAttributeSet.Semantics.HIGHLIGHT );
+            sink.inline( attribs );
+        }
+        else if ( parser.getName().equals( HtmlMarkup.RUBY.toString() ) )
+        {
+            attribs.addAttributes( SinkEventAttributeSet.Semantics.RUBY );
+            sink.inline( attribs );
+        }
+        else if ( parser.getName().equals( HtmlMarkup.RB.toString() ) )
+        {
+            attribs.addAttributes( SinkEventAttributeSet.Semantics.RUBY_BASE );
+            sink.inline( attribs );
+        }
+        else if ( parser.getName().equals( HtmlMarkup.RT.toString() ) )
+        {
+            attribs.addAttributes( SinkEventAttributeSet.Semantics.RUBY_TEXT );
+            sink.inline( attribs );
+        }
+        else if ( parser.getName().equals( HtmlMarkup.RTC.toString() ) )
+        {
+            attribs.addAttributes( SinkEventAttributeSet.Semantics.RUBY_TEXT_CONTAINER );
+            sink.inline( attribs );
+        }
+        else if ( parser.getName().equals( HtmlMarkup.RP.toString() ) )
+        {
+            attribs.addAttributes( SinkEventAttributeSet.Semantics.RUBY_PARANTHESES );
+            sink.inline( attribs );
+        }
+        else if ( parser.getName().equals( HtmlMarkup.BDI.toString() ) )
+        {
+            attribs.addAttributes( SinkEventAttributeSet.Semantics.BIDIRECTIONAL_ISOLATION );
+            sink.inline( attribs );
+        }
+        else if ( parser.getName().equals( HtmlMarkup.BDO.toString() ) )
+        {
+            attribs.addAttributes( SinkEventAttributeSet.Semantics.BIDIRECTIONAL_OVERRIDE );
+            sink.inline( attribs );
+        }
+        else if ( parser.getName().equals( HtmlMarkup.SPAN.toString() ) )
+        {
+            attribs.addAttributes( SinkEventAttributeSet.Semantics.PHRASE );
+            sink.inline( attribs );
+        }
+        else if ( parser.getName().equals( HtmlMarkup.INS.toString() ) )
+        {
+            attribs.addAttributes( SinkEventAttributeSet.Semantics.INSERT );
+            sink.inline( attribs );
+        }
+        else if ( parser.getName().equals( HtmlMarkup.DEL.toString() ) )
+        {
+            attribs.addAttributes( SinkEventAttributeSet.Semantics.DELETE );
+            sink.inline( attribs );
         }
         else if ( parser.getName().equals( HtmlMarkup.P.toString() ) )
         {
@@ -454,7 +339,7 @@ public class XhtmlBaseParser
         }
         else if ( parser.getName().equals( HtmlMarkup.DIV.toString() ) )
         {
-            visited = handleDivStart( parser, attribs, sink );
+            handleDivStart( parser, attribs, sink );
         }
         else if ( parser.getName().equals( HtmlMarkup.PRE.toString() ) )
         {
@@ -495,21 +380,13 @@ public class XhtmlBaseParser
             }
             sink.definition( attribs );
         }
-        else if ( ( parser.getName().equals( HtmlMarkup.B.toString() ) )
-                || ( parser.getName().equals( HtmlMarkup.STRONG.toString() ) ) )
+        else if ( ( parser.getName().equals( HtmlMarkup.FIGURE.toString() ) ) )
         {
-            sink.bold();
+            sink.figure( attribs );
         }
-        else if ( ( parser.getName().equals( HtmlMarkup.I.toString() ) )
-                || ( parser.getName().equals( HtmlMarkup.EM.toString() ) ) )
+        else if ( ( parser.getName().equals( HtmlMarkup.FIGCAPTION.toString() ) ) )
         {
-            handleFigureCaptionStart( sink, attribs );
-        }
-        else if ( ( parser.getName().equals( HtmlMarkup.CODE.toString() ) )
-                || ( parser.getName().equals( HtmlMarkup.SAMP.toString() ) )
-                || ( parser.getName().equals( HtmlMarkup.TT.toString() ) ) )
-        {
-            sink.monospaced();
+            sink.figureCaption( attribs );
         }
         else if ( parser.getName().equals( HtmlMarkup.A.toString() ) )
         {
@@ -539,6 +416,10 @@ public class XhtmlBaseParser
         {
             sink.lineBreak( attribs );
         }
+        else if ( parser.getName().equals( HtmlMarkup.WBR.toString() ) )
+        {
+            sink.lineBreakOpportunity( attribs );
+        }
         else if ( parser.getName().equals( HtmlMarkup.HR.toString() ) )
         {
             sink.horizontalRule( attribs );
@@ -579,34 +460,11 @@ public class XhtmlBaseParser
 
         if ( parser.getName().equals( HtmlMarkup.P.toString() ) )
         {
-            if ( !inFigure )
-            {
-                sink.paragraph_();
-            }
-        }
-        else if ( parser.getName().equals( HtmlMarkup.U.toString() )
-                || parser.getName().equals( HtmlMarkup.S.toString() )
-                || parser.getName().equals( HtmlMarkup.STRIKE.toString() )
-                || parser.getName().equals( "del" ) )
-        {
-            decoration.removeAttribute( SinkEventAttributes.DECORATION );
-        }
-        else if ( parser.getName().equals( HtmlMarkup.SUB.toString() )
-                || parser.getName().equals( HtmlMarkup.SUP.toString() ) )
-        {
-            decoration.removeAttribute( SinkEventAttributes.VALIGN );
+            sink.paragraph_();
         }
         else if ( parser.getName().equals( HtmlMarkup.DIV.toString() ) )
         {
-            if ( inFigure )
-            {
-                sink.figure_();
-                this.inFigure = false;
-            }
-            else
-            {
-                visited = false;
-            }
+            handleDivEnd( sink );
         }
         else if ( parser.getName().equals( HtmlMarkup.PRE.toString() ) )
         {
@@ -646,27 +504,132 @@ public class XhtmlBaseParser
             sink.definitionListItem_();
             hasDefinitionListItem = false;
         }
-        else if ( ( parser.getName().equals( HtmlMarkup.B.toString() ) )
-                || ( parser.getName().equals( HtmlMarkup.STRONG.toString() ) ) )
+        else if ( ( parser.getName().equals( HtmlMarkup.FIGURE.toString() ) ) )
         {
-            sink.bold_();
+            sink.figure_();
         }
-        else if ( ( parser.getName().equals( HtmlMarkup.I.toString() ) )
-                || ( parser.getName().equals( HtmlMarkup.EM.toString() ) ) )
+        else if ( ( parser.getName().equals( HtmlMarkup.FIGCAPTION.toString() ) ) )
         {
-            handleFigureCaptionEnd( sink );
-        }
-        else if ( ( parser.getName().equals( HtmlMarkup.CODE.toString() ) )
-                || ( parser.getName().equals( HtmlMarkup.SAMP.toString() ) )
-                || ( parser.getName().equals( HtmlMarkup.TT.toString() ) ) )
-        {
-            sink.monospaced_();
+            sink.figureCaption_();
         }
         else if ( parser.getName().equals( HtmlMarkup.A.toString() ) )
         {
             handleAEnd( sink );
         }
 
+        else if ( parser.getName().equals( HtmlMarkup.EM.toString() ) )
+        {
+            sink.inline_();
+        }
+        else if ( parser.getName().equals( HtmlMarkup.STRONG.toString() ) )
+        {
+            sink.inline_();
+        }
+        else if ( parser.getName().equals( HtmlMarkup.SMALL.toString() ) )
+        {
+            sink.inline_();
+        }
+        else if ( parser.getName().equals( HtmlMarkup.S.toString() ) )
+        {
+            sink.inline_();
+        }
+        else if ( parser.getName().equals( HtmlMarkup.CITE.toString() ) )
+        {
+            sink.inline_();
+        }
+        else if ( parser.getName().equals( HtmlMarkup.Q.toString() ) )
+        {
+            sink.inline_();
+        }
+        else if ( parser.getName().equals( HtmlMarkup.DFN.toString() ) )
+        {
+            sink.inline_();
+        }
+        else if ( parser.getName().equals( HtmlMarkup.ABBR.toString() ) )
+        {
+            sink.inline_();
+        }
+        else if ( parser.getName().equals( HtmlMarkup.I.toString() ) )
+        {
+            sink.inline_();
+        }
+        else if ( parser.getName().equals( HtmlMarkup.B.toString() ) )
+        {
+            sink.inline_();
+        }
+        else if ( parser.getName().equals( HtmlMarkup.CODE.toString() ) )
+        {
+            sink.inline_();
+        }
+        else if ( parser.getName().equals( HtmlMarkup.VAR.toString() ) )
+        {
+            sink.inline_();
+        }
+        else if ( parser.getName().equals( HtmlMarkup.SAMP.toString() ) )
+        {
+            sink.inline_();
+        }
+        else if ( parser.getName().equals( HtmlMarkup.KBD.toString() ) )
+        {
+            sink.inline_();
+        }
+        else if ( parser.getName().equals( HtmlMarkup.SUP.toString() ) )
+        {
+            sink.inline_();
+        }
+        else if ( parser.getName().equals( HtmlMarkup.SUB.toString() ) )
+        {
+            sink.inline_();
+        }
+        else if ( parser.getName().equals( HtmlMarkup.U.toString() ) )
+        {
+            sink.inline_();
+        }
+        else if ( parser.getName().equals( HtmlMarkup.MARK.toString() ) )
+        {
+            sink.inline_();
+        }
+        else if ( parser.getName().equals( HtmlMarkup.RUBY.toString() ) )
+        {
+            sink.inline_();
+        }
+        else if ( parser.getName().equals( HtmlMarkup.RB.toString() ) )
+        {
+            sink.inline_();
+        }
+        else if ( parser.getName().equals( HtmlMarkup.RT.toString() ) )
+        {
+            sink.inline_();
+        }
+        else if ( parser.getName().equals( HtmlMarkup.RTC.toString() ) )
+        {
+            sink.inline_();
+        }
+        else if ( parser.getName().equals( HtmlMarkup.RP.toString() ) )
+        {
+            sink.inline_();
+        }
+        else if ( parser.getName().equals( HtmlMarkup.BDI.toString() ) )
+        {
+            sink.inline_();
+        }
+        else if ( parser.getName().equals( HtmlMarkup.BDO.toString() ) )
+        {
+            sink.inline_();
+        }
+        else if ( parser.getName().equals( HtmlMarkup.SPAN.toString() ) )
+        {
+            sink.inline_();
+        }
+        else if ( parser.getName().equals( HtmlMarkup.INS.toString() ) )
+        {
+            sink.inline_();
+        }
+        else if ( parser.getName().equals( HtmlMarkup.DEL.toString() ) )
+        {
+            sink.inline_();
+        }
+
         // ----------------------------------------------------------------------
         // Tables
         // ----------------------------------------------------------------------
@@ -693,6 +656,22 @@ public class XhtmlBaseParser
         {
             sink.tableCaption_();
         }
+        else if ( parser.getName().equals( HtmlMarkup.ARTICLE.toString() ) )
+        {
+            sink.article_();
+        }
+        else if ( parser.getName().equals( HtmlMarkup.NAV.toString() ) )
+        {
+            sink.navigation_();
+        }
+        else if ( parser.getName().equals( HtmlMarkup.ASIDE.toString() ) )
+        {
+            sink.sidebar_();
+        }
+        else if ( parser.getName().equals( HtmlMarkup.SECTION.toString() ) )
+        {
+            handleSectionEnd( sink );
+        }
         else if ( parser.getName().equals( HtmlMarkup.H2.toString() ) )
         {
             sink.sectionTitle1_();
@@ -713,6 +692,18 @@ public class XhtmlBaseParser
         {
             sink.sectionTitle5_();
         }
+        else if ( parser.getName().equals( HtmlMarkup.HEADER.toString() ) )
+        {
+            sink.header_();
+        }
+        else if ( parser.getName().equals( HtmlMarkup.MAIN.toString() ) )
+        {
+            sink.content_();
+        }
+        else if ( parser.getName().equals( HtmlMarkup.FOOTER.toString() ) )
+        {
+            sink.footer_();
+        }
         else if ( parser.getName().equals( HtmlMarkup.SCRIPT.toString() )
             || parser.getName().equals( HtmlMarkup.STYLE.toString() ) )
         {
@@ -780,7 +771,7 @@ public class XhtmlBaseParser
          */
         if ( StringUtils.isNotEmpty( text ) && !isScriptBlock() )
         {
-            sink.text( text, decoration );
+            sink.text( text );
         }
     }
 
@@ -825,8 +816,9 @@ public class XhtmlBaseParser
      * Make sure sections are nested consecutively.
      *
      * <p>
-     * HTML doesn't have any sections, only sectionTitles (&lt;h2&gt; etc), that means we have to
-     * open close any sections that are missing in between.
+     * HTML5 heading tags H1 to H6 imply sections where they are not
+     * present, that means we have to open close any sections that
+     * are missing in between.
      * </p>
      *
      * <p>
@@ -853,12 +845,12 @@ public class XhtmlBaseParser
      * @param newLevel the new section level, all upper levels have to be closed.
      * @param sink the sink to receive the events.
      */
-    protected void consecutiveSections( int newLevel, Sink sink )
+    protected void consecutiveSections( int newLevel, Sink sink, SinkEventAttributeSet attribs )
     {
         closeOpenSections( newLevel, sink );
         openMissingSections( newLevel, sink );
 
-        this.sectionLevel = newLevel;
+        this.headingLevel = newLevel;
     }
 
     /**
@@ -869,30 +861,31 @@ public class XhtmlBaseParser
      */
     private void closeOpenSections( int newLevel, Sink sink )
     {
-        while ( this.sectionLevel >= newLevel )
+        while ( this.headingLevel >= newLevel
+                && this.sectionLevel < headingLevel )
         {
-            if ( sectionLevel == Sink.SECTION_LEVEL_5 )
+            if ( headingLevel == Sink.SECTION_LEVEL_5 )
             {
                 sink.section5_();
             }
-            else if ( sectionLevel == Sink.SECTION_LEVEL_4 )
+            else if ( headingLevel == Sink.SECTION_LEVEL_4 )
             {
                 sink.section4_();
             }
-            else if ( sectionLevel == Sink.SECTION_LEVEL_3 )
+            else if ( headingLevel == Sink.SECTION_LEVEL_3 )
             {
                 sink.section3_();
             }
-            else if ( sectionLevel == Sink.SECTION_LEVEL_2 )
+            else if ( headingLevel == Sink.SECTION_LEVEL_2 )
             {
                 sink.section2_();
             }
-            else if ( sectionLevel == Sink.SECTION_LEVEL_1 )
+            else if ( headingLevel == Sink.SECTION_LEVEL_1 )
             {
                 sink.section1_();
             }
 
-            this.sectionLevel--;
+            this.headingLevel--;
         }
     }
 
@@ -904,27 +897,28 @@ public class XhtmlBaseParser
      */
     private void openMissingSections( int newLevel, Sink sink )
     {
-        while ( this.sectionLevel < newLevel - 1 )
+        while ( this.headingLevel < newLevel
+                && this.sectionLevel < newLevel )
         {
-            this.sectionLevel++;
+            this.headingLevel++;
 
-            if ( sectionLevel == Sink.SECTION_LEVEL_5 )
+            if ( headingLevel == Sink.SECTION_LEVEL_5 )
             {
                 sink.section5();
             }
-            else if ( sectionLevel == Sink.SECTION_LEVEL_4 )
+            else if ( headingLevel == Sink.SECTION_LEVEL_4 )
             {
                 sink.section4();
             }
-            else if ( sectionLevel == Sink.SECTION_LEVEL_3 )
+            else if ( headingLevel == Sink.SECTION_LEVEL_3 )
             {
                 sink.section3();
             }
-            else if ( sectionLevel == Sink.SECTION_LEVEL_2 )
+            else if ( headingLevel == Sink.SECTION_LEVEL_2 )
             {
                 sink.section2();
             }
-            else if ( sectionLevel == Sink.SECTION_LEVEL_1 )
+            else if ( headingLevel == Sink.SECTION_LEVEL_1 )
             {
                 sink.section1();
             }
@@ -938,7 +932,7 @@ public class XhtmlBaseParser
      */
     protected int getSectionLevel()
     {
-        return this.sectionLevel;
+        return this.headingLevel;
     }
 
     /**
@@ -948,7 +942,7 @@ public class XhtmlBaseParser
      */
     protected void setSectionLevel( int newLevel )
     {
-        this.sectionLevel = newLevel;
+        this.headingLevel = newLevel;
     }
 
     /**
@@ -1021,13 +1015,8 @@ public class XhtmlBaseParser
         this.isLink = false;
         this.isAnchor = false;
         this.orderedListDepth = 0;
-        this.sectionLevel = 0;
+        this.headingLevel = 0;
         this.inVerbatim = false;
-        this.inFigure = false;
-        while ( this.decoration.getAttributeNames().hasMoreElements() )
-        {
-            this.decoration.removeAttribute( this.decoration.getAttributeNames().nextElement() );
-        }
         this.warnMessages = null;
     }
 
@@ -1090,47 +1079,46 @@ public class XhtmlBaseParser
 
     private boolean handleDivStart( XmlPullParser parser, SinkEventAttributeSet attribs, Sink sink )
     {
-        boolean visited = true;
-
         String divclass = parser.getAttributeValue( null, Attribute.CLASS.toString() );
 
-        if ( "figure".equals( divclass ) )
+        this.divStack.push( divclass );
+
+        if ( "content".equals( divclass ) )
         {
-            this.inFigure = true;
             SinkEventAttributeSet atts = new SinkEventAttributeSet( attribs );
             atts.removeAttribute( SinkEventAttributes.CLASS );
-            sink.figure( atts );
+            sink.content( atts );
+        }
+        if ( "source".equals( divclass ) )
+        {
+            return false;
         }
         else
         {
-            visited = false;
+            sink.division( attribs );
         }
 
-        return visited;
+        return true;
     }
 
-    private void handleFigureCaptionEnd( Sink sink )
+    private boolean handleDivEnd( Sink sink )
     {
-        if ( inFigure )
+        String divclass = divStack.pop();
+
+        if ( "content".equals( divclass ) )
         {
-            sink.figureCaption_();
+            sink.content_();
         }
-        else
+        if ( "source".equals( divclass ) )
         {
-            sink.italic_();
-        }
-    }
-
-    private void handleFigureCaptionStart( Sink sink, SinkEventAttributeSet attribs )
-    {
-        if ( inFigure )
-        {
-            sink.figureCaption( attribs );
+            return false;
         }
         else
         {
-            sink.italic();
+            sink.division_();
         }
+
+        return true;
     }
 
     private void handleImgStart( XmlPullParser parser, Sink sink, SinkEventAttributeSet attribs )
@@ -1203,10 +1191,7 @@ public class XhtmlBaseParser
 
     private void handlePStart( Sink sink, SinkEventAttributeSet attribs )
     {
-        if ( !inFigure )
-        {
-            sink.paragraph( attribs );
-        }
+        sink.paragraph( attribs );
     }
 
     /*
@@ -1222,17 +1207,28 @@ public class XhtmlBaseParser
     private void handlePreStart( SinkEventAttributeSet attribs, Sink sink )
     {
         verbatim();
-        attribs.removeAttribute( SinkEventAttributes.DECORATION );
         sink.verbatim( attribs );
     }
 
-    private void handleSectionStart( Sink sink, int level, SinkEventAttributeSet attribs )
+    private void handleSectionStart( Sink sink, SinkEventAttributeSet attribs )
+    {
+        sink.section( ++sectionLevel, attribs );
+    }
+
+    private void handleHeadingStart( Sink sink, int level, SinkEventAttributeSet attribs )
     {
-        consecutiveSections( level, sink );
-        sink.section( level, attribs );
+        consecutiveSections( level, sink, attribs );
         sink.sectionTitle( level, attribs );
     }
 
+    private void handleSectionEnd( Sink sink )
+    {
+        closeOpenSections( sectionLevel, sink );
+        this.headingLevel = 0;
+
+        sink.section_( sectionLevel-- );
+    }
+
     private void handleTableStart( Sink sink, SinkEventAttributeSet attribs, XmlPullParser parser )
     {
         sink.table( attribs );
diff --git a/doxia-core/src/main/java/org/apache/maven/doxia/parser/XhtmlBaseParser.java b/doxia-core/src/main/java/org/apache/maven/doxia/parser/XhtmlBaseParser.java
index c13fa1a..b2424fe 100644
--- a/doxia-core/src/main/java/org/apache/maven/doxia/parser/XhtmlBaseParser.java
+++ b/doxia-core/src/main/java/org/apache/maven/doxia/parser/XhtmlBaseParser.java
@@ -77,9 +77,6 @@ public class XhtmlBaseParser
     /** Used to wrap the definedTerm with its definition, even when one is omitted */
     boolean hasDefinitionListItem = false;
 
-    /** Decoration properties, eg for texts. */
-    private final SinkEventAttributeSet decoration = new SinkEventAttributeSet();
-
     /** Map of warn messages with a String as key to describe the error type and a Set as value.
      * Using to reduce warn messages. */
     private Map<String, Set<String>> warnMessages;
@@ -432,21 +429,25 @@ public class XhtmlBaseParser
         }
         else if ( parser.getName().equals( HtmlMarkup.U.toString() ) )
         {
-            decoration.addAttribute( SinkEventAttributes.DECORATION, "underline" );
+            attribs.addAttributes( SinkEventAttributeSet.Semantics.ANNOTATION );
+            sink.inline( attribs );
         }
         else if ( parser.getName().equals( HtmlMarkup.S.toString() )
                 || parser.getName().equals( HtmlMarkup.STRIKE.toString() )
                 || parser.getName().equals( "del" ) )
         {
-            decoration.addAttribute( SinkEventAttributes.DECORATION, "line-through" );
+            attribs.addAttributes( SinkEventAttributeSet.Semantics.LINE_THROUGH );
+            sink.inline( attribs );
         }
         else if ( parser.getName().equals( HtmlMarkup.SUB.toString() ) )
         {
-            decoration.addAttribute( SinkEventAttributes.VALIGN, "sub" );
+            attribs.addAttributes( SinkEventAttributeSet.Semantics.SUBSCRIPT );
+            sink.inline( attribs );
         }
         else if ( parser.getName().equals( HtmlMarkup.SUP.toString() ) )
         {
-            decoration.addAttribute( SinkEventAttributes.VALIGN, "sup" );
+            attribs.addAttributes( SinkEventAttributeSet.Semantics.SUPERSCRIPT );
+            sink.inline( attribs );
         }
         else if ( parser.getName().equals( HtmlMarkup.P.toString() ) )
         {
@@ -498,7 +499,7 @@ public class XhtmlBaseParser
         else if ( ( parser.getName().equals( HtmlMarkup.B.toString() ) )
                 || ( parser.getName().equals( HtmlMarkup.STRONG.toString() ) ) )
         {
-            sink.bold();
+            sink.inline( SinkEventAttributeSet.Semantics.BOLD );
         }
         else if ( ( parser.getName().equals( HtmlMarkup.I.toString() ) )
                 || ( parser.getName().equals( HtmlMarkup.EM.toString() ) ) )
@@ -509,7 +510,7 @@ public class XhtmlBaseParser
                 || ( parser.getName().equals( HtmlMarkup.SAMP.toString() ) )
                 || ( parser.getName().equals( HtmlMarkup.TT.toString() ) ) )
         {
-            sink.monospaced();
+            sink.inline( SinkEventAttributeSet.Semantics.MONOSPACED );
         }
         else if ( parser.getName().equals( HtmlMarkup.A.toString() ) )
         {
@@ -589,12 +590,12 @@ public class XhtmlBaseParser
                 || parser.getName().equals( HtmlMarkup.STRIKE.toString() )
                 || parser.getName().equals( "del" ) )
         {
-            decoration.removeAttribute( SinkEventAttributes.DECORATION );
+            sink.inline_();
         }
         else if ( parser.getName().equals( HtmlMarkup.SUB.toString() )
                 || parser.getName().equals( HtmlMarkup.SUP.toString() ) )
         {
-            decoration.removeAttribute( SinkEventAttributes.VALIGN );
+            sink.inline_();
         }
         else if ( parser.getName().equals( HtmlMarkup.DIV.toString() ) )
         {
@@ -649,7 +650,7 @@ public class XhtmlBaseParser
         else if ( ( parser.getName().equals( HtmlMarkup.B.toString() ) )
                 || ( parser.getName().equals( HtmlMarkup.STRONG.toString() ) ) )
         {
-            sink.bold_();
+            sink.inline_();
         }
         else if ( ( parser.getName().equals( HtmlMarkup.I.toString() ) )
                 || ( parser.getName().equals( HtmlMarkup.EM.toString() ) ) )
@@ -660,7 +661,7 @@ public class XhtmlBaseParser
                 || ( parser.getName().equals( HtmlMarkup.SAMP.toString() ) )
                 || ( parser.getName().equals( HtmlMarkup.TT.toString() ) ) )
         {
-            sink.monospaced_();
+            sink.inline_();
         }
         else if ( parser.getName().equals( HtmlMarkup.A.toString() ) )
         {
@@ -780,7 +781,7 @@ public class XhtmlBaseParser
          */
         if ( StringUtils.isNotEmpty( text ) && !isScriptBlock() )
         {
-            sink.text( text, decoration );
+            sink.text( text );
         }
     }
 
@@ -1024,10 +1025,6 @@ public class XhtmlBaseParser
         this.sectionLevel = 0;
         this.inVerbatim = false;
         this.inFigure = false;
-        while ( this.decoration.getAttributeNames().hasMoreElements() )
-        {
-            this.decoration.removeAttribute( this.decoration.getAttributeNames().nextElement() );
-        }
         this.warnMessages = null;
     }
 
@@ -1117,7 +1114,7 @@ public class XhtmlBaseParser
         }
         else
         {
-            sink.italic_();
+            sink.inline_();
         }
     }
 
@@ -1129,7 +1126,7 @@ public class XhtmlBaseParser
         }
         else
         {
-            sink.italic();
+            sink.inline( SinkEventAttributeSet.Semantics.ITALIC );
         }
     }
 
@@ -1222,7 +1219,6 @@ public class XhtmlBaseParser
     private void handlePreStart( SinkEventAttributeSet attribs, Sink sink )
     {
         verbatim();
-        attribs.removeAttribute( SinkEventAttributes.DECORATION );
         sink.verbatim( attribs );
     }
 
diff --git a/doxia-core/src/main/java/org/apache/maven/doxia/sink/impl/RandomAccessSink.java b/doxia-core/src/main/java/org/apache/maven/doxia/sink/impl/RandomAccessSink.java
index 5b912a4..4a873d4 100644
--- a/doxia-core/src/main/java/org/apache/maven/doxia/sink/impl/RandomAccessSink.java
+++ b/doxia-core/src/main/java/org/apache/maven/doxia/sink/impl/RandomAccessSink.java
@@ -96,6 +96,24 @@ public class RandomAccessSink
         this.coreSink = this.currentSink;
     }
 
+    @Override
+    public void address()
+    {
+        currentSink.address();
+    }
+
+    @Override
+    public void address( SinkEventAttributes attributes )
+    {
+        currentSink.address( attributes );
+    }
+
+    @Override
+    public void address_()
+    {
+        currentSink.address_();
+    }
+
     /**
      * By calling this method a sink reference is added at the current position. You can write to both the new sink
      * reference and the original sink. After flushing all sinks will be flushed in the right order.
@@ -152,6 +170,24 @@ public class RandomAccessSink
     }
 
     @Override
+    public void article()
+    {
+        currentSink.article();
+    }
+
+    @Override
+    public void article( SinkEventAttributes attributes )
+    {
+        currentSink.article( attributes );
+    }
+
+    @Override
+    public void article_()
+    {
+        currentSink.article_();
+    }
+
+    @Override
     public void author()
     {
         currentSink.author();
@@ -170,6 +206,24 @@ public class RandomAccessSink
     }
 
     @Override
+    public void blockquote()
+    {
+        currentSink.blockquote();
+    }
+
+    @Override
+    public void blockquote( SinkEventAttributes attributes )
+    {
+        currentSink.blockquote( attributes );
+    }
+
+    @Override
+    public void blockquote_()
+    {
+        currentSink.blockquote_();
+    }
+
+    @Override
     public void body()
     {
         currentSink.body();
@@ -219,6 +273,42 @@ public class RandomAccessSink
     }
 
     @Override
+    public void content()
+    {
+        currentSink.content();
+    }
+
+    @Override
+    public void content( SinkEventAttributes attributes )
+    {
+        currentSink.content( attributes );
+    }
+
+    @Override
+    public void content_()
+    {
+        currentSink.content_();
+    }
+
+    @Override
+    public void data( String value )
+    {
+        currentSink.data( value );
+    }
+
+    @Override
+    public void data( String value, SinkEventAttributes attributes )
+    {
+        currentSink.data( value, attributes );
+    }
+
+    @Override
+    public void data_()
+    {
+        currentSink.data_();
+    }
+
+    @Override
     public void date()
     {
         currentSink.date();
@@ -309,6 +399,24 @@ public class RandomAccessSink
     }
 
     @Override
+    public void division()
+    {
+        currentSink.division();
+    }
+
+    @Override
+    public void division( SinkEventAttributes attributes )
+    {
+        currentSink.division( attributes );
+    }
+
+    @Override
+    public void division_()
+    {
+        currentSink.division_();
+    }
+
+    @Override
     public void figure()
     {
         currentSink.figure();
@@ -382,6 +490,24 @@ public class RandomAccessSink
     }
 
     @Override
+    public void footer()
+    {
+        currentSink.footer();
+    }
+
+    @Override
+    public void footer( SinkEventAttributes attributes )
+    {
+        currentSink.footer( attributes );
+    }
+
+    @Override
+    public void footer_()
+    {
+        currentSink.footer_();
+    }
+
+    @Override
     public void head()
     {
         currentSink.head();
@@ -400,6 +526,24 @@ public class RandomAccessSink
     }
 
     @Override
+    public void header()
+    {
+        currentSink.header();
+    }
+
+    @Override
+    public void header( SinkEventAttributes attributes )
+    {
+        currentSink.header( attributes );
+    }
+
+    @Override
+    public void header_()
+    {
+        currentSink.header_();
+    }
+
+    @Override
     public void horizontalRule()
     {
         currentSink.horizontalRule();
@@ -412,6 +556,24 @@ public class RandomAccessSink
     }
 
     @Override
+    public void inline()
+    {
+        currentSink.inline();
+    }
+
+    @Override
+    public void inline( SinkEventAttributes attributes )
+    {
+        currentSink.inline( attributes );
+    }
+
+    @Override
+    public void inline_()
+    {
+        currentSink.inline_();
+    }
+
+    @Override
     public void italic()
     {
         currentSink.italic();
@@ -436,6 +598,18 @@ public class RandomAccessSink
     }
 
     @Override
+    public void lineBreakOpportunity()
+    {
+        currentSink.lineBreakOpportunity();
+    }
+
+    @Override
+    public void lineBreakOpportunity( SinkEventAttributes attributes )
+    {
+        currentSink.lineBreakOpportunity( attributes );
+    }
+
+    @Override
     public void link( String name )
     {
         currentSink.link( name );
@@ -502,6 +676,24 @@ public class RandomAccessSink
     }
 
     @Override
+    public void navigation()
+    {
+        currentSink.navigation();
+    }
+
+    @Override
+    public void navigation( SinkEventAttributes attributes )
+    {
+        currentSink.navigation( attributes );
+    }
+
+    @Override
+    public void navigation_()
+    {
+        currentSink.navigation_();
+    }
+
+    @Override
     public void nonBreakingSpace()
     {
         currentSink.nonBreakingSpace();
@@ -754,6 +946,24 @@ public class RandomAccessSink
     }
 
     @Override
+    public void sidebar()
+    {
+        currentSink.sidebar();
+    }
+
+    @Override
+    public void sidebar( SinkEventAttributes attributes )
+    {
+        currentSink.sidebar( attributes );
+    }
+
+    @Override
+    public void sidebar_()
+    {
+        currentSink.sidebar_();
+    }
+
+    @Override
     public void table()
     {
         currentSink.table();
@@ -880,6 +1090,24 @@ public class RandomAccessSink
     }
 
     @Override
+    public void time( String datetime )
+    {
+        currentSink.time( datetime );
+    }
+
+    @Override
+    public void time( String datetime, SinkEventAttributes attributes )
+    {
+        currentSink.time( datetime, attributes );
+    }
+
+    @Override
+    public void time_()
+    {
+        currentSink.time_();
+    }
+
+    @Override
     public void title()
     {
         currentSink.title();
@@ -926,4 +1154,4 @@ public class RandomAccessSink
     {
         currentSink.enableLogging( log );
     }
-}
\ No newline at end of file
+}
diff --git a/doxia-core/src/main/java/org/apache/maven/doxia/sink/impl/SinkAdapter.java b/doxia-core/src/main/java/org/apache/maven/doxia/sink/impl/SinkAdapter.java
index 1199aee..b383a60 100644
--- a/doxia-core/src/main/java/org/apache/maven/doxia/sink/impl/SinkAdapter.java
+++ b/doxia-core/src/main/java/org/apache/maven/doxia/sink/impl/SinkAdapter.java
@@ -59,6 +59,42 @@ public class SinkAdapter
     }
 
     @Override
+    public void article()
+    {
+        // nop
+    }
+
+    @Override
+    public void article_()
+    {
+        // nop
+    }
+
+    @Override
+    public void navigation()
+    {
+        // nop
+    }
+
+    @Override
+    public void navigation_()
+    {
+        // nop
+    }
+
+    @Override
+    public void sidebar()
+    {
+        // nop
+    }
+
+    @Override
+    public void sidebar_()
+    {
+        // nop
+    }
+
+    @Override
     public void section1()
     {
         // nop
@@ -383,6 +419,42 @@ public class SinkAdapter
     }
 
     @Override
+    public void header()
+    {
+        // nop
+    }
+
+    @Override
+    public void header_()
+    {
+        // nop
+    }
+
+    @Override
+    public void content()
+    {
+        // nop
+    }
+
+    @Override
+    public void content_()
+    {
+        // nop
+    }
+
+    @Override
+    public void footer()
+    {
+        // nop
+    }
+
+    @Override
+    public void footer_()
+    {
+        // nop
+    }
+
+    @Override
     public void paragraph()
     {
         // nop
@@ -395,6 +467,66 @@ public class SinkAdapter
     }
 
     @Override
+    public void data( String value )
+    {
+        // nop
+    }
+
+    @Override
+    public void data_()
+    {
+        // nop
+    }
+
+    @Override
+    public void time( String datetime )
+    {
+        // nop
+    }
+
+    @Override
+    public void time_()
+    {
+        // nop
+    }
+
+    @Override
+    public void address()
+    {
+        // nop
+    }
+
+    @Override
+    public void address_()
+    {
+        // nop
+    }
+
+    @Override
+    public void blockquote()
+    {
+        // nop
+    }
+
+    @Override
+    public void blockquote_()
+    {
+        // nop
+    }
+
+    @Override
+    public void division()
+    {
+        // nop
+    }
+
+    @Override
+    public void division_()
+    {
+        // nop
+    }
+
+    @Override
     public void verbatim( boolean boxed )
     {
         // nop
@@ -521,6 +653,18 @@ public class SinkAdapter
     }
 
     @Override
+    public void inline()
+    {
+        // nop
+    }
+
+    @Override
+    public void inline_()
+    {
+        // nop
+    }
+
+    @Override
     public void italic()
     {
         // nop
@@ -563,6 +707,12 @@ public class SinkAdapter
     }
 
     @Override
+    public void lineBreakOpportunity()
+    {
+        // nop
+    }
+
+    @Override
     public void nonBreakingSpace()
     {
         // nop
@@ -628,6 +778,24 @@ public class SinkAdapter
     }
 
     @Override
+    public void article( SinkEventAttributes attributes )
+    {
+        article();
+    }
+
+    @Override
+    public void navigation( SinkEventAttributes attributes )
+    {
+        navigation();
+    }
+
+    @Override
+    public void sidebar( SinkEventAttributes attributes )
+    {
+        sidebar();
+    }
+
+    @Override
     public void section( int level, SinkEventAttributes attributes )
     {
         if ( level == SECTION_LEVEL_1 )
@@ -728,6 +896,24 @@ public class SinkAdapter
     }
 
     @Override
+    public void header( SinkEventAttributes attributes )
+    {
+        header();
+    }
+
+    @Override
+    public void content( SinkEventAttributes attributes )
+    {
+        content();
+    }
+
+    @Override
+    public void footer( SinkEventAttributes attributes )
+    {
+        footer();
+    }
+
+    @Override
     public void list( SinkEventAttributes attributes )
     {
         list();
@@ -830,6 +1016,36 @@ public class SinkAdapter
     }
 
     @Override
+    public void data( String value, SinkEventAttributes attributes )
+    {
+        data( value );
+    }
+
+    @Override
+    public void time( String datetime, SinkEventAttributes attributes )
+    {
+        time( datetime );
+    }
+
+    @Override
+    public void address( SinkEventAttributes attributes )
+    {
+        address();
+    }
+
+    @Override
+    public void blockquote( SinkEventAttributes attributes )
+    {
+        blockquote();
+    }
+
+    @Override
+    public void division( SinkEventAttributes attributes )
+    {
+        division();
+    }
+
+    @Override
     public void verbatim( SinkEventAttributes attributes )
     {
         MutableAttributeSet atts = SinkUtils.filterAttributes( attributes, SinkUtils.SINK_VERBATIM_ATTRIBUTES );
@@ -863,12 +1079,24 @@ public class SinkAdapter
     }
 
     @Override
+    public void inline( SinkEventAttributes attributes )
+    {
+        inline();
+    }
+
+    @Override
     public void lineBreak( SinkEventAttributes attributes )
     {
         lineBreak();
     }
 
     @Override
+    public void lineBreakOpportunity( SinkEventAttributes attributes )
+    {
+        lineBreakOpportunity();
+    }
+
+    @Override
     public void text( String text, SinkEventAttributes attributes )
     {
         text( text );
diff --git a/doxia-core/src/main/java/org/apache/maven/doxia/sink/impl/SinkEventAttributeSet.java b/doxia-core/src/main/java/org/apache/maven/doxia/sink/impl/SinkEventAttributeSet.java
index 218fa28..9374dbd 100644
--- a/doxia-core/src/main/java/org/apache/maven/doxia/sink/impl/SinkEventAttributeSet.java
+++ b/doxia-core/src/main/java/org/apache/maven/doxia/sink/impl/SinkEventAttributeSet.java
@@ -416,4 +416,191 @@ public class SinkEventAttributeSet
         return s.toString();
     }
 
+    /**
+     * Attribute sets for the semantic attribute.
+     */
+    public static class Semantics
+    {
+        /**
+         * An unmodifiable attribute set containing only an emphasis attribute.
+         */
+        public static final SinkEventAttributes EMPHASIS;
+
+        /**
+         * An unmodifiable attribute set containing only a strong attribute.
+         */
+        public static final SinkEventAttributes STRONG;
+
+        /**
+         * An unmodifiable attribute set containing only a small attribute.
+         */
+        public static final SinkEventAttributes SMALL;
+
+        /**
+         * An unmodifiable attribute set containing only a line-through attribute.
+         */
+        public static final SinkEventAttributes LINE_THROUGH;
+
+        /**
+         * An unmodifiable attribute set containing only a citation attribute.
+         */
+        public static final SinkEventAttributes CITATION;
+
+        /**
+         * An unmodifiable attribute set containing only a quote attribute.
+         */
+        public static final SinkEventAttributes QUOTE;
+
+        /**
+         * An unmodifiable attribute set containing only a definition attribute.
+         */
+        public static final SinkEventAttributes DEFINITION;
+
+        /**
+         * An unmodifiable attribute set containing only an abbreviation attribute.
+         */
+        public static final SinkEventAttributes ABBREVIATION;
+
+        /**
+         * An unmodifiable attribute set containing only an italic attribute.
+         */
+        public static final SinkEventAttributes ITALIC;
+
+        /**
+         * An unmodifiable attribute set containing only a bold attribute.
+         */
+        public static final SinkEventAttributes BOLD;
+
+        /**
+         * An unmodifiable attribute set containing only a monospaced attribute.
+         */
+        public static final SinkEventAttributes MONOSPACED;
+
+        /**
+         * An unmodifiable attribute set containing only a code attribute.
+         */
+        public static final SinkEventAttributes CODE;
+
+        /**
+         * An unmodifiable attribute set containing only a variable attribute.
+         */
+        public static final SinkEventAttributes VARIABLE;
+
+        /**
+         * An unmodifiable attribute set containing only a sample attribute.
+         */
+        public static final SinkEventAttributes SAMPLE;
+
+        /**
+         * An unmodifiable attribute set containing only a keyboard attribute.
+         */
+        public static final SinkEventAttributes KEYBOARD;
+
+        /**
+         * An unmodifiable attribute set containing only a superscript attribute.
+         */
+        public static final SinkEventAttributes SUPERSCRIPT;
+
+        /**
+         * An unmodifiable attribute set containing only a subscript attribute.
+         */
+        public static final SinkEventAttributes SUBSCRIPT;
+
+        /**
+         * An unmodifiable attribute set containing only an annotation attribute.
+         */
+        public static final SinkEventAttributes ANNOTATION;
+
+        /**
+         * An unmodifiable attribute set containing only a highlight attribute.
+         */
+        public static final SinkEventAttributes HIGHLIGHT;
+
+        /**
+         * An unmodifiable attribute set containing only a ruby attribute.
+         */
+        public static final SinkEventAttributes RUBY;
+
+        /**
+         * An unmodifiable attribute set containing only a rubyBase attribute.
+         */
+        public static final SinkEventAttributes RUBY_BASE;
+
+        /**
+         * An unmodifiable attribute set containing only a rubyText attribute.
+         */
+        public static final SinkEventAttributes RUBY_TEXT;
+
+        /**
+         * An unmodifiable attribute set containing only a rubyTextContainer attribute.
+         */
+        public static final SinkEventAttributes RUBY_TEXT_CONTAINER;
+
+        /**
+         * An unmodifiable attribute set containing only a rubyParentheses attribute.
+         */
+        public static final SinkEventAttributes RUBY_PARANTHESES;
+
+        /**
+         * An unmodifiable attribute set containing only a bidirectionalIsolation attribute.
+         */
+        public static final SinkEventAttributes BIDIRECTIONAL_ISOLATION;
+
+        /**
+         * An unmodifiable attribute set containing only a bidirectionalOverride attribute.
+         */
+        public static final SinkEventAttributes BIDIRECTIONAL_OVERRIDE;
+
+        /**
+         * An unmodifiable attribute set containing only a phrase attribute.
+         */
+        public static final SinkEventAttributes PHRASE;
+
+        /**
+         * An unmodifiable attribute set containing only an insert attribute.
+         */
+        public static final SinkEventAttributes INSERT;
+
+        /**
+         * An unmodifiable attribute set containing only a delete attribute.
+         */
+        public static final SinkEventAttributes DELETE;
+
+        static
+        {
+            EMPHASIS = new SinkEventAttributeSet( new String[] {SEMANTICS, "emphasis"} ).unmodifiable();
+            STRONG = new SinkEventAttributeSet( new String[] {SEMANTICS, "strong"} ).unmodifiable();
+            SMALL = new SinkEventAttributeSet( new String[] {SEMANTICS, "small"} ).unmodifiable();
+            LINE_THROUGH = new SinkEventAttributeSet( new String[] {SEMANTICS, "line-through"} ).unmodifiable();
+            CITATION = new SinkEventAttributeSet( new String[] {SEMANTICS, "citation"} ).unmodifiable();
+            QUOTE = new SinkEventAttributeSet( new String[] {SEMANTICS, "quote"} ).unmodifiable();
+            DEFINITION = new SinkEventAttributeSet( new String[] {SEMANTICS, "definition"} ).unmodifiable();
+            ABBREVIATION = new SinkEventAttributeSet( new String[] {SEMANTICS, "abbreviation"} ).unmodifiable();
+            ITALIC = new SinkEventAttributeSet( new String[] {SEMANTICS, "italic"} ).unmodifiable();
+            BOLD = new SinkEventAttributeSet( new String[] {SEMANTICS, "bold"} ).unmodifiable();
+            MONOSPACED = new SinkEventAttributeSet( new String[] {SEMANTICS, "monospaced"} ).unmodifiable();
+            CODE = new SinkEventAttributeSet( new String[] {SEMANTICS, "code"} ).unmodifiable();
+            VARIABLE = new SinkEventAttributeSet( new String[] {SEMANTICS, "variable"} ).unmodifiable();
+            SAMPLE = new SinkEventAttributeSet( new String[] {SEMANTICS, "sample"} ).unmodifiable();
+            KEYBOARD = new SinkEventAttributeSet( new String[] {SEMANTICS, "keyboard"} ).unmodifiable();
+            SUPERSCRIPT = new SinkEventAttributeSet( new String[] {SEMANTICS, "superscript"} ).unmodifiable();
+            SUBSCRIPT = new SinkEventAttributeSet( new String[] {SEMANTICS, "subscript"} ).unmodifiable();
+            ANNOTATION = new SinkEventAttributeSet( new String[] {SEMANTICS, "annotation"} ).unmodifiable();
+            HIGHLIGHT = new SinkEventAttributeSet( new String[] {SEMANTICS, "highlight"} ).unmodifiable();
+            RUBY = new SinkEventAttributeSet( new String[] {SEMANTICS, "ruby"} ).unmodifiable();
+            RUBY_BASE = new SinkEventAttributeSet( new String[] {SEMANTICS, "rubyBase"} ).unmodifiable();
+            RUBY_TEXT = new SinkEventAttributeSet( new String[] {SEMANTICS, "rubyText"} ).unmodifiable();
+            RUBY_TEXT_CONTAINER = new SinkEventAttributeSet( new String[] {SEMANTICS,
+                    "rubyTextContainer"} ).unmodifiable();
+            RUBY_PARANTHESES = new SinkEventAttributeSet( new String[] {SEMANTICS,
+                    "rubyParentheses"} ).unmodifiable();
+            BIDIRECTIONAL_ISOLATION = new SinkEventAttributeSet( new String[] {SEMANTICS,
+                    "bidirectionalIsolation"} ).unmodifiable();
+            BIDIRECTIONAL_OVERRIDE = new SinkEventAttributeSet( new String[] {SEMANTICS,
+                    "bidirectionalOverride"} ).unmodifiable();
+            PHRASE = new SinkEventAttributeSet( new String[] {SEMANTICS, "phrase"} ).unmodifiable();
+            INSERT = new SinkEventAttributeSet( new String[] {SEMANTICS, "insert"} ).unmodifiable();
+            DELETE = new SinkEventAttributeSet( new String[] {SEMANTICS, "delete"} ).unmodifiable();
+        }
+    }
 }
diff --git a/doxia-core/src/main/java/org/apache/maven/doxia/sink/impl/XhtmlBaseSink.java b/doxia-core/src/main/java/org/apache/maven/doxia/sink/impl/Xhtml5BaseSink.java
similarity index 80%
copy from doxia-core/src/main/java/org/apache/maven/doxia/sink/impl/XhtmlBaseSink.java
copy to doxia-core/src/main/java/org/apache/maven/doxia/sink/impl/Xhtml5BaseSink.java
index d03dd36..4ad403a 100644
--- a/doxia-core/src/main/java/org/apache/maven/doxia/sink/impl/XhtmlBaseSink.java
+++ b/doxia-core/src/main/java/org/apache/maven/doxia/sink/impl/Xhtml5BaseSink.java
@@ -22,11 +22,15 @@ package org.apache.maven.doxia.sink.impl;
 import java.io.PrintWriter;
 import java.io.StringWriter;
 import java.io.Writer;
+import java.util.ArrayList;
+import java.util.EmptyStackException;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.LinkedList;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.Stack;
 import java.util.TreeSet;
 
 import javax.swing.text.MutableAttributeSet;
@@ -43,14 +47,9 @@ import org.codehaus.plexus.util.StringUtils;
 import org.codehaus.plexus.util.xml.PrettyPrintXMLWriter;
 
 /**
- * Abstract base xhtml sink implementation.
- *
- * @author Jason van Zyl
- * @author ltheussl
- * @version $Id$
- * @since 1.1
+ * Abstract base xhtml5 sink implementation.
  */
-public class XhtmlBaseSink
+public class Xhtml5BaseSink
     extends AbstractXmlSink
     implements HtmlMarkup
 {
@@ -67,8 +66,11 @@ public class XhtmlBaseSink
     /** An indication on if we're inside a head. */
     private boolean headFlag;
 
-    /** An indication on if we're inside an image caption flag. */
-    private boolean figureCaptionFlag;
+    /** Keep track of the main and div tags for content events. */
+    protected Stack<Tag> contentStack = new Stack<Tag>();
+
+    /** Keep track of the closing tags for inline events. */
+    protected Stack<List<Tag>> inlineStack = new Stack<List<Tag>>();
 
     /** An indication on if we're inside a paragraph flag. */
     private boolean paragraphFlag;
@@ -101,15 +103,6 @@ public class XhtmlBaseSink
     /** used to store attributes passed to table(). */
     protected MutableAttributeSet tableAttributes;
 
-    /** Used to distinguish old-style figure handling. */
-    private boolean legacyFigure;
-
-    /** Used to distinguish old-style figure handling. */
-    private boolean legacyFigureCaption;
-
-    /** Indicates that an image is part of a figure. */
-    private boolean inFigure;
-
     /** Flag to know if {@link #tableRows(int[], boolean)} is called or not. It is mainly to be backward compatible
      * with some plugins (like checkstyle) which uses:
      * <pre>
@@ -138,7 +131,7 @@ public class XhtmlBaseSink
      *
      * @param out The writer to write the result.
      */
-    public XhtmlBaseSink( Writer out )
+    public Xhtml5BaseSink( Writer out )
     {
         this.writer = new PrintWriter( out );
 
@@ -273,17 +266,14 @@ public class XhtmlBaseSink
         this.tableCaptionWriterStack.clear();
         this.tableCaptionXMLWriterStack.clear();
         this.tableCaptionStack.clear();
+        this.inlineStack.clear();
 
         this.headFlag = false;
-        this.figureCaptionFlag = false;
         this.paragraphFlag = false;
         this.verbatimFlag = false;
 
         this.evenTableRow = true;
         this.tableAttributes = null;
-        this.legacyFigure = false;
-        this.legacyFigureCaption = false;
-        this.inFigure = false;
         this.tableRows = false;
         this.warnMessages = null;
     }
@@ -300,6 +290,96 @@ public class XhtmlBaseSink
     // Sections
     // ----------------------------------------------------------------------
 
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void article()
+    {
+        article( null );
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void article( SinkEventAttributes attributes )
+    {
+        MutableAttributeSet atts = SinkUtils.filterAttributes(
+                attributes, SinkUtils.SINK_SECTION_ATTRIBUTES  );
+
+        writeStartTag( HtmlMarkup.ARTICLE, atts );
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void article_()
+    {
+        writeEndTag( HtmlMarkup.ARTICLE );
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void navigation()
+    {
+        navigation( null );
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void navigation( SinkEventAttributes attributes )
+    {
+        MutableAttributeSet atts = SinkUtils.filterAttributes(
+                attributes, SinkUtils.SINK_SECTION_ATTRIBUTES  );
+
+        writeStartTag( HtmlMarkup.NAV, atts );
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void navigation_()
+    {
+        writeEndTag( HtmlMarkup.NAV );
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void sidebar()
+    {
+        sidebar( null );
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void sidebar( SinkEventAttributes attributes )
+    {
+        MutableAttributeSet atts = SinkUtils.filterAttributes(
+                attributes, SinkUtils.SINK_SECTION_ATTRIBUTES  );
+
+        writeStartTag( HtmlMarkup.ASIDE, atts );
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void sidebar_()
+    {
+        writeEndTag( HtmlMarkup.ASIDE );
+    }
+
     /** {@inheritDoc} */
     @Override
     public void section( int level, SinkEventAttributes attributes )
@@ -473,19 +553,17 @@ public class XhtmlBaseSink
      *
      * @param depth The level of the section.
      * @param attributes some attributes. May be null.
-     * @see javax.swing.text.html.HTML.Tag#DIV
+     * @see javax.swing.text.html.HTML.Tag#SECTION
      */
     protected void onSection( int depth, SinkEventAttributes attributes )
     {
         if ( depth >= SECTION_LEVEL_1 && depth <= SECTION_LEVEL_5 )
         {
             MutableAttributeSet att = new SinkEventAttributeSet();
-            att.addAttribute( Attribute.CLASS, "section" );
-            // NOTE: any class entry in attributes will overwrite the above
             att.addAttributes( SinkUtils.filterAttributes(
                     attributes, SinkUtils.SINK_BASE_ATTRIBUTES  ) );
 
-            writeStartTag( HtmlMarkup.DIV, att );
+            writeStartTag( HtmlMarkup.SECTION, att );
         }
     }
 
@@ -499,7 +577,7 @@ public class XhtmlBaseSink
     {
         if ( depth >= SECTION_LEVEL_1 && depth <= SECTION_LEVEL_5 )
         {
-            writeEndTag( HtmlMarkup.DIV );
+            writeEndTag( HtmlMarkup.SECTION );
         }
     }
 
@@ -575,6 +653,120 @@ public class XhtmlBaseSink
         }
     }
 
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void header()
+    {
+        header( null );
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void header( SinkEventAttributes attributes )
+    {
+        MutableAttributeSet atts = SinkUtils.filterAttributes(
+                attributes, SinkUtils.SINK_SECTION_ATTRIBUTES  );
+
+        writeStartTag( HtmlMarkup.HEADER, atts );
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void header_()
+    {
+        writeEndTag( HtmlMarkup.HEADER );
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void content()
+    {
+        content( (SinkEventAttributes) null );
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void content( SinkEventAttributes attributes )
+    {
+        MutableAttributeSet atts = SinkUtils.filterAttributes(
+                attributes, SinkUtils.SINK_SECTION_ATTRIBUTES  );
+
+        if ( contentStack.empty() )
+        {
+            writeStartTag( contentStack.push( HtmlMarkup.MAIN ), atts );
+        }
+        else
+        {
+            if ( atts == null )
+            {
+                atts = new SinkEventAttributeSet( 1 );
+            }
+
+            if ( !atts.isDefined( SinkEventAttributes.CLASS ) )
+            {
+                atts.addAttribute( SinkEventAttributes.CLASS, "content" );
+            }
+
+            writeStartTag( contentStack.push( HtmlMarkup.DIV ), atts );
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void content_()
+    {
+        try
+        {
+            writeEndTag( contentStack.pop() );
+        }
+        catch ( EmptyStackException ese )
+        {
+            /* do nothing if the stack is empty */
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void footer()
+    {
+        footer( null );
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void footer( SinkEventAttributes attributes )
+    {
+        MutableAttributeSet atts = SinkUtils.filterAttributes(
+                attributes, SinkUtils.SINK_SECTION_ATTRIBUTES  );
+
+        writeStartTag( HtmlMarkup.FOOTER, atts );
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void footer_()
+    {
+        writeEndTag( HtmlMarkup.FOOTER );
+    }
+
     // -----------------------------------------------------------------------
     //
     // -----------------------------------------------------------------------
@@ -867,90 +1059,40 @@ public class XhtmlBaseSink
 
     /**
      * {@inheritDoc}
-     * @see javax.swing.text.html.HTML.Tag#IMG
-     * @deprecated Use {@link #figure(SinkEventAttributes)}, this method is only kept for
-     * backward compatibility. Note that the behavior is different though, as this method
-     * writes an img tag, while correctly the img tag should be written by  figureGraphics().
      */
     @Override
     public void figure()
     {
-        write( String.valueOf( LESS_THAN ) + HtmlMarkup.IMG );
-        legacyFigure = true;
+        figure( null );
     }
 
     /**
      * {@inheritDoc}
-     * @see javax.swing.text.html.HTML.Tag#IMG
      */
     @Override
     public void figure( SinkEventAttributes attributes )
     {
-        inFigure = true;
-
-        MutableAttributeSet atts = SinkUtils.filterAttributes(
-                attributes, SinkUtils.SINK_BASE_ATTRIBUTES  );
-
-        if ( atts == null )
-        {
-            atts = new SinkEventAttributeSet( 1 );
-        }
-
-        if ( !atts.isDefined( SinkEventAttributes.CLASS ) )
-        {
-            atts.addAttribute( SinkEventAttributes.CLASS, "figure" );
-        }
-
-        writeStartTag( HtmlMarkup.DIV, atts );
+        writeStartTag( HtmlMarkup.FIGURE, attributes );
     }
 
     /** {@inheritDoc} */
     @Override
     public void figure_()
     {
-        if ( legacyFigure )
-        {
-            if ( !figureCaptionFlag )
-            {
-                // Attribute "alt" is required and must be specified for element type "img".
-                write( String.valueOf( SPACE ) + Attribute.ALT + EQUAL + QUOTE + QUOTE );
-            }
-            write( String.valueOf( SPACE ) + SLASH + GREATER_THAN );
-            legacyFigure = false;
-        }
-        else
-        {
-            writeEndTag( HtmlMarkup.DIV );
-            inFigure = false;
-        }
-
-        figureCaptionFlag = false;
+        writeEndTag( HtmlMarkup.FIGURE );
     }
 
-    /**
-     * {@inheritDoc}
-     * @deprecated Use {@link #figureGraphics(String,SinkEventAttributes)},
-     * this method is only kept for backward compatibility. Note that the behavior is
-     * different though, as this method does not write the img tag, only the src attribute.
-     */
+    /** {@inheritDoc} */
     @Override
     public void figureGraphics( String name )
     {
-        write( String.valueOf( SPACE ) + Attribute.SRC + EQUAL + QUOTE + escapeHTML( name ) + QUOTE );
+        figureGraphics( name, null );
     }
 
     /** {@inheritDoc} */
     @Override
     public void figureGraphics( String src, SinkEventAttributes attributes )
     {
-        if ( inFigure )
-        {
-            MutableAttributeSet atts = new SinkEventAttributeSet( 1 );
-            atts.addAttribute( SinkEventAttributes.ALIGN, "center" );
-
-            writeStartTag( HtmlMarkup.P, atts );
-        }
-
         MutableAttributeSet filtered = SinkUtils.filterAttributes( attributes, SinkUtils.SINK_IMG_ATTRIBUTES );
         if ( filtered != null )
         {
@@ -970,62 +1112,29 @@ public class XhtmlBaseSink
         }
 
         writeStartTag( HtmlMarkup.IMG, atts, true );
-
-        if ( inFigure )
-        {
-            writeEndTag( HtmlMarkup.P );
-        }
     }
 
     /**
      * {@inheritDoc}
-     * @deprecated Use {@link #figureCaption(SinkEventAttributes)},
-     * this method is only kept for backward compatibility. Note that the behavior is
-     * different though, as this method only writes an alt attribute.
      */
     @Override
     public void figureCaption()
     {
-        figureCaptionFlag = true;
-        write( String.valueOf( SPACE ) + Attribute.ALT + EQUAL + QUOTE );
-        legacyFigureCaption = true;
+        figureCaption( null );
     }
 
     /** {@inheritDoc} */
     @Override
     public void figureCaption( SinkEventAttributes attributes )
     {
-        if ( legacyFigureCaption )
-        {
-            write( String.valueOf( SPACE ) + Attribute.ALT + EQUAL + QUOTE );
-            legacyFigureCaption = false;
-            figureCaptionFlag = true;
-        }
-        else
-        {
-            SinkEventAttributeSet atts = new SinkEventAttributeSet( 1 );
-            atts.addAttribute( SinkEventAttributes.ALIGN, "center" );
-            atts.addAttributes( SinkUtils.filterAttributes(
-                attributes, SinkUtils.SINK_BASE_ATTRIBUTES  ) );
-
-            paragraph( atts );
-            italic();
-        }
+        writeStartTag( HtmlMarkup.FIGCAPTION, attributes );
     }
 
     /** {@inheritDoc} */
     @Override
     public void figureCaption_()
     {
-        if ( legacyFigureCaption )
-        {
-            write( String.valueOf( QUOTE ) );
-        }
-        else
-        {
-            italic_();
-            paragraph_();
-        }
+        writeEndTag( HtmlMarkup.FIGCAPTION );
     }
 
     /**
@@ -1068,6 +1177,184 @@ public class XhtmlBaseSink
     }
 
     /**
+     * {@inheritDoc}
+     * @see javax.swing.text.html.HTML.Tag#DATA
+     */
+    @Override
+    public void data( String value )
+    {
+        data( value, null );
+    }
+
+    /**
+     * {@inheritDoc}
+     * @see javax.swing.text.html.HTML.Tag#DATA
+     */
+    @Override
+    public void data( String value, SinkEventAttributes attributes )
+    {
+        MutableAttributeSet atts = SinkUtils.filterAttributes(
+                attributes, SinkUtils.SINK_BASE_ATTRIBUTES  );
+
+        MutableAttributeSet att = new SinkEventAttributeSet();
+        if ( value != null )
+        {
+            att.addAttribute( Attribute.VALUE, value );
+        }
+        att.addAttributes( atts );
+
+        writeStartTag( HtmlMarkup.DATA, att );
+    }
+
+    /**
+     * {@inheritDoc}
+     * @see javax.swing.text.html.HTML.Tag#DATA
+     */
+    @Override
+    public void data_()
+    {
+        writeEndTag( HtmlMarkup.DATA );
+    }
+
+    /**
+     * {@inheritDoc}
+     * @see javax.swing.text.html.HTML.Tag#TIME
+     */
+    @Override
+    public void time( String datetime )
+    {
+        time( datetime, null );
+    }
+
+    /**
+     * {@inheritDoc}
+     * @see javax.swing.text.html.HTML.Tag#DATA
+     */
+    @Override
+    public void time( String datetime, SinkEventAttributes attributes )
+    {
+        MutableAttributeSet atts = SinkUtils.filterAttributes(
+                attributes, SinkUtils.SINK_BASE_ATTRIBUTES  );
+
+        MutableAttributeSet att = new SinkEventAttributeSet();
+        if ( datetime != null )
+        {
+            att.addAttribute( "datetime", datetime );
+        }
+        att.addAttributes( atts );
+
+        writeStartTag( HtmlMarkup.TIME, att );
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void time_()
+    {
+        writeEndTag( HtmlMarkup.TIME );
+    }
+
+    /**
+     * {@inheritDoc}
+     * @see javax.swing.text.html.HTML.Tag#ADDRESS
+     */
+    @Override
+    public void address()
+    {
+        address( null );
+    }
+
+    /**
+     * {@inheritDoc}
+     * @see javax.swing.text.html.HTML.Tag#ADDRESS
+     */
+    @Override
+    public void address( SinkEventAttributes attributes )
+    {
+        MutableAttributeSet atts = SinkUtils.filterAttributes(
+                attributes, SinkUtils.SINK_SECTION_ATTRIBUTES  );
+
+        writeStartTag( HtmlMarkup.ADDRESS, atts );
+    }
+
+    /**
+     * {@inheritDoc}
+     * @see javax.swing.text.html.HTML.Tag#ADDRESS
+     */
+    @Override
+    public void address_()
+    {
+        writeEndTag( HtmlMarkup.ADDRESS );
+    }
+
+    /**
+     * {@inheritDoc}
+     * @see javax.swing.text.html.HTML.Tag#BLOCKQUOTE
+     */
+    @Override
+    public void blockquote()
+    {
+        blockquote( null );
+    }
+
+    /**
+     * {@inheritDoc}
+     * @see javax.swing.text.html.HTML.Tag#BLOCKQUOTE
+     */
+    @Override
+    public void blockquote( SinkEventAttributes attributes )
+    {
+        MutableAttributeSet atts = SinkUtils.filterAttributes(
+                attributes, SinkUtils.SINK_SECTION_ATTRIBUTES  );
+
+        writeStartTag( HtmlMarkup.BLOCKQUOTE, atts );
+    }
+
+    /**
+     * {@inheritDoc}
+     * @see javax.swing.text.html.HTML.Tag#BLOCKQUOTE
+     */
+    @Override
+    public void blockquote_()
+    {
+        writeEndTag( HtmlMarkup.BLOCKQUOTE );
+    }
+
+    /**
+     * {@inheritDoc}
+     * @see javax.swing.text.html.HTML.Tag#DIV
+     */
+    @Override
+    public void division()
+    {
+        division( null );
+    }
+
+    /**
+     * {@inheritDoc}
+     * @see javax.swing.text.html.HTML.Tag#DIV
+     */
+    @Override
+    public void division( SinkEventAttributes attributes )
+    {
+        MutableAttributeSet atts = SinkUtils.filterAttributes(
+                attributes, SinkUtils.SINK_SECTION_ATTRIBUTES  );
+
+        writeStartTag( HtmlMarkup.DIV, atts );
+    }
+
+    /**
+     * {@inheritDoc}
+     * @see javax.swing.text.html.HTML.Tag#DIV
+     */
+    @Override
+    public void division_()
+    {
+        writeEndTag( HtmlMarkup.DIV );
+    }
+
+    /**
      * The default class style for boxed is <code>source</code>.
      *
      * {@inheritDoc}
@@ -1666,6 +1953,80 @@ public class XhtmlBaseSink
         }
     }
 
+    /** {@inheritDoc} */
+    @Override
+    public void inline()
+    {
+        inline( null );
+    }
+
+    private void inlineSemantics( SinkEventAttributes attributes, String semantic,
+            List<Tag> tags, Tag tag )
+    {
+        if ( attributes.containsAttribute( SinkEventAttributes.SEMANTICS, semantic ) )
+        {
+            writeStartTag( tag );
+            tags.add( 0, tag );
+        }
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public void inline( SinkEventAttributes attributes )
+    {
+        if ( !headFlag )
+        {
+            List<Tag> tags = new ArrayList<Tag>();
+
+            if ( attributes != null )
+            {
+                inlineSemantics( attributes, "emphasis", tags, HtmlMarkup.EM );
+                inlineSemantics( attributes, "strong", tags, HtmlMarkup.STRONG );
+                inlineSemantics( attributes, "small", tags, HtmlMarkup.SMALL );
+                inlineSemantics( attributes, "line-through", tags, HtmlMarkup.S );
+                inlineSemantics( attributes, "citation", tags, HtmlMarkup.CITE );
+                inlineSemantics( attributes, "quote", tags, HtmlMarkup.Q );
+                inlineSemantics( attributes, "definition", tags, HtmlMarkup.DFN );
+                inlineSemantics( attributes, "abbreviation", tags, HtmlMarkup.ABBR );
+                inlineSemantics( attributes, "italic", tags, HtmlMarkup.I );
+                inlineSemantics( attributes, "bold", tags, HtmlMarkup.B );
+                inlineSemantics( attributes, "code", tags, HtmlMarkup.CODE );
+                inlineSemantics( attributes, "variable", tags, HtmlMarkup.VAR );
+                inlineSemantics( attributes, "sample", tags, HtmlMarkup.SAMP );
+                inlineSemantics( attributes, "keyboard", tags, HtmlMarkup.KBD );
+                inlineSemantics( attributes, "superscript", tags, HtmlMarkup.SUP );
+                inlineSemantics( attributes, "subscript", tags, HtmlMarkup.SUB );
+                inlineSemantics( attributes, "annotation", tags, HtmlMarkup.U );
+                inlineSemantics( attributes, "highlight", tags, HtmlMarkup.MARK );
+                inlineSemantics( attributes, "ruby", tags, HtmlMarkup.RUBY );
+                inlineSemantics( attributes, "rubyBase", tags, HtmlMarkup.RB );
+                inlineSemantics( attributes, "rubyText", tags, HtmlMarkup.RT );
+                inlineSemantics( attributes, "rubyTextContainer", tags, HtmlMarkup.RTC );
+                inlineSemantics( attributes, "rubyParentheses", tags, HtmlMarkup.RP );
+                inlineSemantics( attributes, "bidirectionalIsolation", tags, HtmlMarkup.BDI );
+                inlineSemantics( attributes, "bidirectionalOverride", tags, HtmlMarkup.BDO );
+                inlineSemantics( attributes, "phrase", tags, HtmlMarkup.SPAN );
+                inlineSemantics( attributes, "insert", tags, HtmlMarkup.INS );
+                inlineSemantics( attributes, "delete", tags, HtmlMarkup.DEL );
+            }
+
+            inlineStack.push( tags );
+        }
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public void inline_()
+    {
+        if ( !headFlag )
+        {
+            for ( Tag tag: inlineStack.pop() )
+            {
+                writeEndTag( tag );
+            }
+        }
+    }
+
     /**
      * {@inheritDoc}
      * @see javax.swing.text.html.HTML.Tag#I
@@ -1673,10 +2034,7 @@ public class XhtmlBaseSink
     @Override
     public void italic()
     {
-        if ( !headFlag )
-        {
-            writeStartTag( HtmlMarkup.I );
-        }
+        inline( SinkEventAttributeSet.Semantics.ITALIC );
     }
 
     /**
@@ -1686,10 +2044,7 @@ public class XhtmlBaseSink
     @Override
     public void italic_()
     {
-        if ( !headFlag )
-        {
-            writeEndTag( HtmlMarkup.I );
-        }
+        inline_();
     }
 
     /**
@@ -1699,10 +2054,7 @@ public class XhtmlBaseSink
     @Override
     public void bold()
     {
-        if ( !headFlag )
-        {
-            writeStartTag( HtmlMarkup.B );
-        }
+        inline( SinkEventAttributeSet.Semantics.BOLD );
     }
 
     /**
@@ -1712,36 +2064,27 @@ public class XhtmlBaseSink
     @Override
     public void bold_()
     {
-        if ( !headFlag )
-        {
-            writeEndTag( HtmlMarkup.B );
-        }
+        inline_();
     }
 
     /**
      * {@inheritDoc}
-     * @see javax.swing.text.html.HTML.Tag#TT
+     * @see javax.swing.text.html.HTML.Tag#CODE
      */
     @Override
     public void monospaced()
     {
-        if ( !headFlag )
-        {
-            writeStartTag( HtmlMarkup.TT );
-        }
+        inline( SinkEventAttributeSet.Semantics.CODE );
     }
 
     /**
      * {@inheritDoc}
-     * @see javax.swing.text.html.HTML.Tag#TT
+     * @see javax.swing.text.html.HTML.Tag#CODE
      */
     @Override
     public void monospaced_()
     {
-        if ( !headFlag )
-        {
-            writeEndTag( HtmlMarkup.TT );
-        }
+        inline_();
     }
 
     /**
@@ -1774,6 +2117,32 @@ public class XhtmlBaseSink
         }
     }
 
+    /**
+     * {@inheritDoc}
+     * @see javax.swing.text.html.HTML.Tag#WBR
+     */
+    @Override
+    public void lineBreakOpportunity()
+    {
+        lineBreakOpportunity( null );
+    }
+
+    /**
+     * {@inheritDoc}
+     * @see javax.swing.text.html.HTML.Tag#WBR
+     */
+    @Override
+    public void lineBreakOpportunity( SinkEventAttributes attributes )
+    {
+        if ( !headFlag && !isVerbatimFlag() )
+        {
+            MutableAttributeSet atts = SinkUtils.filterAttributes(
+                attributes, SinkUtils.SINK_BR_ATTRIBUTES  );
+
+            writeSimpleTag( HtmlMarkup.WBR, atts );
+        }
+    }
+
     /** {@inheritDoc} */
     @Override
     public void pageBreak()
@@ -1817,48 +2186,7 @@ public class XhtmlBaseSink
     @Override
     public void text( String text, SinkEventAttributes attributes )
     {
-        if ( attributes == null )
-        {
-            text( text );
-        }
-        else
-        {
-            if ( attributes.containsAttribute( SinkEventAttributes.DECORATION, "underline" ) )
-            {
-                writeStartTag( HtmlMarkup.U );
-            }
-            if ( attributes.containsAttribute( SinkEventAttributes.DECORATION, "line-through" ) )
-            {
-                writeStartTag( HtmlMarkup.S );
-            }
-            if ( attributes.containsAttribute( SinkEventAttributes.VALIGN, "sub" ) )
-            {
-                writeStartTag( HtmlMarkup.SUB );
-            }
-            if ( attributes.containsAttribute( SinkEventAttributes.VALIGN, "sup" ) )
-            {
-                writeStartTag( HtmlMarkup.SUP );
-            }
-
-            text( text );
-
-            if ( attributes.containsAttribute( SinkEventAttributes.VALIGN, "sup" ) )
-            {
-                writeEndTag( HtmlMarkup.SUP );
-            }
-            if ( attributes.containsAttribute( SinkEventAttributes.VALIGN, "sub" ) )
-            {
-                writeEndTag( HtmlMarkup.SUB );
-            }
-            if ( attributes.containsAttribute( SinkEventAttributes.DECORATION, "line-through" ) )
-            {
-                writeEndTag( HtmlMarkup.S );
-            }
-            if ( attributes.containsAttribute( SinkEventAttributes.DECORATION, "underline" ) )
-            {
-                writeEndTag( HtmlMarkup.U );
-            }
-        }
+        text( text );
     }
 
     /** {@inheritDoc} */
@@ -1896,7 +2224,8 @@ public class XhtmlBaseSink
 
             if ( !originalComment.equals( comment ) )
             {
-                getLog().warn( "[Xhtml Sink] Modified invalid comment '" + originalComment + "' to '" + comment + "'" );
+                getLog().warn( "[Xhtml5 Sink] Modified invalid comment '" + originalComment
+                        + "' to '" + comment + "'" );
             }
 
             final StringBuilder buffer = new StringBuilder( comment.length() + 7 );
@@ -2173,7 +2502,7 @@ public class XhtmlBaseSink
      */
     private void logMessage( String key, String msg )
     {
-        final String mesg = "[XHTML Sink] " + msg;
+        final String mesg = "[XHTML5 Sink] " + msg;
         if ( getLog().isDebugEnabled() )
         {
             getLog().debug( mesg );
diff --git a/doxia-core/src/main/java/org/apache/maven/doxia/sink/impl/XhtmlBaseSink.java b/doxia-core/src/main/java/org/apache/maven/doxia/sink/impl/XhtmlBaseSink.java
index d03dd36..bf6c28a 100644
--- a/doxia-core/src/main/java/org/apache/maven/doxia/sink/impl/XhtmlBaseSink.java
+++ b/doxia-core/src/main/java/org/apache/maven/doxia/sink/impl/XhtmlBaseSink.java
@@ -22,11 +22,14 @@ package org.apache.maven.doxia.sink.impl;
 import java.io.PrintWriter;
 import java.io.StringWriter;
 import java.io.Writer;
+import java.util.ArrayList;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.LinkedList;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.Stack;
 import java.util.TreeSet;
 
 import javax.swing.text.MutableAttributeSet;
@@ -125,6 +128,9 @@ public class XhtmlBaseSink
      * */
     protected boolean tableRows = false;
 
+    /** Keep track of the closing tags for inline events. */
+    protected Stack<List<Tag>> inlineStack = new Stack<List<Tag>>();
+
     /** Map of warn messages with a String as key to describe the error type and a Set as value.
      * Using to reduce warn messages. */
     private Map<String, Set<String>> warnMessages;
@@ -1009,7 +1015,7 @@ public class XhtmlBaseSink
                 attributes, SinkUtils.SINK_BASE_ATTRIBUTES  ) );
 
             paragraph( atts );
-            italic();
+            inline( SinkEventAttributeSet.Semantics.ITALIC );
         }
     }
 
@@ -1023,7 +1029,7 @@ public class XhtmlBaseSink
         }
         else
         {
-            italic_();
+            inline_();
             paragraph_();
         }
     }
@@ -1068,6 +1074,105 @@ public class XhtmlBaseSink
     }
 
     /**
+     * {@inheritDoc}
+     * @see javax.swing.text.html.HTML.Tag#ADDRESS
+     */
+    @Override
+    public void address()
+    {
+        address( null );
+    }
+
+    /**
+     * {@inheritDoc}
+     * @see javax.swing.text.html.HTML.Tag#ADDRESS
+     */
+    @Override
+    public void address( SinkEventAttributes attributes )
+    {
+        MutableAttributeSet atts = SinkUtils.filterAttributes(
+                attributes, SinkUtils.SINK_SECTION_ATTRIBUTES  );
+
+        writeStartTag( HtmlMarkup.ADDRESS, atts );
+    }
+
+    /**
+     * {@inheritDoc}
+     * @see javax.swing.text.html.HTML.Tag#ADDRESS
+     */
+    @Override
+    public void address_()
+    {
+        writeEndTag( HtmlMarkup.ADDRESS );
+    }
+
+    /**
+     * {@inheritDoc}
+     * @see javax.swing.text.html.HTML.Tag#BLOCKQUOTE
+     */
+    @Override
+    public void blockquote()
+    {
+        blockquote( null );
+    }
+
+    /**
+     * {@inheritDoc}
+     * @see javax.swing.text.html.HTML.Tag#BLOCKQUOTE
+     */
+    @Override
+    public void blockquote( SinkEventAttributes attributes )
+    {
+        MutableAttributeSet atts = SinkUtils.filterAttributes(
+                attributes, SinkUtils.SINK_SECTION_ATTRIBUTES  );
+
+        writeStartTag( HtmlMarkup.BLOCKQUOTE, atts );
+    }
+
+    /**
+     * {@inheritDoc}
+     * @see javax.swing.text.html.HTML.Tag#BLOCKQUOTE
+     */
+    @Override
+    public void blockquote_()
+    {
+        writeEndTag( HtmlMarkup.BLOCKQUOTE );
+    }
+
+    /**
+     * {@inheritDoc}
+     * @see javax.swing.text.html.HTML.Tag#DIV
+     */
+    @Override
+    public void division()
+    {
+        division( null );
+    }
+
+    /**
+     * {@inheritDoc}
+     * @see javax.swing.text.html.HTML.Tag#DIV
+     */
+    @Override
+    public void division( SinkEventAttributes attributes )
+    {
+        MutableAttributeSet atts = SinkUtils.filterAttributes(
+                attributes, SinkUtils.SINK_SECTION_ATTRIBUTES  );
+
+        writeStartTag( HtmlMarkup.DIV, atts );
+    }
+
+    /**
+     * {@inheritDoc}
+     * @see javax.swing.text.html.HTML.Tag#DIV
+     */
+    @Override
+    public void division_()
+    {
+        writeEndTag( HtmlMarkup.DIV );
+    }
+
+    /**
      * The default class style for boxed is <code>source</code>.
      *
      * {@inheritDoc}
@@ -1666,6 +1771,74 @@ public class XhtmlBaseSink
         }
     }
 
+    /** {@inheritDoc} */
+    @Override
+    public void inline()
+    {
+        inline( null );
+    }
+
+    private void inlineSemantics( SinkEventAttributes attributes, String semantic,
+            List<Tag> tags, Tag tag )
+    {
+        if ( attributes.containsAttribute( SinkEventAttributes.SEMANTICS, semantic ) )
+        {
+            writeStartTag( tag );
+            tags.add( 0, tag );
+        }
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public void inline( SinkEventAttributes attributes )
+    {
+        if ( !headFlag )
+        {
+            List<Tag> tags = new ArrayList<Tag>();
+
+            if ( attributes != null )
+            {
+                inlineSemantics( attributes, "emphasis", tags, HtmlMarkup.EM );
+                inlineSemantics( attributes, "strong", tags, HtmlMarkup.STRONG );
+                inlineSemantics( attributes, "small", tags, HtmlMarkup.SMALL );
+                inlineSemantics( attributes, "line-through", tags, HtmlMarkup.S );
+                inlineSemantics( attributes, "citation", tags, HtmlMarkup.CITE );
+                inlineSemantics( attributes, "quote", tags, HtmlMarkup.Q );
+                inlineSemantics( attributes, "definition", tags, HtmlMarkup.DFN );
+                inlineSemantics( attributes, "abbreviation", tags, HtmlMarkup.ABBR );
+                inlineSemantics( attributes, "italic", tags, HtmlMarkup.I );
+                inlineSemantics( attributes, "bold", tags, HtmlMarkup.B );
+                inlineSemantics( attributes, "monospaced", tags, HtmlMarkup.TT );
+                inlineSemantics( attributes, "code", tags, HtmlMarkup.CODE );
+                inlineSemantics( attributes, "variable", tags, HtmlMarkup.VAR );
+                inlineSemantics( attributes, "sample", tags, HtmlMarkup.SAMP );
+                inlineSemantics( attributes, "keyboard", tags, HtmlMarkup.KBD );
+                inlineSemantics( attributes, "superscript", tags, HtmlMarkup.SUP );
+                inlineSemantics( attributes, "subscript", tags, HtmlMarkup.SUB );
+                inlineSemantics( attributes, "annotation", tags, HtmlMarkup.U );
+                inlineSemantics( attributes, "bidirectionalOverride", tags, HtmlMarkup.BDO );
+                inlineSemantics( attributes, "phrase", tags, HtmlMarkup.SPAN );
+                inlineSemantics( attributes, "insert", tags, HtmlMarkup.INS );
+                inlineSemantics( attributes, "delete", tags, HtmlMarkup.DEL );
+            }
+
+            inlineStack.push( tags );
+        }
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public void inline_()
+    {
+        if ( !headFlag )
+        {
+            for ( Tag tag: inlineStack.pop() )
+            {
+                writeEndTag( tag );
+            }
+        }
+    }
+
     /**
      * {@inheritDoc}
      * @see javax.swing.text.html.HTML.Tag#I
@@ -1673,10 +1846,7 @@ public class XhtmlBaseSink
     @Override
     public void italic()
     {
-        if ( !headFlag )
-        {
-            writeStartTag( HtmlMarkup.I );
-        }
+        inline( SinkEventAttributeSet.Semantics.ITALIC );
     }
 
     /**
@@ -1686,10 +1856,7 @@ public class XhtmlBaseSink
     @Override
     public void italic_()
     {
-        if ( !headFlag )
-        {
-            writeEndTag( HtmlMarkup.I );
-        }
+        inline_();
     }
 
     /**
@@ -1699,10 +1866,7 @@ public class XhtmlBaseSink
     @Override
     public void bold()
     {
-        if ( !headFlag )
-        {
-            writeStartTag( HtmlMarkup.B );
-        }
+        inline( SinkEventAttributeSet.Semantics.BOLD );
     }
 
     /**
@@ -1712,10 +1876,7 @@ public class XhtmlBaseSink
     @Override
     public void bold_()
     {
-        if ( !headFlag )
-        {
-            writeEndTag( HtmlMarkup.B );
-        }
+        inline_();
     }
 
     /**
@@ -1725,10 +1886,7 @@ public class XhtmlBaseSink
     @Override
     public void monospaced()
     {
-        if ( !headFlag )
-        {
-            writeStartTag( HtmlMarkup.TT );
-        }
+        inline( SinkEventAttributeSet.Semantics.MONOSPACED );
     }
 
     /**
@@ -1738,10 +1896,7 @@ public class XhtmlBaseSink
     @Override
     public void monospaced_()
     {
-        if ( !headFlag )
-        {
-            writeEndTag( HtmlMarkup.TT );
-        }
+        inline_();
     }
 
     /**
@@ -1817,48 +1972,7 @@ public class XhtmlBaseSink
     @Override
     public void text( String text, SinkEventAttributes attributes )
     {
-        if ( attributes == null )
-        {
-            text( text );
-        }
-        else
-        {
-            if ( attributes.containsAttribute( SinkEventAttributes.DECORATION, "underline" ) )
-            {
-                writeStartTag( HtmlMarkup.U );
-            }
-            if ( attributes.containsAttribute( SinkEventAttributes.DECORATION, "line-through" ) )
-            {
-                writeStartTag( HtmlMarkup.S );
-            }
-            if ( attributes.containsAttribute( SinkEventAttributes.VALIGN, "sub" ) )
-            {
-                writeStartTag( HtmlMarkup.SUB );
-            }
-            if ( attributes.containsAttribute( SinkEventAttributes.VALIGN, "sup" ) )
-            {
-                writeStartTag( HtmlMarkup.SUP );
-            }
-
-            text( text );
-
-            if ( attributes.containsAttribute( SinkEventAttributes.VALIGN, "sup" ) )
-            {
-                writeEndTag( HtmlMarkup.SUP );
-            }
-            if ( attributes.containsAttribute( SinkEventAttributes.VALIGN, "sub" ) )
-            {
-                writeEndTag( HtmlMarkup.SUB );
-            }
-            if ( attributes.containsAttribute( SinkEventAttributes.DECORATION, "line-through" ) )
-            {
-                writeEndTag( HtmlMarkup.S );
-            }
-            if ( attributes.containsAttribute( SinkEventAttributes.DECORATION, "underline" ) )
-            {
-                writeEndTag( HtmlMarkup.U );
-            }
-        }
+        text( text );
     }
 
     /** {@inheritDoc} */
diff --git a/doxia-core/src/test/java/org/apache/maven/doxia/parser/XhtmlBaseParserTest.java b/doxia-core/src/test/java/org/apache/maven/doxia/parser/Xhtml5BaseParserTest.java
similarity index 74%
copy from doxia-core/src/test/java/org/apache/maven/doxia/parser/XhtmlBaseParserTest.java
copy to doxia-core/src/test/java/org/apache/maven/doxia/parser/Xhtml5BaseParserTest.java
index 593194c..ee1ac18 100644
--- a/doxia-core/src/test/java/org/apache/maven/doxia/parser/XhtmlBaseParserTest.java
+++ b/doxia-core/src/test/java/org/apache/maven/doxia/parser/Xhtml5BaseParserTest.java
@@ -28,22 +28,18 @@ import org.apache.maven.doxia.sink.impl.SinkEventTestingSink;
 
 /**
  * Test for XhtmlBaseParser.
- *
- * @author ltheussl
- * @version $Id$
- * @since 1.1
  */
-public class XhtmlBaseParserTest
+public class Xhtml5BaseParserTest
     extends AbstractParserTest
 {
-    private XhtmlBaseParser parser;
+    private Xhtml5BaseParser parser;
     private final SinkEventTestingSink sink = new SinkEventTestingSink();
 
 
     @Override
     protected Parser createParser()
     {
-        parser = new XhtmlBaseParser();
+        parser = new Xhtml5BaseParser();
         parser.getLog().setLogLevel( Log.LEVEL_ERROR );
         return parser;
     }
@@ -59,7 +55,7 @@ public class XhtmlBaseParserTest
     {
         super.setUp();
 
-        parser = new XhtmlBaseParser();
+        parser = new Xhtml5BaseParser();
         parser.getLog().setLogLevel( Log.LEVEL_ERROR );
         sink.reset();
     }
@@ -208,17 +204,17 @@ public class XhtmlBaseParserTest
         Iterator<SinkEventElement> it = sink.getEventList().iterator();
 
         assertEquals( "paragraph", it.next().getName() );
-        assertEquals( "bold", it.next().getName() );
+        assertEquals( "inline", it.next().getName() );
         assertEquals( "text", it.next().getName() );
-        assertEquals( "bold_", it.next().getName() );
+        assertEquals( "inline_", it.next().getName() );
 
         SinkEventElement el = it.next();
         assertEquals( "text", el.getName() );
         assertEquals( " ",  (String) el.getArgs()[0] );
 
-        assertEquals( "italic", it.next().getName() );
+        assertEquals( "inline", it.next().getName() );
         assertEquals( "text", it.next().getName() );
-        assertEquals( "italic_", it.next().getName() );
+        assertEquals( "inline_", it.next().getName() );
         assertEquals( "paragraph_", it.next().getName() );
         assertFalse( it.hasNext() );
 
@@ -232,18 +228,18 @@ public class XhtmlBaseParserTest
         it = sink.getEventList().iterator();
 
         assertEquals( "paragraph", it.next().getName() );
-        assertEquals( "bold", it.next().getName() );
+        assertEquals( "inline", it.next().getName() );
         assertEquals( "text", it.next().getName() );
-        assertEquals( "bold_", it.next().getName() );
+        assertEquals( "inline_", it.next().getName() );
 
         el = it.next();
         assertEquals( "text", el.getName() );
         // according to section 2.11 of the XML spec, parsers must normalize line breaks to "\n"
         assertEquals( "\n",  (String) el.getArgs()[0] );
 
-        assertEquals( "italic", it.next().getName() );
+        assertEquals( "inline", it.next().getName() );
         assertEquals( "text", it.next().getName() );
-        assertEquals( "italic_", it.next().getName() );
+        assertEquals( "inline_", it.next().getName() );
         assertEquals( "paragraph_", it.next().getName() );
         assertFalse( it.hasNext() );
 
@@ -257,9 +253,9 @@ public class XhtmlBaseParserTest
 
         assertEquals( "paragraph", it.next().getName() );
         assertEquals( "text", it.next().getName() );
-        assertEquals( "italic", it.next().getName() );
+        assertEquals( "inline", it.next().getName() );
         assertEquals( "text", it.next().getName() );
-        assertEquals( "italic_", it.next().getName() );
+        assertEquals( "inline_", it.next().getName() );
 
         el = it.next();
         assertEquals( "text", el.getName() );
@@ -340,7 +336,7 @@ public class XhtmlBaseParserTest
         sb.append( "<!ENTITY foo2 \"&#x161;\">" ).append( XhtmlBaseParser.EOL );
         sb.append( "<!ENTITY tritPos \"&#x1d7ed;\">" ).append( XhtmlBaseParser.EOL );
         sb.append( "]>" ).append( XhtmlBaseParser.EOL );
-        sb.append( "<b>&foo;&foo1;&foo2;&tritPos;</b>" );
+        sb.append( "<p>&foo;&foo1;&foo2;&tritPos;</p>" );
 
         parser.setValidate( false );
         parser.parse( sb.toString(), sink );
@@ -348,7 +344,7 @@ public class XhtmlBaseParserTest
         Iterator<SinkEventElement> it = sink.getEventList().iterator();
 
         SinkEventElement event = it.next();
-        assertEquals( "bold", event.getName() );
+        assertEquals( "paragraph", event.getName() );
 
         event = it.next();
         assertEquals( "text", event.getName() );
@@ -367,7 +363,7 @@ public class XhtmlBaseParserTest
         assertEquals( "\uD835\uDFED",  (String) event.getArgs()[0] );
 
         event = it.next();
-        assertEquals( "bold_", event.getName() );
+        assertEquals( "paragraph_", event.getName() );
     }
 
     /** @throws Exception  */
@@ -433,6 +429,8 @@ public class XhtmlBaseParserTest
         assertEquals( "A", textEvt.getArgs()[0] );
 
         assertEquals( "paragraph_", it.next().getName() );
+// FIXME
+//        assertEquals( "section1_", it.next().getName() );
 
         assertFalse( it.hasNext() );
     }
@@ -441,7 +439,7 @@ public class XhtmlBaseParserTest
     public void testXhtmlEntities()
         throws Exception
     {
-        final String text = "<body><h2>&laquo;&reg;</h2><p>&ldquo;&rsquo;&Phi;&larr;</p></body>";
+        final String text = "<body><h2>&quot;&amp;</h2><p>&apos;&lt;&gt;</p></body>";
 
         parser.parse( text, sink );
 
@@ -450,41 +448,28 @@ public class XhtmlBaseParserTest
         assertEquals( "section1", it.next().getName() );
         assertEquals( "sectionTitle1", it.next().getName() );
 
-        // Couple symbols from Latin-1:
-        // http://www.w3.org/TR/xhtml1/dtds.html#a_dtd_Latin-1_characters
-
         SinkEventElement textEvt = it.next();
         assertEquals( "text", textEvt.getName() );
-        assertEquals( "\u00AB", textEvt.getArgs()[0] );
+        assertEquals( "\"", textEvt.getArgs()[0] );
 
         textEvt = it.next();
         assertEquals( "text", textEvt.getName() );
-        assertEquals( "\u00AE", textEvt.getArgs()[0] );
+        assertEquals( "&", textEvt.getArgs()[0] );
 
         assertEquals( "sectionTitle1_", it.next().getName() );
         assertEquals( "paragraph", it.next().getName() );
 
-        // Couple symbols from Special characters:
-        // http://www.w3.org/TR/xhtml1/dtds.html#a_dtd_Special_characters
-
-        textEvt = it.next();
-        assertEquals( "text", textEvt.getName() );
-        assertEquals( "\u201C", textEvt.getArgs()[0] );
-
         textEvt = it.next();
         assertEquals( "text", textEvt.getName() );
-        assertEquals( "\u2019", textEvt.getArgs()[0] );
-
-        // Couple symbols from Symbols:
-        // http://www.w3.org/TR/xhtml1/dtds.html#a_dtd_Symbols
+        assertEquals( "\'", textEvt.getArgs()[0] );
 
         textEvt = it.next();
         assertEquals( "text", textEvt.getName() );
-        assertEquals( "\u03A6", textEvt.getArgs()[0] );
+        assertEquals( "<", textEvt.getArgs()[0] );
 
         textEvt = it.next();
         assertEquals( "text", textEvt.getName() );
-        assertEquals( "\u2190", textEvt.getArgs()[0] );
+        assertEquals( ">", textEvt.getArgs()[0] );
 
         assertEquals( "paragraph_", it.next().getName() );
 
@@ -492,41 +477,6 @@ public class XhtmlBaseParserTest
     }
 
     /** @throws Exception  */
-    public void testDecoration()
-        throws Exception
-    {
-        String text = "<div><u>u</u><s>s</s><del>del</del><strike>strike</strike><sub>sub</sub><sup>sup</sup></div>";
-        parser.parse( text, sink );
-        Iterator<SinkEventElement> it = sink.getEventList().iterator();
-
-        SinkEventElement event = it.next();
-        assertEquals( "text", event.getName() );
-        assertEquals( "u",  (String) event.getArgs()[0] );
-
-        event = it.next();
-        assertEquals( "text", event.getName() );
-        assertEquals( "s",  (String) event.getArgs()[0] );
-
-        event = it.next();
-        assertEquals( "text", event.getName() );
-        assertEquals( "del",  (String) event.getArgs()[0] );
-
-        event = it.next();
-        assertEquals( "text", event.getName() );
-        assertEquals( "strike",  (String) event.getArgs()[0] );
-
-        event = it.next();
-        assertEquals( "text", event.getName() );
-        assertEquals( "sub",  (String) event.getArgs()[0] );
-
-        event = it.next();
-        assertEquals( "text", event.getName() );
-        assertEquals( "sup",  (String) event.getArgs()[0] );
-//        assertTrue( ( (SinkEventAttributeSet) event.getArgs()[1] )
-//                .containsAttribute( SinkEventAttributeSet.VALIGN, "sup" ) ); // TODO
-    }
-
-    /** @throws Exception  */
     public void testLists()
         throws Exception
     {
@@ -534,6 +484,7 @@ public class XhtmlBaseParserTest
         parser.parse( text, sink );
         Iterator<SinkEventElement> it = sink.getEventList().iterator();
 
+        assertEquals( "division", it.next().getName() );
         assertEquals( "list", it.next().getName() );
         assertEquals( "listItem", it.next().getName() );
         assertEquals( "listItem_", it.next().getName() );
@@ -552,45 +503,179 @@ public class XhtmlBaseParserTest
         assertEquals( "definition_", it.next().getName() );
         assertEquals( "definitionListItem_", it.next().getName() );
         assertEquals( "definitionList_", it.next().getName() );
+        assertEquals( "division_", it.next().getName() );
     }
 
     /** @throws Exception  */
-    public void testStyles()
+    public void testSimpleTags()
         throws Exception
     {
-        String text = "<div><b></b><strong></strong><i></i><em></em><code></code><samp></samp><tt></tt></div>";
+        String text = "<div><br /><wbr /><hr /><img src=\"img.src\"/></div>";
         parser.parse( text, sink );
         Iterator<SinkEventElement> it = sink.getEventList().iterator();
 
-        assertEquals( "bold", it.next().getName() );
-        assertEquals( "bold_", it.next().getName() );
-        assertEquals( "bold", it.next().getName() );
-        assertEquals( "bold_", it.next().getName() );
-
-        assertEquals( "italic", it.next().getName() );
-        assertEquals( "italic_", it.next().getName() );
-        assertEquals( "italic", it.next().getName() );
-        assertEquals( "italic_", it.next().getName() );
-
-        assertEquals( "monospaced", it.next().getName() );
-        assertEquals( "monospaced_", it.next().getName() );
-        assertEquals( "monospaced", it.next().getName() );
-        assertEquals( "monospaced_", it.next().getName() );
-        assertEquals( "monospaced", it.next().getName() );
-        assertEquals( "monospaced_", it.next().getName() );
+        assertEquals( "division", it.next().getName() );
+        assertEquals( "lineBreak", it.next().getName() );
+        assertEquals( "lineBreakOpportunity", it.next().getName() );
+        assertEquals( "horizontalRule", it.next().getName() );
+        assertEquals( "figureGraphics", it.next().getName() );
+        assertEquals( "division_", it.next().getName() );
     }
 
     /** @throws Exception  */
-    public void testSimpleTags()
+    public void testSemanticTags()
         throws Exception
     {
-        String text = "<div><br/><hr/><img src=\"img.src\"/></div>";
+        String text = "<em><strong><small><s><cite><q><dfn><abbr><i><b><code><var><samp><kbd><sup><sub><u><mark><ruby><rb><rt><rtc><rp><bdi><bdo><span><ins><del>a text &amp; &#xc6;</del></ins></span></bdo></bdi></rp></rtc></rt></rb></ruby></mark></u></sub></sup></kbd></samp></var></code></b></i></abbr></dfn></q></cite></s></small></strong></em>";
         parser.parse( text, sink );
         Iterator<SinkEventElement> it = sink.getEventList().iterator();
 
-        assertEquals( "lineBreak", it.next().getName() );
-        assertEquals( "horizontalRule", it.next().getName() );
-        assertEquals( "figureGraphics", it.next().getName() );
+        SinkEventElement event = it.next();
+        assertEquals( "inline", event.getName() );
+        assertEquals( "semantics=emphasis",  event.getArgs()[0].toString().trim() );
+
+        event = it.next();
+        assertEquals( "inline", event.getName() );
+        assertEquals( "semantics=strong",  event.getArgs()[0].toString().trim() );
+
+        event = it.next();
+        assertEquals( "inline", event.getName() );
+        assertEquals( "semantics=small",  event.getArgs()[0].toString().trim() );
+
+        event = it.next();
+        assertEquals( "inline", event.getName() );
+        assertEquals( "semantics=line-through",  event.getArgs()[0].toString().trim() );
+
+        event = it.next();
+        assertEquals( "inline", event.getName() );
+        assertEquals( "semantics=citation",  event.getArgs()[0].toString().trim() );
+
+        event = it.next();
+        assertEquals( "inline", event.getName() );
+        assertEquals( "semantics=quote",  event.getArgs()[0].toString().trim() );
+
+        event = it.next();
+        assertEquals( "inline", event.getName() );
+        assertEquals( "semantics=definition",  event.getArgs()[0].toString().trim() );
+
+        event = it.next();
+        assertEquals( "inline", event.getName() );
+        assertEquals( "semantics=abbreviation",  event.getArgs()[0].toString().trim() );
+
+        event = it.next();
+        assertEquals( "inline", event.getName() );
+        assertEquals( "semantics=italic",  event.getArgs()[0].toString().trim() );
+
+        event = it.next();
+        assertEquals( "inline", event.getName() );
+        assertEquals( "semantics=bold",  event.getArgs()[0].toString().trim() );
+
+        event = it.next();
+        assertEquals( "inline", event.getName() );
+        assertEquals( "semantics=code",  event.getArgs()[0].toString().trim() );
+
+        event = it.next();
+        assertEquals( "inline", event.getName() );
+        assertEquals( "semantics=variable",  event.getArgs()[0].toString().trim() );
+
+        event = it.next();
+        assertEquals( "inline", event.getName() );
+        assertEquals( "semantics=sample",  event.getArgs()[0].toString().trim() );
+
+        event = it.next();
+        assertEquals( "inline", event.getName() );
+        assertEquals( "semantics=keyboard",  event.getArgs()[0].toString().trim() );
+
+        event = it.next();
+        assertEquals( "inline", event.getName() );
+        assertEquals( "semantics=superscript",  event.getArgs()[0].toString().trim() );
+
+        event = it.next();
+        assertEquals( "inline", event.getName() );
+        assertEquals( "semantics=subscript",  event.getArgs()[0].toString().trim() );
+
+        event = it.next();
+        assertEquals( "inline", event.getName() );
+        assertEquals( "semantics=annotation",  event.getArgs()[0].toString().trim() );
+
+        event = it.next();
+        assertEquals( "inline", event.getName() );
+        assertEquals( "semantics=highlight",  event.getArgs()[0].toString().trim() );
+
+        event = it.next();
+        assertEquals( "inline", event.getName() );
+        assertEquals( "semantics=ruby",  event.getArgs()[0].toString().trim() );
+
+        event = it.next();
+        assertEquals( "inline", event.getName() );
+        assertEquals( "semantics=rubyBase",  event.getArgs()[0].toString().trim() );
+
+        event = it.next();
+        assertEquals( "inline", event.getName() );
+        assertEquals( "semantics=rubyText",  event.getArgs()[0].toString().trim() );
+
+        event = it.next();
+        assertEquals( "inline", event.getName() );
+        assertEquals( "semantics=rubyTextContainer",  event.getArgs()[0].toString().trim() );
+
+        event = it.next();
+        assertEquals( "inline", event.getName() );
+        assertEquals( "semantics=rubyParentheses",  event.getArgs()[0].toString().trim() );
+
+        event = it.next();
+        assertEquals( "inline", event.getName() );
+        assertEquals( "semantics=bidirectionalIsolation",  event.getArgs()[0].toString().trim() );
+
+        event = it.next();
+        assertEquals( "inline", event.getName() );
+        assertEquals( "semantics=bidirectionalOverride",  event.getArgs()[0].toString().trim() );
+
+        event = it.next();
+        assertEquals( "inline", event.getName() );
+        assertEquals( "semantics=phrase",  event.getArgs()[0].toString().trim() );
+
+        event = it.next();
+        assertEquals( "inline", event.getName() );
+        assertEquals( "semantics=insert",  event.getArgs()[0].toString().trim() );
+
+        event = it.next();
+        assertEquals( "inline", event.getName() );
+        assertEquals( "semantics=delete",  event.getArgs()[0].toString().trim() );
+
+        assertEquals( "text", it.next().getName() );
+        assertEquals( "text", it.next().getName() );
+        assertEquals( "text", it.next().getName() );
+        assertEquals( "text", it.next().getName() );
+
+        assertEquals( "inline_", it.next().getName() );
+        assertEquals( "inline_", it.next().getName() );
+        assertEquals( "inline_", it.next().getName() );
+        assertEquals( "inline_", it.next().getName() );
+        assertEquals( "inline_", it.next().getName() );
+        assertEquals( "inline_", it.next().getName() );
+        assertEquals( "inline_", it.next().getName() );
+        assertEquals( "inline_", it.next().getName() );
+        assertEquals( "inline_", it.next().getName() );
+        assertEquals( "inline_", it.next().getName() );
+        assertEquals( "inline_", it.next().getName() );
+        assertEquals( "inline_", it.next().getName() );
+        assertEquals( "inline_", it.next().getName() );
+        assertEquals( "inline_", it.next().getName() );
+        assertEquals( "inline_", it.next().getName() );
+        assertEquals( "inline_", it.next().getName() );
+        assertEquals( "inline_", it.next().getName() );
+        assertEquals( "inline_", it.next().getName() );
+        assertEquals( "inline_", it.next().getName() );
+        assertEquals( "inline_", it.next().getName() );
+        assertEquals( "inline_", it.next().getName() );
+        assertEquals( "inline_", it.next().getName() );
+        assertEquals( "inline_", it.next().getName() );
+        assertEquals( "inline_", it.next().getName() );
+        assertEquals( "inline_", it.next().getName() );
+        assertEquals( "inline_", it.next().getName() );
+        assertEquals( "inline_", it.next().getName() );
+        assertEquals( "inline_", it.next().getName() );
+
     }
 
     /** @throws Exception  */
@@ -643,7 +728,7 @@ public class XhtmlBaseParserTest
     public void testFigure()
         throws Exception
     {
-        String text = "<div class=\"figure\"><p><img src=\"src.jpg\"/></p><p><i></i></p></div>";
+        String text = "<figure><img src=\"src.jpg\"/><figcaption></figcaption></figure>";
         parser.parse( text, sink );
         Iterator<SinkEventElement> it = sink.getEventList().iterator();
 
@@ -670,6 +755,9 @@ public class XhtmlBaseParserTest
         Iterator<SinkEventElement> it = sink.getEventList().iterator();
 
         SinkEventElement element = it.next();
+        assertEquals( "division", element.getName() );
+
+        element = it.next();
         assertEquals( "link", element.getName() );
         assertEquals( "", element.getArgs()[0] );
         assertEquals( "link_", it.next().getName() );
@@ -703,6 +791,9 @@ public class XhtmlBaseParserTest
         assertEquals( "anchor", element.getName() );
         assertEquals( "a1invalid", element.getArgs()[0] );
         assertEquals( "anchor_", it.next().getName() );
+
+        element = it.next();
+        assertEquals( "division_", element.getName() );
     }
 
     /**
@@ -740,7 +831,7 @@ public class XhtmlBaseParserTest
         // ampersand should be un-escaped
         assertEquals( "http://ex.com/ex.jpg?v=l&l=e", attribs.getAttribute( "src" ) );
     }
-    
+
     public void testUnbalancedDefinitionListItem() throws Exception
     {
         String text = "<body><dl><dt>key</dt><dd>value</dd></dl>" +
diff --git a/doxia-core/src/test/java/org/apache/maven/doxia/parser/XhtmlBaseParserTest.java b/doxia-core/src/test/java/org/apache/maven/doxia/parser/XhtmlBaseParserTest.java
index 593194c..45f8a3d 100644
--- a/doxia-core/src/test/java/org/apache/maven/doxia/parser/XhtmlBaseParserTest.java
+++ b/doxia-core/src/test/java/org/apache/maven/doxia/parser/XhtmlBaseParserTest.java
@@ -208,17 +208,17 @@ public class XhtmlBaseParserTest
         Iterator<SinkEventElement> it = sink.getEventList().iterator();
 
         assertEquals( "paragraph", it.next().getName() );
-        assertEquals( "bold", it.next().getName() );
+        assertEquals( "inline", it.next().getName() );
         assertEquals( "text", it.next().getName() );
-        assertEquals( "bold_", it.next().getName() );
+        assertEquals( "inline_", it.next().getName() );
 
         SinkEventElement el = it.next();
         assertEquals( "text", el.getName() );
         assertEquals( " ",  (String) el.getArgs()[0] );
 
-        assertEquals( "italic", it.next().getName() );
+        assertEquals( "inline", it.next().getName() );
         assertEquals( "text", it.next().getName() );
-        assertEquals( "italic_", it.next().getName() );
+        assertEquals( "inline_", it.next().getName() );
         assertEquals( "paragraph_", it.next().getName() );
         assertFalse( it.hasNext() );
 
@@ -232,18 +232,18 @@ public class XhtmlBaseParserTest
         it = sink.getEventList().iterator();
 
         assertEquals( "paragraph", it.next().getName() );
-        assertEquals( "bold", it.next().getName() );
+        assertEquals( "inline", it.next().getName() );
         assertEquals( "text", it.next().getName() );
-        assertEquals( "bold_", it.next().getName() );
+        assertEquals( "inline_", it.next().getName() );
 
         el = it.next();
         assertEquals( "text", el.getName() );
         // according to section 2.11 of the XML spec, parsers must normalize line breaks to "\n"
         assertEquals( "\n",  (String) el.getArgs()[0] );
 
-        assertEquals( "italic", it.next().getName() );
+        assertEquals( "inline", it.next().getName() );
         assertEquals( "text", it.next().getName() );
-        assertEquals( "italic_", it.next().getName() );
+        assertEquals( "inline_", it.next().getName() );
         assertEquals( "paragraph_", it.next().getName() );
         assertFalse( it.hasNext() );
 
@@ -257,9 +257,9 @@ public class XhtmlBaseParserTest
 
         assertEquals( "paragraph", it.next().getName() );
         assertEquals( "text", it.next().getName() );
-        assertEquals( "italic", it.next().getName() );
+        assertEquals( "inline", it.next().getName() );
         assertEquals( "text", it.next().getName() );
-        assertEquals( "italic_", it.next().getName() );
+        assertEquals( "inline_", it.next().getName() );
 
         el = it.next();
         assertEquals( "text", el.getName() );
@@ -348,7 +348,7 @@ public class XhtmlBaseParserTest
         Iterator<SinkEventElement> it = sink.getEventList().iterator();
 
         SinkEventElement event = it.next();
-        assertEquals( "bold", event.getName() );
+        assertEquals( "inline", event.getName() );
 
         event = it.next();
         assertEquals( "text", event.getName() );
@@ -367,7 +367,7 @@ public class XhtmlBaseParserTest
         assertEquals( "\uD835\uDFED",  (String) event.getArgs()[0] );
 
         event = it.next();
-        assertEquals( "bold_", event.getName() );
+        assertEquals( "inline_", event.getName() );
     }
 
     /** @throws Exception  */
@@ -492,41 +492,6 @@ public class XhtmlBaseParserTest
     }
 
     /** @throws Exception  */
-    public void testDecoration()
-        throws Exception
-    {
-        String text = "<div><u>u</u><s>s</s><del>del</del><strike>strike</strike><sub>sub</sub><sup>sup</sup></div>";
-        parser.parse( text, sink );
-        Iterator<SinkEventElement> it = sink.getEventList().iterator();
-
-        SinkEventElement event = it.next();
-        assertEquals( "text", event.getName() );
-        assertEquals( "u",  (String) event.getArgs()[0] );
-
-        event = it.next();
-        assertEquals( "text", event.getName() );
-        assertEquals( "s",  (String) event.getArgs()[0] );
-
-        event = it.next();
-        assertEquals( "text", event.getName() );
-        assertEquals( "del",  (String) event.getArgs()[0] );
-
-        event = it.next();
-        assertEquals( "text", event.getName() );
-        assertEquals( "strike",  (String) event.getArgs()[0] );
-
-        event = it.next();
-        assertEquals( "text", event.getName() );
-        assertEquals( "sub",  (String) event.getArgs()[0] );
-
-        event = it.next();
-        assertEquals( "text", event.getName() );
-        assertEquals( "sup",  (String) event.getArgs()[0] );
-//        assertTrue( ( (SinkEventAttributeSet) event.getArgs()[1] )
-//                .containsAttribute( SinkEventAttributeSet.VALIGN, "sup" ) ); // TODO
-    }
-
-    /** @throws Exception  */
     public void testLists()
         throws Exception
     {
@@ -555,42 +520,72 @@ public class XhtmlBaseParserTest
     }
 
     /** @throws Exception  */
-    public void testStyles()
+    public void testSimpleTags()
         throws Exception
     {
-        String text = "<div><b></b><strong></strong><i></i><em></em><code></code><samp></samp><tt></tt></div>";
+        String text = "<div><br/><hr/><img src=\"img.src\"/></div>";
         parser.parse( text, sink );
         Iterator<SinkEventElement> it = sink.getEventList().iterator();
 
-        assertEquals( "bold", it.next().getName() );
-        assertEquals( "bold_", it.next().getName() );
-        assertEquals( "bold", it.next().getName() );
-        assertEquals( "bold_", it.next().getName() );
-
-        assertEquals( "italic", it.next().getName() );
-        assertEquals( "italic_", it.next().getName() );
-        assertEquals( "italic", it.next().getName() );
-        assertEquals( "italic_", it.next().getName() );
-
-        assertEquals( "monospaced", it.next().getName() );
-        assertEquals( "monospaced_", it.next().getName() );
-        assertEquals( "monospaced", it.next().getName() );
-        assertEquals( "monospaced_", it.next().getName() );
-        assertEquals( "monospaced", it.next().getName() );
-        assertEquals( "monospaced_", it.next().getName() );
+        assertEquals( "lineBreak", it.next().getName() );
+        assertEquals( "horizontalRule", it.next().getName() );
+        assertEquals( "figureGraphics", it.next().getName() );
     }
 
     /** @throws Exception  */
-    public void testSimpleTags()
+    public void testSemanticTags()
         throws Exception
     {
-        String text = "<div><br/><hr/><img src=\"img.src\"/></div>";
+        String text = "<s><i><b><code><samp><sup><sub><u>a text &amp; &#xc6;</u></sub></sup></samp></code></b></i></s>";
         parser.parse( text, sink );
         Iterator<SinkEventElement> it = sink.getEventList().iterator();
 
-        assertEquals( "lineBreak", it.next().getName() );
-        assertEquals( "horizontalRule", it.next().getName() );
-        assertEquals( "figureGraphics", it.next().getName() );
+        SinkEventElement event = it.next();
+        assertEquals( "inline", event.getName() );
+        assertEquals( "semantics=line-through",  event.getArgs()[0].toString().trim() );
+
+        event = it.next();
+        assertEquals( "inline", event.getName() );
+        assertEquals( "semantics=italic",  event.getArgs()[0].toString().trim() );
+
+        event = it.next();
+        assertEquals( "inline", event.getName() );
+        assertEquals( "semantics=bold",  event.getArgs()[0].toString().trim() );
+
+        event = it.next();
+        assertEquals( "inline", event.getName() );
+        assertEquals( "semantics=monospaced",  event.getArgs()[0].toString().trim() );
+
+        event = it.next();
+        assertEquals( "inline", event.getName() );
+        assertEquals( "semantics=monospaced",  event.getArgs()[0].toString().trim() );
+
+        event = it.next();
+        assertEquals( "inline", event.getName() );
+        assertEquals( "semantics=superscript",  event.getArgs()[0].toString().trim() );
+
+        event = it.next();
+        assertEquals( "inline", event.getName() );
+        assertEquals( "semantics=subscript",  event.getArgs()[0].toString().trim() );
+
+        event = it.next();
+        assertEquals( "inline", event.getName() );
+        assertEquals( "semantics=annotation",  event.getArgs()[0].toString().trim() );
+
+        assertEquals( "text", it.next().getName() );
+        assertEquals( "text", it.next().getName() );
+        assertEquals( "text", it.next().getName() );
+        assertEquals( "text", it.next().getName() );
+
+        assertEquals( "inline_", it.next().getName() );
+        assertEquals( "inline_", it.next().getName() );
+        assertEquals( "inline_", it.next().getName() );
+        assertEquals( "inline_", it.next().getName() );
+        assertEquals( "inline_", it.next().getName() );
+        assertEquals( "inline_", it.next().getName() );
+        assertEquals( "inline_", it.next().getName() );
+        assertEquals( "inline_", it.next().getName() );
+
     }
 
     /** @throws Exception  */
diff --git a/doxia-core/src/test/java/org/apache/maven/doxia/sink/impl/AbstractSinkTest.java b/doxia-core/src/test/java/org/apache/maven/doxia/sink/impl/AbstractSinkTest.java
index 11627f0..df84ffe 100644
--- a/doxia-core/src/test/java/org/apache/maven/doxia/sink/impl/AbstractSinkTest.java
+++ b/doxia-core/src/test/java/org/apache/maven/doxia/sink/impl/AbstractSinkTest.java
@@ -35,9 +35,6 @@ import static org.junit.Assert.assertThat;
 
 /**
  * Abstract base class to test sinks.
- *
- * @version $Id$
- * @since 1.0
  */
 public abstract class AbstractSinkTest
     extends AbstractModuleTest
@@ -233,6 +230,60 @@ public abstract class AbstractSinkTest
     }
 
     /**
+     * Checks that the sequence <code>[article(), article_()]</code>,
+     * invoked on the current sink, produces the same result as
+     * {@link #getArticleBlock getArticleBlock()}.
+     */
+    public void testArticle()
+    {
+        sink.article();
+        sink.article_();
+        sink.flush();
+        sink.close();
+
+        String actual = testWriter.toString();
+        String expected = getArticleBlock();
+
+        assertEquals( "Wrong article!", expected, actual );
+    }
+
+    /**
+     * Checks that the sequence <code>[navigation(), navigation_()]</code>,
+     * invoked on the current sink, produces the same result as
+     * {@link #getNavigationBlock getNavigationBlock()}.
+     */
+    public void testNavigation()
+    {
+        sink.navigation();
+        sink.navigation_();
+        sink.flush();
+        sink.close();
+
+        String actual = testWriter.toString();
+        String expected = getNavigationBlock();
+
+        assertEquals( "Wrong navigation!", expected, actual );
+    }
+
+    /**
+     * Checks that the sequence <code>[sidebar(), sidebar_()]</code>,
+     * invoked on the current sink, produces the same result as
+     * {@link #getSidebarBlock getSidebarBlock()}.
+     */
+    public void testSidebar()
+    {
+        sink.sidebar();
+        sink.sidebar_();
+        sink.flush();
+        sink.close();
+
+        String actual = testWriter.toString();
+        String expected = getSidebarBlock();
+
+        assertEquals( "Wrong sidebar!", expected, actual );
+    }
+
+    /**
      * Checks that the sequence <code>[sectionTitle(), text( title ),
      * sectionTitle_()]</code>, invoked on the current sink, produces
      * the same result as
@@ -263,9 +314,11 @@ public abstract class AbstractSinkTest
     {
         String title = "Title1";
         sink.section1();
+        sink.header();
         sink.sectionTitle1();
         sink.text( title );
         sink.sectionTitle1_();
+        sink.header_();
         sink.section1_();
         sink.flush();
         sink.close();
@@ -286,9 +339,11 @@ public abstract class AbstractSinkTest
     {
         String title = "Title2";
         sink.section2();
+        sink.header();
         sink.sectionTitle2();
         sink.text( title );
         sink.sectionTitle2_();
+        sink.header_();
         sink.section2_();
         sink.flush();
         sink.close();
@@ -309,9 +364,11 @@ public abstract class AbstractSinkTest
     {
         String title = "Title3";
         sink.section3();
+        sink.header();
         sink.sectionTitle3();
         sink.text( title );
         sink.sectionTitle3_();
+        sink.header_();
         sink.section3_();
         sink.flush();
         sink.close();
@@ -333,9 +390,11 @@ public abstract class AbstractSinkTest
     {
         String title = "Title4";
         sink.section4();
+        sink.header();
         sink.sectionTitle4();
         sink.text( title );
         sink.sectionTitle4_();
+        sink.header_();
         sink.section4_();
         sink.flush();
         sink.close();
@@ -356,9 +415,11 @@ public abstract class AbstractSinkTest
     {
         String title = "Title5";
         sink.section5();
+        sink.header();
         sink.sectionTitle5();
         sink.text( title );
         sink.sectionTitle5_();
+        sink.header_();
         sink.section5_();
         sink.flush();
         sink.close();
@@ -370,6 +431,62 @@ public abstract class AbstractSinkTest
     }
 
     /**
+     * Checks that the sequence <code>[header(), header_()]</code>,
+     * invoked on the current sink, produces the same result as
+     * {@link #getHeaderBlock getHeaderBlock()}.
+     */
+    public void testHeader()
+    {
+        sink.header();
+        sink.header_();
+        sink.flush();
+        sink.close();
+
+        String actual = testWriter.toString();
+        String expected = getHeaderBlock();
+
+        assertEquals( "Wrong header!", expected, actual );
+    }
+
+    /**
+     * Checks that the sequence <code>[content(), content(), content_(), content_()]</code>,
+     * invoked on the current sink, produces the same result as
+     * {@link #getContentBlock getContentBlock()}.
+     */
+    public void testContent()
+    {
+        sink.content();
+        sink.content();
+        sink.content_();
+        sink.content_();
+        sink.flush();
+        sink.close();
+
+        String actual = testWriter.toString();
+        String expected = getContentBlock();
+
+        assertEquals( "Wrong content!", expected, actual );
+    }
+
+    /**
+     * Checks that the sequence <code>[footer(), footer_()]</code>,
+     * invoked on the current sink, produces the same result as
+     * {@link #getHeaderBlock getHeaderBlock()}.
+     */
+    public void testFooter()
+    {
+        sink.footer();
+        sink.footer_();
+        sink.flush();
+        sink.close();
+
+        String actual = testWriter.toString();
+        String expected = getFooterBlock();
+
+        assertEquals( "Wrong footer!", expected, actual );
+    }
+
+    /**
      * Checks that the sequence <code>[list(), listItem(), text( item ),
      * listItem_(), list_()]</code>, invoked on the current sink, produces
      * the same result as {@link #getListBlock getListBlock}( item ).
@@ -564,6 +681,108 @@ public abstract class AbstractSinkTest
     }
 
     /**
+     * Checks that the sequence <code>[data(), text( text ),
+     * data_()]</code>, invoked on the current sink, produces
+     * the same result as {@link #getDataBlock getDataBlock}( text ).
+     */
+    public void testData()
+    {
+        String value = "Value";
+        String text = "Text";
+        sink.data( value );
+        sink.text( text );
+        sink.data_();
+        sink.flush();
+        sink.close();
+
+        String actual = testWriter.toString();
+        String expected = getDataBlock( value, text );
+
+        assertEquals( "Wrong data!", expected, actual );
+    }
+
+    /**
+     * Checks that the sequence <code>[time(), text( text ),
+     * time_()]</code>, invoked on the current sink, produces
+     * the same result as {@link #getTimeBlock getTimeBlock}( text ).
+     */
+    public void testTime()
+    {
+        String datetime = "DateTime";
+        String text = "Text";
+        sink.time( datetime );
+        sink.text( text );
+        sink.time_();
+        sink.flush();
+        sink.close();
+
+        String actual = testWriter.toString();
+        String expected = getTimeBlock( datetime, text );
+
+        assertEquals( "Wrong time!", expected, actual );
+    }
+
+    /**
+     * Checks that the sequence <code>[address(), text( text ),
+     * address_()]</code>, invoked on the current sink, produces
+     * the same result as {@link #getAddressBlock getAddressBlock}( text ).
+     */
+    public void testAddress()
+    {
+        String text = "Text";
+        sink.address();
+        sink.text( text );
+        sink.address_();
+        sink.flush();
+        sink.close();
+
+        String actual = testWriter.toString();
+        String expected = getAddressBlock( text );
+
+        assertEquals( "Wrong address!", expected, actual );
+    }
+
+    /**
+     * Checks that the sequence <code>[blockquote(), text( text ),
+     * blockquote_()]</code>, invoked on the current sink, produces
+     * the same result as {@link #getBlackquoteBlock getBlockquoteBlock}( text ).
+     */
+    public void testBlockquote()
+    {
+        String text = "Text";
+        sink.blockquote();
+        sink.text( text );
+        sink.blockquote_();
+        sink.flush();
+        sink.close();
+
+        String actual = testWriter.toString();
+        String expected = getBlockquoteBlock( text );
+
+        assertEquals( "Wrong blockquote!", expected, actual );
+    }
+
+    /**
+     * Checks that the sequence <code>[division(), text( text ),
+     * division_()]</code>, invoked on the current sink, produces
+     * the same result as {@link #getDivisionBlock getDivisionBlock}( text ).
+     */
+    public void testDivider()
+    {
+        String text = "Text";
+        sink.division();
+        sink.text( text );
+        sink.division_();
+        sink.flush();
+        sink.close();
+
+        String actual = testWriter.toString();
+        String expected = getDivisionBlock( text );
+
+        assertEquals( "Wrong division!", expected, actual );
+    }
+
+    /**
      * Checks that the sequence <code>[verbatim( SinkEventAttributeSet.BOXED ), text( text ),
      * verbatim_()]</code>, invoked on the current sink, produces the
      * same result as {@link #getVerbatimBlock getVerbatimBlock}( text ).
@@ -659,63 +878,83 @@ public abstract class AbstractSinkTest
     }
 
     /**
-     * Checks that the sequence <code>[italic(), text( text ), italic_()]</code>,
+     * Checks that the sequence <code>[inline(), text( text ), inline_()]</code>,
+     * invoked on the current sink, produces the same result as
+     * {@link #getInlineBlock getInlineBlock}( text ).
+     */
+    public void testInline()
+    {
+        String text = "Inline";
+        sink.inline();
+        sink.text( text );
+        sink.inline_();
+        sink.flush();
+        sink.close();
+
+        String actual = testWriter.toString();
+        String expected = getInlineBlock( text );
+
+        assertEquals( "Wrong inline!", expected, actual );
+    }
+
+    /**
+     * Checks that the sequence <code>[inline(bold), text( text ), inline_()]</code>,
      * invoked on the current sink, produces the same result as
-     * {@link #getItalicBlock getItalicBlock}( text ).
+     * {@link #getInlineBoldBlock getInlineBoldBlock}( text ).
      */
-    public void testItalic()
+    public void testInlineBold()
     {
-        String text = "Italic";
-        sink.italic();
+        String text = "InlineBold";
+        sink.inline( SinkEventAttributeSet.Semantics.BOLD );
         sink.text( text );
-        sink.italic_();
+        sink.inline_();
         sink.flush();
         sink.close();
 
         String actual = testWriter.toString();
-        String expected = getItalicBlock( text );
+        String expected = getInlineBoldBlock( text );
 
-        assertEquals( "Wrong italic!", expected, actual );
+        assertEquals( "Wrong inline bold!", expected, actual );
     }
 
     /**
-     * Checks that the sequence <code>[bold(), text( text ), bold_()]</code>,
+     * Checks that the sequence <code>[inline(italic), text( text ), inline_()]</code>,
      * invoked on the current sink, produces the same result as
-     * {@link #getBoldBlock getBoldBlock}( text ).
+     * {@link #getInlineBoldBlock getInlineBoldBlock}( text ).
      */
-    public void testBold()
+    public void testInlineItalic()
     {
-        String text = "Bold";
-        sink.bold();
+        String text = "InlineItalic";
+        sink.inline( SinkEventAttributeSet.Semantics.ITALIC );
         sink.text( text );
-        sink.bold_();
+        sink.inline_();
         sink.flush();
         sink.close();
 
         String actual = testWriter.toString();
-        String expected = getBoldBlock( text );
+        String expected = getInlineItalicBlock( text );
 
-        assertEquals( "Wrong bold!", expected, actual );
+        assertEquals( "Wrong inline italic!", expected, actual );
     }
 
     /**
-     * Checks that the sequence <code>[monospaced(), text( text ),
-     * monospaced_()]</code>, invoked on the current sink, produces the same
-     * result as {@link #getMonospacedBlock getMonospacedBlock}( text ).
+     * Checks that the sequence <code>[inline(code), text( text ), inline_()]</code>,
+     * invoked on the current sink, produces the same result as
+     * {@link #getInlineBoldBlock getInlineBoldBlock}( text ).
      */
-    public void testMonospaced()
+    public void testInlineCode()
     {
-        String text = "Monospaced";
-        sink.monospaced();
+        String text = "InlineCode";
+        sink.inline( SinkEventAttributeSet.Semantics.CODE );
         sink.text( text );
-        sink.monospaced_();
+        sink.inline_();
         sink.flush();
         sink.close();
 
         String actual = testWriter.toString();
-        String expected = getMonospacedBlock( text );
+        String expected = getInlineCodeBlock( text );
 
-        assertEquals( "Wrong monospaced!", expected, actual );
+        assertEquals( "Wrong inline code!", expected, actual );
     }
 
     /**
@@ -736,6 +975,23 @@ public abstract class AbstractSinkTest
     }
 
     /**
+     * Checks that the sequence <code>[lineBreakOpportunity()]</code>,
+     * invoked on the current sink, produces the same result as
+     * {@link #getLineBreakOpportunityBlock getLineBreakOpportunityBlock()}.
+     */
+    public void testLineBreakOpportunity()
+    {
+        sink.lineBreakOpportunity();
+        sink.flush();
+        sink.close();
+
+        String actual = testWriter.toString();
+        String expected = getLineBreakOpportunityBlock();
+
+        assertEquals( "Wrong lineBreakOpportunity!", expected, actual );
+    }
+
+    /**
      * Checks that the sequence <code>[nonBreakingSpace()]</code>,
      * invoked on the current sink, produces the same result as
      * {@link #getNonBreakingSpaceBlock getNonBreakingSpaceBlock()}.
@@ -910,6 +1166,27 @@ public abstract class AbstractSinkTest
     protected abstract String getBodyBlock();
 
     /**
+     * Returns an article block generated by this sink.
+     * @return The result of invoking an article block on the current sink.
+     * @see #testArticle()
+     */
+    protected abstract String getArticleBlock();
+
+    /**
+     * Returns an navigation block generated by this sink.
+     * @return The result of invoking an navigation block on the current sink.
+     * @see #testNavigation()
+     */
+    protected abstract String getNavigationBlock();
+
+    /**
+     * Returns a sidebar block generated by this sink.
+     * @return The result of invoking an sidebar block on the current sink.
+     * @see #testSidebar()
+     */
+    protected abstract String getSidebarBlock();
+
+    /**
      * Returns a SectionTitle block generated by this sink.
      * @param title The title to use.
      * @return The result of invoking a SectionTitle block on the current sink.
@@ -958,6 +1235,27 @@ public abstract class AbstractSinkTest
     protected abstract String getSection5Block( String title );
 
     /**
+     * Returns a header block generated by this sink.
+     * @return The result of invoking a header block on the current sink.
+     * @see #testHeader()
+     */
+    protected abstract String getHeaderBlock();
+
+    /**
+     * Returns a content block generated by this sink.
+     * @return The result of invoking a content block on the current sink.
+     * @see #testContent()
+     */
+    protected abstract String getContentBlock();
+
+    /**
+     * Returns a footer block generated by this sink.
+     * @return The result of invoking a footer block on the current sink.
+     * @see #testFooter()
+     */
+    protected abstract String getFooterBlock();
+
+    /**
      * Returns a list block generated by this sink.
      * @param item The item to use.
      * @return The result of invoking a list block on the current sink.
@@ -1010,6 +1308,48 @@ public abstract class AbstractSinkTest
     protected abstract String getParagraphBlock( String text );
 
     /**
+     * Returns a Data block generated by this sink.
+     * @param value The value to use.
+     * @param text The text to use.
+     * @return The result of invoking a Data block on the current sink.
+     * @see #testData()
+     */
+    protected abstract String getDataBlock( String value, String text );
+
+    /**
+     * Returns a Time block generated by this sink.
+     * @param datetime The datetime to use.
+     * @param text The text to use.
+     * @return The result of invoking a Time block on the current sink.
+     * @see #testTime()
+     */
+    protected abstract String getTimeBlock( String datetime, String text );
+
+    /**
+     * Returns an Address block generated by this sink.
+     * @param text The text to use.
+     * @return The result of invoking an Address block on the current sink.
+     * @see #testAddress()
+     */
+    protected abstract String getAddressBlock( String text );
+
+    /**
+     * Returns a Blockquote block generated by this sink.
+     * @param text The text to use.
+     * @return The result of invoking a Blockquote block on the current sink.
+     * @see #testBlockquote()
+     */
+    protected abstract String getBlockquoteBlock( String text );
+
+    /**
+     * Returns a Division block generated by this sink.
+     * @param text The text to use.
+     * @return The result of invoking a Division block on the current sink.
+     * @see #testDivision()
+     */
+    protected abstract String getDivisionBlock( String text );
+
+    /**
      * Returns a Verbatim block generated by this sink.
      * @param text The text to use.
      * @return The result of invoking a Verbatim block on the current sink.
@@ -1049,28 +1389,36 @@ public abstract class AbstractSinkTest
     protected abstract String getLinkBlock( String link, String text );
 
     /**
-     * Returns a Italic block generated by this sink.
+     * Returns an Inline block generated by this sink.
+     * @param text The text to use.
+     * @return The result of invoking a Inline block on the current sink.
+     * @see #testInline()
+     */
+    protected abstract String getInlineBlock( String text );
+
+    /**
+     * Returns an Inline italic block generated by this sink.
      * @param text The text to use.
-     * @return The result of invoking a Italic block on the current sink.
-     * @see #testItalic()
+     * @return The result of invoking a Inline italic block on the current sink.
+     * @see #testInlineItalic()
      */
-    protected abstract String getItalicBlock( String text );
+    protected abstract String getInlineItalicBlock( String text );
 
     /**
-     * Returns a Bold block generated by this sink.
+     * Returns an Inline bold block generated by this sink.
      * @param text The text to use.
-     * @return The result of invoking a Bold block on the current sink.
-     * @see #testBold()
+     * @return The result of invoking a Inline bold block on the current sink.
+     * @see #testInlineBold()
      */
-    protected abstract String getBoldBlock( String text );
+    protected abstract String getInlineBoldBlock( String text );
 
     /**
-     * Returns a Monospaced block generated by this sink.
+     * Returns an Inline code block generated by this sink.
      * @param text The text to use.
-     * @return The result of invoking a Monospaced block on the current sink.
-     * @see #testMonospaced()
+     * @return The result of invoking a Inline code block on the current sink.
+     * @see #testInlineBold()
      */
-    protected abstract String getMonospacedBlock( String text );
+    protected abstract String getInlineCodeBlock( String text );
 
     /**
      * Returns a LineBreak block generated by this sink.
@@ -1080,6 +1428,14 @@ public abstract class AbstractSinkTest
     protected abstract String getLineBreakBlock();
 
     /**
+     * Returns a LineBreakOpportunity block generated by this sink.
+     * @return The result of invoking a LineBreakOpportunity block on the
+     * current sink.
+     * @see #testLineBreakOpportunity()
+     */
+    protected abstract String getLineBreakOpportunityBlock();
+
+    /**
      * Returns a NonBreakingSpace block generated by this sink.
      * @return The result of invoking a NonBreakingSpace block
      * on the current sink.
diff --git a/doxia-core/src/test/java/org/apache/maven/doxia/sink/impl/SinkAdapterTest.java b/doxia-core/src/test/java/org/apache/maven/doxia/sink/impl/SinkAdapterTest.java
index 1ec9fca..e2b870e 100644
--- a/doxia-core/src/test/java/org/apache/maven/doxia/sink/impl/SinkAdapterTest.java
+++ b/doxia-core/src/test/java/org/apache/maven/doxia/sink/impl/SinkAdapterTest.java
@@ -54,6 +54,36 @@ public class SinkAdapterTest
     }
 
     /**
+     * Test of article method, of class SinkAdapter.
+     */
+    public void testArticle()
+    {
+        instance.article();
+        instance.article( null );
+        instance.article_();
+    }
+
+    /**
+     * Test of navigation method, of class SinkAdapter.
+     */
+    public void testNavigation()
+    {
+        instance.navigation();
+        instance.navigation( null );
+        instance.navigation_();
+    }
+
+    /**
+     * Test of sidebar method, of class SinkAdapter.
+     */
+    public void testSidebar()
+    {
+        instance.sidebar();
+        instance.sidebar( null );
+        instance.sidebar_();
+    }
+
+    /**
      * Test of section1 method, of class SinkAdapter.
      */
     public void testSection1()
@@ -328,6 +358,36 @@ public class SinkAdapterTest
     }
 
     /**
+     * Test of header method, of class SinkAdapter.
+     */
+    public void testHeader()
+    {
+        instance.header();
+        instance.header( null );
+        instance.header_();
+    }
+
+    /**
+     * Test of content method, of class SinkAdapter.
+     */
+    public void testContent()
+    {
+        instance.content();
+        instance.content( null );
+        instance.content_();
+    }
+
+    /**
+     * Test of footer method, of class SinkAdapter.
+     */
+    public void testFooter()
+    {
+        instance.footer();
+        instance.footer( null );
+        instance.footer_();
+    }
+
+    /**
      * Test of paragraph method, of class SinkAdapter.
      */
     public void testParagraph()
@@ -338,6 +398,58 @@ public class SinkAdapterTest
     }
 
     /**
+     * Test of data method, of class SinkAdapter.
+     */
+    public void testData()
+    {
+        String value = "";
+        instance.data( value );
+        instance.data( value, null );
+        instance.data_();
+    }
+
+    /**
+     * Test of time method, of class SinkAdapter.
+     */
+    public void testTime()
+    {
+        String datetime = "";
+        instance.time( datetime );
+        instance.time( datetime, null );
+        instance.time_();
+    }
+
+    /**
+     * Test of address method, of class SinkAdapter.
+     */
+    public void testAddress()
+    {
+        instance.address();
+        instance.address( null );
+        instance.address_();
+    }
+
+    /**
+     * Test of blockquote method, of class SinkAdapter.
+     */
+    public void testBlockquote()
+    {
+        instance.blockquote();
+        instance.blockquote( null );
+        instance.blockquote_();
+    }
+
+    /**
+     * Test of division method, of class SinkAdapter.
+     */
+    public void testDivision()
+    {
+        instance.division();
+        instance.division( null );
+        instance.division_();
+    }
+
+    /**
      * Test of verbatim method, of class SinkAdapter.
      */
     public void testVerbatim()
@@ -449,12 +561,22 @@ public class SinkAdapterTest
     }
 
     /**
+     * Test of inline method, of class SinkAdapter.
+     */
+    public void testInline()
+    {
+        instance.inline();
+        instance.inline( null );
+        instance.inline_();
+    }
+
+    /**
      * Test of italic method, of class SinkAdapter.
      */
     public void testItalic()
     {
-        instance.italic();
-        instance.italic_();
+        instance.inline( SinkEventAttributeSet.Semantics.ITALIC );
+        instance.inline_();
     }
 
     /**
@@ -462,8 +584,8 @@ public class SinkAdapterTest
      */
     public void testBold()
     {
-        instance.bold();
-        instance.bold_();
+        instance.inline( SinkEventAttributeSet.Semantics.BOLD );
+        instance.inline_();
     }
 
     /**
@@ -471,8 +593,8 @@ public class SinkAdapterTest
      */
     public void testMonospaced()
     {
-        instance.monospaced();
-        instance.monospaced_();
+        instance.inline( SinkEventAttributeSet.Semantics.MONOSPACED );
+        instance.inline_();
     }
 
     /**
@@ -485,6 +607,15 @@ public class SinkAdapterTest
     }
 
     /**
+     * Test of lineBreakOpportunity method, of class SinkAdapter.
+     */
+    public void testLineBreakOpportunities()
+    {
+        instance.lineBreakOpportunity();
+        instance.lineBreakOpportunity( null );
+    }
+
+    /**
      * Test of nonBreakingSpace method, of class SinkAdapter.
      */
     public void testNonBreakingSpace()
diff --git a/doxia-core/src/test/java/org/apache/maven/doxia/sink/impl/SinkEventTestingSink.java b/doxia-core/src/test/java/org/apache/maven/doxia/sink/impl/SinkEventTestingSink.java
index 492db2d..b9d4651 100644
--- a/doxia-core/src/test/java/org/apache/maven/doxia/sink/impl/SinkEventTestingSink.java
+++ b/doxia-core/src/test/java/org/apache/maven/doxia/sink/impl/SinkEventTestingSink.java
@@ -84,6 +84,42 @@ public class SinkEventTestingSink
     }
 
     @Override
+    public void article()
+    {
+        addEvent( "article" );
+    }
+
+    @Override
+    public void article_()
+    {
+        addEvent( "article_" );
+    }
+
+    @Override
+    public void navigation()
+    {
+        addEvent( "navigation" );
+    }
+
+    @Override
+    public void navigation_()
+    {
+        addEvent( "navigation_" );
+    }
+
+    @Override
+    public void sidebar()
+    {
+        addEvent( "sidebar" );
+    }
+
+    @Override
+    public void sidebar_()
+    {
+        addEvent( "sidebar_" );
+    }
+
+    @Override
     public void section1()
     {
         addEvent( "section1" );
@@ -408,6 +444,42 @@ public class SinkEventTestingSink
     }
 
     @Override
+    public void header()
+    {
+        addEvent( "header" );
+    }
+
+    @Override
+    public void header_()
+    {
+        addEvent( "header_" );
+    }
+
+    @Override
+    public void content()
+    {
+        addEvent( "content" );
+    }
+
+    @Override
+    public void content_()
+    {
+        addEvent( "content_" );
+    }
+
+    @Override
+    public void footer()
+    {
+        addEvent( "footer" );
+    }
+
+    @Override
+    public void footer_()
+    {
+        addEvent( "footer_" );
+    }
+
+    @Override
     public void paragraph()
     {
         addEvent( "paragraph" );
@@ -420,6 +492,66 @@ public class SinkEventTestingSink
     }
 
     @Override
+    public void data( String value )
+    {
+        addEvent( "data", new Object[] {value} );
+    }
+
+    @Override
+    public void data_()
+    {
+        addEvent( "data_" );
+    }
+
+    @Override
+    public void time( String datetime )
+    {
+        addEvent( "time", new Object[] {datetime} );
+    }
+
+    @Override
+    public void time_()
+    {
+        addEvent( "time_" );
+    }
+
+    @Override
+    public void address()
+    {
+        addEvent( "address" );
+    }
+
+    @Override
+    public void address_()
+    {
+        addEvent( "address_" );
+    }
+
+    @Override
+    public void blockquote()
+    {
+        addEvent( "blockquote" );
+    }
+
+    @Override
+    public void blockquote_()
+    {
+        addEvent( "blockquote_" );
+    }
+
+    @Override
+    public void division()
+    {
+        addEvent( "division" );
+    }
+
+    @Override
+    public void division_()
+    {
+        addEvent( "division_" );
+    }
+
+    @Override
     public void verbatim( boolean boxed )
     {
         addEvent( "verbatim", new Object[] {new Boolean( boxed )} );
@@ -546,6 +678,18 @@ public class SinkEventTestingSink
     }
 
     @Override
+    public void inline()
+    {
+        addEvent( "inline" );
+    }
+
+    @Override
+    public void inline_()
+    {
+        addEvent( "inline_" );
+    }
+
+    @Override
     public void italic()
     {
         addEvent( "italic" );
@@ -588,6 +732,12 @@ public class SinkEventTestingSink
     }
 
     @Override
+    public void lineBreakOpportunity()
+    {
+        addEvent( "lineBreakOpportunity" );
+    }
+
+    @Override
     public void nonBreakingSpace()
     {
         addEvent( "nonBreakingSpace" );
@@ -654,6 +804,24 @@ public class SinkEventTestingSink
     }
 
     @Override
+    public void article( SinkEventAttributes attributes )
+    {
+        addEvent( "article", new Object[] {attributes} );
+    }
+
+    @Override
+    public void navigation( SinkEventAttributes attributes )
+    {
+        addEvent( "navigation", new Object[] {attributes} );
+    }
+
+    @Override
+    public void sidebar( SinkEventAttributes attributes )
+    {
+        addEvent( "sidebar", new Object[] {attributes} );
+    }
+
+    @Override
     public void section( int level, SinkEventAttributes attributes )
     {
         addEvent( "section" + level, new Object[] {attributes} );
@@ -679,6 +847,24 @@ public class SinkEventTestingSink
     }
 
     @Override
+    public void header( SinkEventAttributes attributes )
+    {
+        addEvent( "header", new Object[] {attributes} );
+    }
+
+    @Override
+    public void content( SinkEventAttributes attributes )
+    {
+        addEvent( "content", new Object[] {attributes} );
+    }
+
+    @Override
+    public void footer( SinkEventAttributes attributes )
+    {
+        addEvent( "footer", new Object[] {attributes} );
+    }
+
+    @Override
     public void list( SinkEventAttributes attributes )
     {
         addEvent( "list", new Object[] {attributes} );
@@ -781,6 +967,36 @@ public class SinkEventTestingSink
     }
 
     @Override
+    public void data( String value, SinkEventAttributes attributes )
+    {
+        addEvent( "data", new Object[] {value, attributes} );
+    }
+
+    @Override
+    public void time( String datetime, SinkEventAttributes attributes )
+    {
+        addEvent( "time", new Object[] {datetime, attributes} );
+    }
+
+    @Override
+    public void address( SinkEventAttributes attributes )
+    {
+        addEvent( "address", new Object[] {attributes} );
+    }
+
+    @Override
+    public void blockquote( SinkEventAttributes attributes )
+    {
+        addEvent( "blockquote", new Object[] {attributes} );
+    }
+
+    @Override
+    public void division( SinkEventAttributes attributes )
+    {
+        addEvent( "division", new Object[] {attributes} );
+    }
+
+    @Override
     public void verbatim( SinkEventAttributes attributes )
     {
         addEvent( "verbatim", new Object[] {attributes} );
@@ -805,12 +1021,24 @@ public class SinkEventTestingSink
     }
 
     @Override
+    public void inline( SinkEventAttributes attributes )
+    {
+        addEvent( "inline", new Object[] {attributes} );
+    }
+
+    @Override
     public void lineBreak( SinkEventAttributes attributes )
     {
         addEvent( "lineBreak", new Object[] {attributes} );
     }
 
     @Override
+    public void lineBreakOpportunity( SinkEventAttributes attributes )
+    {
+        addEvent( "lineBreakOpportunity", new Object[] {attributes} );
+    }
+
+    @Override
     public void text( String text, SinkEventAttributes attributes )
     {
         addEvent( "text", new Object[] {text, attributes} );
diff --git a/doxia-core/src/test/java/org/apache/maven/doxia/sink/impl/SinkTestDocument.java b/doxia-core/src/test/java/org/apache/maven/doxia/sink/impl/SinkTestDocument.java
index 077d034..39626ca 100644
--- a/doxia-core/src/test/java/org/apache/maven/doxia/sink/impl/SinkTestDocument.java
+++ b/doxia-core/src/test/java/org/apache/maven/doxia/sink/impl/SinkTestDocument.java
@@ -445,19 +445,19 @@ public class SinkTestDocument
     {
         sink.paragraph();
 
-        sink.italic();
+        sink.inline( SinkEventAttributeSet.Semantics.ITALIC );
         sink.text( "Italic" );
-        sink.italic_();
+        sink.inline_();
         sink.text( " font. " );
 
-        sink.bold();
+        sink.inline( SinkEventAttributeSet.Semantics.BOLD );
         sink.text( "Bold" );
-        sink.bold_();
+        sink.inline_();
         sink.text( " font. " );
 
-        sink.monospaced();
-        sink.text( "Monospaced" );
-        sink.monospaced_();
+        sink.inline( SinkEventAttributeSet.Semantics.CODE );
+        sink.text( "Monospaced (code)" );
+        sink.inline_();
         sink.text( " font." );
 
         sink.paragraph_();
diff --git a/doxia-core/src/test/java/org/apache/maven/doxia/sink/impl/TextSink.java b/doxia-core/src/test/java/org/apache/maven/doxia/sink/impl/TextSink.java
index 88cc712..7ec5b61 100644
--- a/doxia-core/src/test/java/org/apache/maven/doxia/sink/impl/TextSink.java
+++ b/doxia-core/src/test/java/org/apache/maven/doxia/sink/impl/TextSink.java
@@ -71,6 +71,42 @@ public class TextSink
     }
 
     @Override
+    public void article()
+    {
+        writeln( "begin:article" );
+    }
+
+    @Override
+    public void article_()
+    {
+        writeln( "end:article" );
+    }
+
+    @Override
+    public void navigation()
+    {
+        writeln( "begin:navigation" );
+    }
+
+    @Override
+    public void navigation_()
+    {
+        writeln( "end:navigation" );
+    }
+
+    @Override
+    public void sidebar()
+    {
+        writeln( "begin:sidebar" );
+    }
+
+    @Override
+    public void sidebar_()
+    {
+        writeln( "end:sidebar" );
+    }
+
+    @Override
     public void section1()
     {
         write( "begin:section1" );
@@ -395,6 +431,42 @@ public class TextSink
     }
 
     @Override
+    public void header()
+    {
+        write( "begin:header" );
+    }
+
+    @Override
+    public void header_()
+    {
+        writeln( "end:header" );
+    }
+
+    @Override
+    public void content()
+    {
+        write( "begin:content" );
+    }
+
+    @Override
+    public void content_()
+    {
+        writeln( "end:content" );
+    }
+
+    @Override
+    public void footer()
+    {
+        write( "begin:footer" );
+    }
+
+    @Override
+    public void footer_()
+    {
+        writeln( "end:footer" );
+    }
+
+    @Override
     public void paragraph()
     {
         write( "begin:paragraph" );
@@ -407,6 +479,66 @@ public class TextSink
     }
 
     @Override
+    public void data( String value )
+    {
+        write( "begin:data, value: " + value );
+    }
+
+    @Override
+    public void data_()
+    {
+        writeln( "end:data" );
+    }
+
+    @Override
+    public void time( String datetime )
+    {
+        write( "begin:time, datetime: " + datetime );
+    }
+
+    @Override
+    public void time_()
+    {
+        writeln( "end:time" );
+    }
+
+    @Override
+    public void address()
+    {
+        write( "begin:address" );
+    }
+
+    @Override
+    public void address_()
+    {
+        writeln( "end:address" );
+    }
+
+    @Override
+    public void blockquote()
+    {
+        write( "begin:blockquote" );
+    }
+
+    @Override
+    public void blockquote_()
+    {
+        writeln( "end:blockquote" );
+    }
+
+    @Override
+    public void division()
+    {
+        write( "begin:division" );
+    }
+
+    @Override
+    public void division_()
+    {
+        writeln( "end:division" );
+    }
+
+    @Override
     public void verbatim( boolean boxed )
     {
         write( "begin:verbatim, boxed: " + boxed );
@@ -533,6 +665,18 @@ public class TextSink
     }
 
     @Override
+    public void inline()
+    {
+        write( "begin:inline" );
+    }
+
+    @Override
+    public void inline_()
+    {
+        writeln( "end:inline" );
+    }
+
+    @Override
     public void italic()
     {
         write( "begin:italic" );
@@ -575,6 +719,12 @@ public class TextSink
     }
 
     @Override
+    public void lineBreakOpportunity()
+    {
+        write( "lineBreakOpportunity" );
+    }
+
+    @Override
     public void nonBreakingSpace()
     {
         write( "nonBreakingSpace" );
@@ -655,6 +805,24 @@ public class TextSink
     }
 
     @Override
+    public void article( SinkEventAttributes attributes )
+    {
+        article();
+    }
+
+    @Override
+    public void navigation( SinkEventAttributes attributes )
+    {
+        navigation();
+    }
+
+    @Override
+    public void sidebar( SinkEventAttributes attributes )
+    {
+        sidebar();
+    }
+
+    @Override
     public void section( int level, SinkEventAttributes attributes )
     {
         write( "begin:section" + level );
@@ -679,6 +847,24 @@ public class TextSink
     }
 
     @Override
+    public void header( SinkEventAttributes attributes )
+    {
+        header();
+    }
+
+    @Override
+    public void content( SinkEventAttributes attributes )
+    {
+        content();
+    }
+
+    @Override
+    public void footer( SinkEventAttributes attributes )
+    {
+        footer();
+    }
+
+    @Override
     public void list( SinkEventAttributes attributes )
     {
         list();
@@ -781,6 +967,36 @@ public class TextSink
     }
 
     @Override
+    public void data( String value, SinkEventAttributes attributes )
+    {
+        data( value );
+    }
+
+    @Override
+    public void time( String datetime, SinkEventAttributes attributes )
+    {
+        time( datetime );
+    }
+
+    @Override
+    public void address( SinkEventAttributes attributes )
+    {
+        address();
+    }
+
+    @Override
+    public void blockquote( SinkEventAttributes attributes )
+    {
+        blockquote();
+    }
+
+    @Override
+    public void division( SinkEventAttributes attributes )
+    {
+        division();
+    }
+
+    @Override
     public void verbatim( SinkEventAttributes attributes )
     {
         boolean boxed = false;
@@ -813,12 +1029,24 @@ public class TextSink
     }
 
     @Override
+    public void inline( SinkEventAttributes attributes )
+    {
+        inline();
+    }
+
+    @Override
     public void lineBreak( SinkEventAttributes attributes )
     {
         lineBreak();
     }
 
     @Override
+    public void lineBreakOpportunity( SinkEventAttributes attributes )
+    {
+        lineBreakOpportunity();
+    }
+
+    @Override
     public void text( String text, SinkEventAttributes attributes )
     {
         text( text );
diff --git a/doxia-core/src/test/java/org/apache/maven/doxia/sink/impl/WellformednessCheckingSink.java b/doxia-core/src/test/java/org/apache/maven/doxia/sink/impl/WellformednessCheckingSink.java
index c0ed641..01ddaef 100644
--- a/doxia-core/src/test/java/org/apache/maven/doxia/sink/impl/WellformednessCheckingSink.java
+++ b/doxia-core/src/test/java/org/apache/maven/doxia/sink/impl/WellformednessCheckingSink.java
@@ -66,6 +66,42 @@ public class WellformednessCheckingSink
     }
 
     @Override
+    public void article()
+    {
+        startElement( "article" );
+    }
+
+    @Override
+    public void article_()
+    {
+        checkWellformedness( "article" );
+    }
+
+    @Override
+    public void navigation()
+    {
+        startElement( "navigation" );
+    }
+
+    @Override
+    public void navigation_()
+    {
+        checkWellformedness( "navigation" );
+    }
+
+    @Override
+    public void sidebar()
+    {
+        startElement( "sidebar" );
+    }
+
+    @Override
+    public void sidebar_()
+    {
+        checkWellformedness( "sidebar" );
+    }
+
+    @Override
     public void section1()
     {
         startElement( "section1" );
@@ -138,6 +174,42 @@ public class WellformednessCheckingSink
     }
 
     @Override
+    public void header()
+    {
+        startElement( "header" );
+    }
+
+    @Override
+    public void header_()
+    {
+        checkWellformedness( "header" );
+    }
+
+    @Override
+    public void content()
+    {
+        startElement( "content" );
+    }
+
+    @Override
+    public void content_()
+    {
+        checkWellformedness( "content" );
+    }
+
+    @Override
+    public void footer()
+    {
+        startElement( "footer" );
+    }
+
+    @Override
+    public void footer_()
+    {
+        checkWellformedness( "footer" );
+    }
+
+    @Override
     public void list()
     {
         startElement( "list" );
@@ -403,6 +475,66 @@ public class WellformednessCheckingSink
     }
 
     @Override
+    public void data( String value )
+    {
+        startElement( "data" );
+    }
+
+    @Override
+    public void data_()
+    {
+        checkWellformedness( "data" );
+    }
+
+    @Override
+    public void time( String datetime )
+    {
+        startElement( "time" );
+    }
+
+    @Override
+    public void time_()
+    {
+        checkWellformedness( "time" );
+    }
+
+    @Override
+    public void address()
+    {
+        startElement( "address" );
+    }
+
+    @Override
+    public void address_()
+    {
+        checkWellformedness( "address" );
+    }
+
+    @Override
+    public void blockquote()
+    {
+        startElement( "blockquote" );
+    }
+
+    @Override
+    public void blockquote_()
+    {
+        checkWellformedness( "blockquote" );
+    }
+
+    @Override
+    public void division()
+    {
+        startElement( "division" );
+    }
+
+    @Override
+    public void division_()
+    {
+        checkWellformedness( "division" );
+    }
+
+    @Override
     public void verbatim( boolean boxed )
     {
         startElement( "verbatim" );
@@ -529,6 +661,18 @@ public class WellformednessCheckingSink
     }
 
     @Override
+    public void inline()
+    {
+        startElement( "inline" );
+    }
+
+    @Override
+    public void inline_()
+    {
+        checkWellformedness( "inline" );
+    }
+
+    @Override
     public void italic()
     {
         startElement( "italic" );
@@ -571,6 +715,12 @@ public class WellformednessCheckingSink
     }
 
     @Override
+    public void lineBreakOpportunity()
+    {
+        // nop
+    }
+
+    @Override
     public void nonBreakingSpace()
     {
         // nop
@@ -702,6 +852,24 @@ public class WellformednessCheckingSink
     }
 
     @Override
+    public void article( SinkEventAttributes attributes )
+    {
+        article();
+    }
+
+    @Override
+    public void navigation( SinkEventAttributes attributes )
+    {
+        navigation();
+    }
+
+    @Override
+    public void sidebar( SinkEventAttributes attributes )
+    {
+        sidebar();
+    }
+
+    @Override
     public void section( int level, SinkEventAttributes attributes )
     {
         startElement( "section" + level );
@@ -726,6 +894,24 @@ public class WellformednessCheckingSink
     }
 
     @Override
+    public void header( SinkEventAttributes attributes )
+    {
+        header();
+    }
+
+    @Override
+    public void content( SinkEventAttributes attributes )
+    {
+        content();
+    }
+
+    @Override
+    public void footer( SinkEventAttributes attributes )
+    {
+        footer();
+    }
+
+    @Override
     public void list( SinkEventAttributes attributes )
     {
         list();
@@ -828,6 +1014,36 @@ public class WellformednessCheckingSink
     }
 
     @Override
+    public void data( String value, SinkEventAttributes attributes )
+    {
+        data( value );
+    }
+
+    @Override
+    public void time( String datetime, SinkEventAttributes attributes )
+    {
+        time( datetime );
+    }
+
+    @Override
+    public void address( SinkEventAttributes attributes )
+    {
+        address();
+    }
+
+    @Override
+    public void blockquote( SinkEventAttributes attributes )
+    {
+        blockquote();
+    }
+
+    @Override
+    public void division( SinkEventAttributes attributes )
+    {
+        division();
+    }
+
+    @Override
     public void verbatim( SinkEventAttributes attributes )
     {
         verbatim( false );
@@ -852,12 +1068,24 @@ public class WellformednessCheckingSink
     }
 
     @Override
+    public void inline( SinkEventAttributes attributes )
+    {
+        inline();
+    }
+
+    @Override
     public void lineBreak( SinkEventAttributes attributes )
     {
         lineBreak();
     }
 
     @Override
+    public void lineBreakOpportunity( SinkEventAttributes attributes )
+    {
+        lineBreakOpportunity();
+    }
+
+    @Override
     public void text( String text, SinkEventAttributes attributes )
     {
         text( text );
diff --git a/doxia-core/src/test/java/org/apache/maven/doxia/sink/impl/XhtmlBaseSinkTest.java b/doxia-core/src/test/java/org/apache/maven/doxia/sink/impl/Xhtml5BaseSinkTest.java
similarity index 55%
copy from doxia-core/src/test/java/org/apache/maven/doxia/sink/impl/XhtmlBaseSinkTest.java
copy to doxia-core/src/test/java/org/apache/maven/doxia/sink/impl/Xhtml5BaseSinkTest.java
index 9672138..4d0723f 100644
--- a/doxia-core/src/test/java/org/apache/maven/doxia/sink/impl/XhtmlBaseSinkTest.java
+++ b/doxia-core/src/test/java/org/apache/maven/doxia/sink/impl/Xhtml5BaseSinkTest.java
@@ -30,23 +30,21 @@ import org.apache.maven.doxia.markup.Markup;
 import org.apache.maven.doxia.sink.Sink;
 import org.apache.maven.doxia.sink.SinkEventAttributes;
 import org.apache.maven.doxia.sink.impl.SinkEventAttributeSet;
-import org.apache.maven.doxia.sink.impl.XhtmlBaseSink;
+import org.apache.maven.doxia.sink.impl.Xhtml5BaseSink;
 
 /**
- * Test for XhtmlBaseSink.
- *
- * @author ltheussl
- * @version $Id$
- * @since 1.1
+ * Test for Xhtml5BaseSink.
  */
-public class XhtmlBaseSinkTest
+public class Xhtml5BaseSinkTest
     extends TestCase
 {
     protected static final String LS = Markup.EOL;
     private final SinkEventAttributes attributes = SinkEventAttributeSet.BOLD;
-    private XhtmlBaseSink sink;
+    private Xhtml5BaseSink sink;
     private Writer writer;
 
+    String EOL = System.lineSeparator();
+
     @Override
     protected void setUp()
             throws Exception
@@ -61,7 +59,7 @@ public class XhtmlBaseSinkTest
         // DOXIA-189
         try
         {
-            sink = new XhtmlBaseSink( writer );
+            sink = new Xhtml5BaseSink( writer );
 
             sink.paragraph();
             sink.text( "There should be no space before the " );
@@ -94,7 +92,7 @@ public class XhtmlBaseSinkTest
         // DOXIA-177
         try
         {
-            sink = new XhtmlBaseSink( writer );
+            sink = new Xhtml5BaseSink( writer );
 
             sink.table();
             sink.tableRows( new int[] { Sink.JUSTIFY_CENTER }, false );
@@ -189,15 +187,123 @@ public class XhtmlBaseSinkTest
     }
 
     /**
-     * Test of section method, of class XhtmlBaseSink.
+     * Test of article method, of class Xhtml5BaseSink.
+     */
+    public void testArticle()
+    {
+        try
+        {
+            sink = new Xhtml5BaseSink( writer );
+
+            sink.article();
+            sink.article_();
+        }
+        finally
+        {
+            sink.close();
+        }
+
+        assertEquals( "<article></article>", writer.toString() );
+
+        writer =  new StringWriter();
+
+        try
+        {
+            sink = new Xhtml5BaseSink( writer );
+
+            sink.article( attributes );
+            sink.article_();
+        }
+        finally
+        {
+            sink.close();
+        }
+
+        assertEquals( "<article style=\"bold\"></article>", writer.toString() );
+    }
+
+    /**
+     * Test of navigation method, of class Xhtml5BaseSink.
+     */
+    public void testNavigation()
+    {
+        try
+        {
+            sink = new Xhtml5BaseSink( writer );
+
+            sink.navigation();
+            sink.navigation_();
+        }
+        finally
+        {
+            sink.close();
+        }
+
+        assertEquals( "<nav></nav>", writer.toString() );
+
+        writer =  new StringWriter();
+
+        try
+        {
+            sink = new Xhtml5BaseSink( writer );
+
+            sink.navigation( attributes );
+            sink.navigation_();
+        }
+        finally
+        {
+            sink.close();
+        }
+
+        assertEquals( "<nav style=\"bold\"></nav>", writer.toString() );
+    }
+
+    /**
+     * Test of sidebar method, of class Xhtml5BaseSink.
+     */
+    public void testSidebar()
+    {
+        try
+        {
+            sink = new Xhtml5BaseSink( writer );
+
+            sink.sidebar();
+            sink.sidebar_();
+        }
+        finally
+        {
+            sink.close();
+        }
+
+        assertEquals( "<aside></aside>", writer.toString() );
+
+        writer =  new StringWriter();
+
+        try
+        {
+            sink = new Xhtml5BaseSink( writer );
+
+            sink.sidebar( attributes );
+            sink.sidebar_();
+        }
+        finally
+        {
+            sink.close();
+        }
+
+        assertEquals( "<aside style=\"bold\"></aside>", writer.toString() );
+    }
+
+    /**
+     * Test of section method, of class Xhtml5BaseSink.
      */
     public void testSection()
     {
-        final int level = XhtmlBaseSink.SECTION_LEVEL_1;
+        final int level = Xhtml5BaseSink.SECTION_LEVEL_1;
 
         try
         {
-            sink = new XhtmlBaseSink( writer );
+            sink = new Xhtml5BaseSink( writer );
 
             sink.section( level, attributes );
             sink.sectionTitle( level, attributes );
@@ -209,21 +315,21 @@ public class XhtmlBaseSinkTest
             sink.close();
         }
 
-        assertEquals( "<div class=\"section\" style=\"bold\">" + LS + "<h2 style=\"bold\"></h2></div>", writer.toString() );
+        assertEquals( "<section style=\"bold\">" + LS + "<h2 style=\"bold\"></h2></section>", writer.toString() );
     }
 
     /**
-     * Test of section method, of class XhtmlBaseSink.
+     * Test of section method, of class Xhtml5BaseSink.
      */
     public void testSectionAttributes()
     {
-        final int level = XhtmlBaseSink.SECTION_LEVEL_1;
+        final int level = Xhtml5BaseSink.SECTION_LEVEL_1;
         final SinkEventAttributeSet set = new SinkEventAttributeSet(
             new String[] {"name", "section name", "class", "foo", "id", "bar"} );
 
         try
         {
-            sink = new XhtmlBaseSink( writer );
+            sink = new Xhtml5BaseSink( writer );
 
             sink.section( level, set );
             sink.sectionTitle( level, null );
@@ -235,18 +341,18 @@ public class XhtmlBaseSinkTest
             sink.close();
         }
 
-        assertEquals( "<div class=\"foo\" id=\"bar\">" + LS + "<h2></h2></div>", writer.toString() );
+        assertEquals( "<section class=\"foo\" id=\"bar\">" + LS + "<h2></h2></section>", writer.toString() );
     }
 
     /**
-     * Test of section1 method, of class XhtmlBaseSink.
+     * Test of section1 method, of class Xhtml5BaseSink.
      */
     public void testSection1()
     {
 
         try
         {
-            sink = new XhtmlBaseSink( writer );
+            sink = new Xhtml5BaseSink( writer );
 
             sink.section1();
             sink.sectionTitle1();
@@ -258,18 +364,18 @@ public class XhtmlBaseSinkTest
             sink.close();
         }
 
-        assertEquals( "<div class=\"section\">" + LS + "<h2></h2></div>", writer.toString() );
+        assertEquals( "<section>" + LS + "<h2></h2></section>", writer.toString() );
     }
 
     /**
-     * Test of section2 method, of class XhtmlBaseSink.
+     * Test of section2 method, of class Xhtml5BaseSink.
      */
     public void testSection2()
     {
 
         try
         {
-            sink = new XhtmlBaseSink( writer );
+            sink = new Xhtml5BaseSink( writer );
 
             sink.section2();
             sink.sectionTitle2();
@@ -281,18 +387,18 @@ public class XhtmlBaseSinkTest
             sink.close();
         }
 
-        assertEquals( "<div class=\"section\">" + LS + "<h3></h3></div>", writer.toString() );
+        assertEquals( "<section>" + LS + "<h3></h3></section>", writer.toString() );
     }
 
     /**
-     * Test of section3 method, of class XhtmlBaseSink.
+     * Test of section3 method, of class Xhtml5BaseSink.
      */
     public void testSection3()
     {
 
         try
         {
-            sink = new XhtmlBaseSink( writer );
+            sink = new Xhtml5BaseSink( writer );
 
             sink.section3();
             sink.sectionTitle3();
@@ -304,17 +410,17 @@ public class XhtmlBaseSinkTest
             sink.close();
         }
 
-        assertEquals( "<div class=\"section\">" + LS + "<h4></h4></div>", writer.toString() );
+        assertEquals( "<section>" + LS + "<h4></h4></section>", writer.toString() );
     }
 
     /**
-     * Test of section4 method, of class XhtmlBaseSink.
+     * Test of section4 method, of class Xhtml5BaseSink.
      */
     public void testSection4()
     {
         try
         {
-            sink = new XhtmlBaseSink( writer );
+            sink = new Xhtml5BaseSink( writer );
 
             sink.section4();
             sink.sectionTitle4();
@@ -326,17 +432,17 @@ public class XhtmlBaseSinkTest
             sink.close();
         }
 
-        assertEquals( "<div class=\"section\">" + LS + "<h5></h5></div>", writer.toString() );
+        assertEquals( "<section>" + LS + "<h5></h5></section>", writer.toString() );
     }
 
     /**
-     * Test of section5 method, of class XhtmlBaseSink.
+     * Test of section5 method, of class Xhtml5BaseSink.
      */
     public void testSection5()
     {
         try
         {
-            sink = new XhtmlBaseSink( writer );
+            sink = new Xhtml5BaseSink( writer );
 
             sink.section5();
             sink.sectionTitle5();
@@ -348,11 +454,123 @@ public class XhtmlBaseSinkTest
             sink.close();
         }
 
-        assertEquals( "<div class=\"section\">" + LS + "<h6></h6></div>", writer.toString() );
+        assertEquals( "<section>" + LS + "<h6></h6></section>", writer.toString() );
+    }
+
+    /**
+     * Test of header method, of class Xhtml5BaseSink.
+     */
+    public void testHeader()
+    {
+        try
+        {
+            sink = new Xhtml5BaseSink( writer );
+
+            sink.header();
+            sink.header_();
+        }
+        finally
+        {
+            sink.close();
+        }
+
+        assertEquals( "<header></header>", writer.toString() );
+
+        writer =  new StringWriter();
+
+        try
+        {
+            sink = new Xhtml5BaseSink( writer );
+
+            sink.header( attributes );
+            sink.header_();
+        }
+        finally
+        {
+            sink.close();
+        }
+
+        assertEquals( "<header style=\"bold\"></header>", writer.toString() );
+    }
+
+    /**
+     * Test of content method, of class Xhtml5BaseSink.
+     */
+    public void testContent()
+    {
+        try
+        {
+            sink = new Xhtml5BaseSink( writer );
+
+            sink.content();
+            sink.content();
+            sink.content_();
+            sink.content_();
+        }
+        finally
+        {
+            sink.close();
+        }
+
+        assertEquals( "<main>" + EOL + "<div class=\"content\"></div></main>", writer.toString() );
+
+        writer =  new StringWriter();
+
+        try
+        {
+            sink = new Xhtml5BaseSink( writer );
+
+            sink.content( attributes );
+            sink.content( attributes );
+            sink.content_();
+            sink.content_();
+        }
+        finally
+        {
+            sink.close();
+        }
+
+        assertEquals( "<main style=\"bold\">" + EOL + "<div style=\"bold\" class=\"content\"></div></main>", writer.toString() );
+    }
+
+    /**
+     * Test of footer method, of class Xhtml5BaseSink.
+     */
+    public void testFooter()
+    {
+        try
+        {
+            sink = new Xhtml5BaseSink( writer );
+
+            sink.footer();
+            sink.footer_();
+        }
+        finally
+        {
+            sink.close();
+        }
+
+        assertEquals( "<footer></footer>", writer.toString() );
+
+        writer =  new StringWriter();
+
+        try
+        {
+            sink = new Xhtml5BaseSink( writer );
+
+            sink.footer( attributes );
+            sink.footer_();
+        }
+        finally
+        {
+            sink.close();
+        }
+
+        assertEquals( "<footer style=\"bold\"></footer>", writer.toString() );
     }
 
     /**
-     * Test of list method, of class XhtmlBaseSink.
+     * Test of list method, of class Xhtml5BaseSink.
      * @throws java.lang.Exception if any.
      */
     public void testList()
@@ -360,7 +578,7 @@ public class XhtmlBaseSinkTest
     {
         try
         {
-            sink = new XhtmlBaseSink( writer );
+            sink = new Xhtml5BaseSink( writer );
 
             sink.list();
             sink.listItem();
@@ -378,7 +596,7 @@ public class XhtmlBaseSinkTest
 
         try
         {
-            sink = new XhtmlBaseSink( writer );
+            sink = new Xhtml5BaseSink( writer );
 
             sink.list( attributes );
             sink.listItem( attributes );
@@ -394,15 +612,15 @@ public class XhtmlBaseSinkTest
     }
 
     /**
-     * Test of numberedList method, of class XhtmlBaseSink.
+     * Test of numberedList method, of class Xhtml5BaseSink.
      */
     public void testNumberedList()
     {
-        final int numbering = XhtmlBaseSink.NUMBERING_DECIMAL;
+        final int numbering = Xhtml5BaseSink.NUMBERING_DECIMAL;
 
         try
         {
-            sink = new XhtmlBaseSink( writer );
+            sink = new Xhtml5BaseSink( writer );
 
             sink.numberedList( numbering );
             sink.numberedListItem();
@@ -420,7 +638,7 @@ public class XhtmlBaseSinkTest
 
         try
         {
-            sink = new XhtmlBaseSink( writer );
+            sink = new Xhtml5BaseSink( writer );
 
             sink.numberedList( numbering, attributes );
             sink.numberedListItem( attributes );
@@ -436,13 +654,13 @@ public class XhtmlBaseSinkTest
     }
 
     /**
-     * Test of definitionList method, of class XhtmlBaseSink.
+     * Test of definitionList method, of class Xhtml5BaseSink.
      */
     public void testDefinitionList()
     {
         try
         {
-            sink = new XhtmlBaseSink( writer );
+            sink = new Xhtml5BaseSink( writer );
 
             sink.definitionList();
             sink.definedTerm();
@@ -462,7 +680,7 @@ public class XhtmlBaseSinkTest
 
         try
         {
-            sink = new XhtmlBaseSink( writer );
+            sink = new Xhtml5BaseSink( writer );
 
             sink.definitionList( attributes );
             sink.definedTerm( attributes );
@@ -480,7 +698,7 @@ public class XhtmlBaseSinkTest
     }
 
     /**
-     * Test of figure method, of class XhtmlBaseSink.
+     * Test of figure method, of class Xhtml5BaseSink.
      */
     public void testFigure()
     {
@@ -488,7 +706,7 @@ public class XhtmlBaseSinkTest
 
         try
         {
-            sink = new XhtmlBaseSink( writer );
+            sink = new Xhtml5BaseSink( writer );
 
             sink.figure( attributes );
             sink.figureGraphics( src, attributes );
@@ -501,13 +719,13 @@ public class XhtmlBaseSinkTest
             sink.close();
         }
 
-        assertEquals( "<div style=\"bold\" class=\"figure\">"
-                + "" + LS + "<p align=\"center\"><img src=\"src.jpg\" style=\"bold\" alt=\"\" /></p>"
-                + "" + LS + "<p align=\"center\" style=\"bold\"><i></i></p></div>", writer.toString() );
+        assertEquals( "<figure style=\"bold\">"
+                + "<img src=\"src.jpg\" style=\"bold\" alt=\"\" />"
+                + "<figcaption style=\"bold\"></figcaption></figure>", writer.toString() );
     }
 
     /**
-     * Test of figureGraphics method, of class XhtmlBaseSink.
+     * Test of figureGraphics method, of class Xhtml5BaseSink.
      */
     public void testFigureGraphics()
     {
@@ -515,7 +733,7 @@ public class XhtmlBaseSinkTest
 
         try
         {
-            sink = new XhtmlBaseSink( writer );
+            sink = new Xhtml5BaseSink( writer );
             sink.figureGraphics( src, attributes );
         }
         finally
@@ -527,13 +745,13 @@ public class XhtmlBaseSinkTest
     }
 
     /**
-     * Test of paragraph method, of class XhtmlBaseSink.
+     * Test of paragraph method, of class Xhtml5BaseSink.
      */
     public void testParagraph()
     {
         try
         {
-            sink = new XhtmlBaseSink( writer );
+            sink = new Xhtml5BaseSink( writer );
 
             sink.paragraph();
             sink.paragraph_();
@@ -549,7 +767,7 @@ public class XhtmlBaseSinkTest
 
         try
         {
-            sink = new XhtmlBaseSink( writer );
+            sink = new Xhtml5BaseSink( writer );
 
             sink.paragraph( attributes );
             sink.paragraph_();
@@ -563,13 +781,163 @@ public class XhtmlBaseSinkTest
     }
 
     /**
-     * Test of verbatim method, of class XhtmlBaseSink.
+     * Test of data method, of class Xhtml5BaseSink.
+     */
+    public void testData()
+    {
+        String value = "value";
+
+        try
+        {
+            sink = new Xhtml5BaseSink( writer );
+            sink.data( value, attributes );
+            sink.data_();
+        }
+        finally
+        {
+            sink.close();
+        }
+
+        assertEquals( "<data value=\"value\" style=\"bold\"></data>", writer.toString() );
+    }
+
+    /**
+     * Test of time method, of class Xhtml5BaseSink.
+     */
+    public void testTime()
+    {
+        String datetime = "datetime";
+
+        try
+        {
+            sink = new Xhtml5BaseSink( writer );
+            sink.time( datetime, attributes );
+            sink.time_();
+        }
+        finally
+        {
+            sink.close();
+        }
+
+        assertEquals( "<time datetime=\"datetime\" style=\"bold\"></time>", writer.toString() );
+    }
+
+    /**
+     * Test of address method, of class Xhtml5BaseSink.
+     */
+    public void testAddress()
+    {
+        try
+        {
+            sink = new Xhtml5BaseSink( writer );
+
+            sink.address();
+            sink.address_();
+        }
+        finally
+        {
+            sink.close();
+        }
+
+        assertEquals( "<address></address>", writer.toString() );
+
+        writer =  new StringWriter();
+
+        try
+        {
+            sink = new Xhtml5BaseSink( writer );
+
+            sink.address( attributes );
+            sink.address_();
+        }
+        finally
+        {
+            sink.close();
+        }
+
+        assertEquals( "<address style=\"bold\"></address>", writer.toString() );
+    }
+
+    /**
+     * Test of blockquote method, of class Xhtml5BaseSink.
+     */
+    public void testBlockquote()
+    {
+        try
+        {
+            sink = new Xhtml5BaseSink( writer );
+
+            sink.blockquote();
+            sink.blockquote_();
+        }
+        finally
+        {
+            sink.close();
+        }
+
+        assertEquals( "<blockquote></blockquote>", writer.toString() );
+
+        writer =  new StringWriter();
+
+        try
+        {
+            sink = new Xhtml5BaseSink( writer );
+
+            sink.blockquote( attributes );
+            sink.blockquote_();
+        }
+        finally
+        {
+            sink.close();
+        }
+
+        assertEquals( "<blockquote style=\"bold\"></blockquote>", writer.toString() );
+    }
+
+    /**
+     * Test of division method, of class Xhtml5BaseSink.
+     */
+    public void testDivision()
+    {
+        try
+        {
+            sink = new Xhtml5BaseSink( writer );
+
+            sink.division();
+            sink.division_();
+        }
+        finally
+        {
+            sink.close();
+        }
+
+        assertEquals( "<div></div>", writer.toString() );
+
+        writer =  new StringWriter();
+
+        try
+        {
+            sink = new Xhtml5BaseSink( writer );
+
+            sink.division( attributes );
+            sink.division_();
+        }
+        finally
+        {
+            sink.close();
+        }
+
+        assertEquals( "<div style=\"bold\"></div>", writer.toString() );
+    }
+
+    /**
+     * Test of verbatim method, of class Xhtml5BaseSink.
      */
     public void testVerbatim()
     {
         try
         {
-            sink = new XhtmlBaseSink( writer );
+            sink = new Xhtml5BaseSink( writer );
 
             sink.verbatim( true );
             sink.verbatim_();
@@ -604,7 +972,7 @@ public class XhtmlBaseSinkTest
 
         try
         {
-            sink = new XhtmlBaseSink( writer );
+            sink = new Xhtml5BaseSink( writer );
 
             sink.verbatim( att );
             sink.verbatim_();
@@ -618,13 +986,13 @@ public class XhtmlBaseSinkTest
     }
 
     /**
-     * Test of horizontalRule method, of class XhtmlBaseSink.
+     * Test of horizontalRule method, of class Xhtml5BaseSink.
      */
     public void testHorizontalRule()
     {
         try
         {
-            sink = new XhtmlBaseSink( writer );
+            sink = new Xhtml5BaseSink( writer );
 
             sink.horizontalRule();
             sink.horizontalRule( attributes );
@@ -638,13 +1006,13 @@ public class XhtmlBaseSinkTest
     }
 
     /**
-     * Test of table method, of class XhtmlBaseSink.
+     * Test of table method, of class Xhtml5BaseSink.
      */
     public void testTable()
     {
         try
         {
-            sink = new XhtmlBaseSink( writer );
+            sink = new Xhtml5BaseSink( writer );
 
             sink.table( attributes );
             sink.table_();
@@ -658,7 +1026,7 @@ public class XhtmlBaseSinkTest
     }
 
     /**
-     * Test of tableRows method, of class XhtmlBaseSink.
+     * Test of tableRows method, of class Xhtml5BaseSink.
      */
     public void testTableRows()
     {
@@ -667,7 +1035,7 @@ public class XhtmlBaseSinkTest
 
         try
         {
-            sink = new XhtmlBaseSink( writer );
+            sink = new Xhtml5BaseSink( writer );
 
             sink.tableRows( justification, grid );
             sink.tableRows_();
@@ -681,13 +1049,13 @@ public class XhtmlBaseSinkTest
     }
 
     /**
-     * Test of tableRow method, of class XhtmlBaseSink.
+     * Test of tableRow method, of class Xhtml5BaseSink.
      */
     public void testTableRow()
     {
         try
         {
-            sink = new XhtmlBaseSink( writer );
+            sink = new Xhtml5BaseSink( writer );
 
             sink.tableRow( attributes );
             sink.tableRow_();
@@ -701,13 +1069,13 @@ public class XhtmlBaseSinkTest
     }
 
     /**
-     * Test of tableCell method, of class XhtmlBaseSink.
+     * Test of tableCell method, of class Xhtml5BaseSink.
      */
     public void testTableCell()
     {
         try
         {
-            sink = new XhtmlBaseSink( writer );
+            sink = new Xhtml5BaseSink( writer );
 
             sink.tableCell( attributes );
             sink.tableCell_();
@@ -721,13 +1089,13 @@ public class XhtmlBaseSinkTest
     }
 
     /**
-     * Test of tableHeaderCell method, of class XhtmlBaseSink.
+     * Test of tableHeaderCell method, of class Xhtml5BaseSink.
      */
     public void testTableHeaderCell()
     {
         try
         {
-            sink = new XhtmlBaseSink( writer );
+            sink = new Xhtml5BaseSink( writer );
 
             sink.tableHeaderCell( attributes );
             sink.tableHeaderCell_();
@@ -741,13 +1109,13 @@ public class XhtmlBaseSinkTest
     }
 
     /**
-     * Test of tableCaption method, of class XhtmlBaseSink.
+     * Test of tableCaption method, of class Xhtml5BaseSink.
      */
     public void testTableCaption()
     {
         try
         {
-            sink = new XhtmlBaseSink( writer );
+            sink = new Xhtml5BaseSink( writer );
 
             sink.table();
             sink.tableRows( null, false );
@@ -767,7 +1135,7 @@ public class XhtmlBaseSinkTest
     }
 
     /**
-     * Test of anchor method, of class XhtmlBaseSink.
+     * Test of anchor method, of class Xhtml5BaseSink.
      */
     public void testAnchor()
     {
@@ -775,7 +1143,7 @@ public class XhtmlBaseSinkTest
 
         try
         {
-            sink = new XhtmlBaseSink( writer );
+            sink = new Xhtml5BaseSink( writer );
             sink.anchor( name, attributes );
             sink.anchor_();
         }
@@ -788,7 +1156,7 @@ public class XhtmlBaseSinkTest
     }
 
     /**
-     * Test of link method, of class XhtmlBaseSink.
+     * Test of link method, of class Xhtml5BaseSink.
      */
     public void testLink()
     {
@@ -796,7 +1164,7 @@ public class XhtmlBaseSinkTest
 
         try
         {
-            sink = new XhtmlBaseSink( writer );
+            sink = new Xhtml5BaseSink( writer );
             sink.link( name, attributes );
             sink.link_();
         }
@@ -809,37 +1177,116 @@ public class XhtmlBaseSinkTest
     }
 
     /**
-     * Test of italic/bold/monospaced method, of class XhtmlBaseSink.
+     * Test of inline method, of class Xhtml5BaseSink.
+     */
+    public void testInline()
+    {
+        String text = "a text & \u00c6";
+
+        writer =  new StringWriter();
+
+        try
+        {
+            sink = new Xhtml5BaseSink( writer );
+            sink.inline( SinkEventAttributeSet.Semantics.EMPHASIS );
+            sink.inline( SinkEventAttributeSet.Semantics.STRONG );
+            sink.inline( SinkEventAttributeSet.Semantics.SMALL );
+            sink.inline( SinkEventAttributeSet.Semantics.LINE_THROUGH );
+            sink.inline( SinkEventAttributeSet.Semantics.CITATION );
+            sink.inline( SinkEventAttributeSet.Semantics.QUOTE );
+            sink.inline( SinkEventAttributeSet.Semantics.DEFINITION );
+            sink.inline( SinkEventAttributeSet.Semantics.ABBREVIATION );
+            sink.inline( SinkEventAttributeSet.Semantics.ITALIC );
+            sink.inline( SinkEventAttributeSet.Semantics.BOLD );
+            sink.inline( SinkEventAttributeSet.Semantics.CODE );
+            sink.inline( SinkEventAttributeSet.Semantics.VARIABLE );
+            sink.inline( SinkEventAttributeSet.Semantics.SAMPLE );
+            sink.inline( SinkEventAttributeSet.Semantics.KEYBOARD );
+            sink.inline( SinkEventAttributeSet.Semantics.SUPERSCRIPT );
+            sink.inline( SinkEventAttributeSet.Semantics.SUBSCRIPT );
+            sink.inline( SinkEventAttributeSet.Semantics.ANNOTATION );
+            sink.inline( SinkEventAttributeSet.Semantics.HIGHLIGHT );
+            sink.inline( SinkEventAttributeSet.Semantics.RUBY );
+            sink.inline( SinkEventAttributeSet.Semantics.RUBY_BASE );
+            sink.inline( SinkEventAttributeSet.Semantics.RUBY_TEXT );
+            sink.inline( SinkEventAttributeSet.Semantics.RUBY_TEXT_CONTAINER );
+            sink.inline( SinkEventAttributeSet.Semantics.RUBY_PARANTHESES );
+            sink.inline( SinkEventAttributeSet.Semantics.BIDIRECTIONAL_ISOLATION );
+            sink.inline( SinkEventAttributeSet.Semantics.BIDIRECTIONAL_OVERRIDE );
+            sink.inline( SinkEventAttributeSet.Semantics.PHRASE );
+            sink.inline( SinkEventAttributeSet.Semantics.INSERT );
+            sink.inline( SinkEventAttributeSet.Semantics.DELETE );
+            sink.text( text );
+            sink.inline_();
+            sink.inline_();
+            sink.inline_();
+            sink.inline_();
+            sink.inline_();
+            sink.inline_();
+            sink.inline_();
+            sink.inline_();
+            sink.inline_();
+            sink.inline_();
+            sink.inline_();
+            sink.inline_();
+            sink.inline_();
+            sink.inline_();
+            sink.inline_();
+            sink.inline_();
+            sink.inline_();
+            sink.inline_();
+            sink.inline_();
+            sink.inline_();
+            sink.inline_();
+            sink.inline_();
+            sink.inline_();
+            sink.inline_();
+            sink.inline_();
+            sink.inline_();
+            sink.inline_();
+            sink.inline_();
+        }
+        finally
+        {
+            sink.close();
+        }
+
+        assertEquals( "<em><strong><small><s><cite><q><dfn><abbr><i><b><code><var><samp><kbd><sup><sub><u><mark><ruby><rb><rt><rtc><rp><bdi><bdo><span><ins><del>a text &amp; &#xc6;</del></ins></span></bdo></bdi></rp></rtc></rt></rb></ruby></mark></u></sub></sup></kbd></samp></var></code></b></i></abbr></dfn></q></cite></s></small></strong></em>", writer.toString() );
+    }
+
+    /**
+     * Test of italic/bold/code method, of class Xhtml5BaseSink.
      */
     public void testItalic()
     {
         try
         {
-            sink = new XhtmlBaseSink( writer );
-            sink.italic();
-            sink.italic_();
-            sink.bold();
-            sink.bold_();
-            sink.monospaced();
-            sink.monospaced_();
+            sink = new Xhtml5BaseSink( writer );
+            sink.inline( SinkEventAttributeSet.Semantics.ITALIC );
+            sink.inline_();
+            sink.inline( SinkEventAttributeSet.Semantics.BOLD );
+            sink.inline_();
+            sink.inline( SinkEventAttributeSet.Semantics.CODE );
+            sink.inline_();
         }
         finally
         {
             sink.close();
         }
 
-        assertEquals( "<i></i><b></b><tt></tt>", writer.toString() );
+        assertEquals( "<i></i><b></b><code></code>", writer.toString() );
     }
 
     /**
-     * Test of lineBreak/pageBreak/nonBreakingSpace method, of class XhtmlBaseSink.
+     * Test of lineBreak/lineBreakOpportunity/pageBreak/nonBreakingSpace method, of class Xhtml5BaseSink.
      */
     public void testLineBreak()
     {
         try
         {
-            sink = new XhtmlBaseSink( writer );
+            sink = new Xhtml5BaseSink( writer );
             sink.lineBreak( attributes );
+            sink.lineBreakOpportunity( attributes );
             sink.pageBreak();
             sink.nonBreakingSpace();
         }
@@ -848,11 +1295,11 @@ public class XhtmlBaseSinkTest
             sink.close();
         }
 
-        assertEquals( "<br style=\"bold\" /><!-- PB -->&#160;", writer.toString() );
+        assertEquals( "<br style=\"bold\" /><wbr style=\"bold\" /><!-- PB -->&#160;", writer.toString() );
     }
 
     /**
-     * Test of text method, of class XhtmlBaseSink.
+     * Test of text method, of class Xhtml5BaseSink.
      */
     public void testText()
     {
@@ -860,7 +1307,7 @@ public class XhtmlBaseSinkTest
 
         try
         {
-            sink = new XhtmlBaseSink( writer );
+            sink = new Xhtml5BaseSink( writer );
             sink.text( text );
         }
         finally
@@ -874,7 +1321,7 @@ public class XhtmlBaseSinkTest
 
         try
         {
-            sink = new XhtmlBaseSink( writer );
+            sink = new Xhtml5BaseSink( writer );
             sink.text( text, attributes );
         }
         finally
@@ -886,7 +1333,7 @@ public class XhtmlBaseSinkTest
     }
 
     /**
-     * Test of rawText method, of class XhtmlBaseSink.
+     * Test of rawText method, of class Xhtml5BaseSink.
      */
     public void testRawText()
     {
@@ -894,7 +1341,7 @@ public class XhtmlBaseSinkTest
 
         try
         {
-            sink = new XhtmlBaseSink( writer );
+            sink = new Xhtml5BaseSink( writer );
             sink.rawText( text );
         }
         finally
@@ -906,13 +1353,13 @@ public class XhtmlBaseSinkTest
     }
 
     /**
-     * Test of comment method, of class XhtmlBaseSink.
+     * Test of comment method, of class Xhtml5BaseSink.
      */
     public void testComment()
     {
         try
         {
-            sink = new XhtmlBaseSink( writer );
+            sink = new Xhtml5BaseSink( writer );
             sink.comment( "a comment" );
             sink.comment( " a comment" );
             sink.comment( "a comment " );
@@ -927,7 +1374,7 @@ public class XhtmlBaseSinkTest
     }
 
     /**
-     * Test of unknown method, of class XhtmlBaseSink.
+     * Test of unknown method, of class Xhtml5BaseSink.
      */
     public void testUnknown()
     {
@@ -936,7 +1383,7 @@ public class XhtmlBaseSinkTest
 
         try
         {
-            sink = new XhtmlBaseSink( writer );
+            sink = new Xhtml5BaseSink( writer );
             sink.unknown( name, requiredParams, attributes );
         }
         finally
@@ -952,15 +1399,15 @@ public class XhtmlBaseSinkTest
      */
     public void testAttributeEntities()
     {
-        final Object[] startTag = new Object[] { new Integer( XhtmlBaseSink.TAG_TYPE_START ) };
-        final Object[] endTag = new Object[] { new Integer( XhtmlBaseSink.TAG_TYPE_END ) };
-        final String script = XhtmlBaseSink.SCRIPT.toString();
+        final Object[] startTag = new Object[] { new Integer( Xhtml5BaseSink.TAG_TYPE_START ) };
+        final Object[] endTag = new Object[] { new Integer( Xhtml5BaseSink.TAG_TYPE_END ) };
+        final String script = Xhtml5BaseSink.SCRIPT.toString();
         final SinkEventAttributes src = new SinkEventAttributeSet(
                 new String[] {SinkEventAttributes.SRC.toString(), "http://ex.com/ex.js?v=l&l=e"} );
 
         try
         {
-            sink = new XhtmlBaseSink( writer );
+            sink = new Xhtml5BaseSink( writer );
 
             sink.unknown( script, startTag, src );
             sink.unknown( script, endTag, null );
@@ -988,7 +1435,7 @@ public class XhtmlBaseSinkTest
 
         try
         {
-            sink = new XhtmlBaseSink( writer );
+            sink = new Xhtml5BaseSink( writer );
             sink.text( text );
         }
         finally
@@ -1006,7 +1453,7 @@ public class XhtmlBaseSinkTest
     {
         try
         {
-            sink = new XhtmlBaseSink( writer );
+            sink = new Xhtml5BaseSink( writer );
             sink.table( null );
             sink.tableRows( null, true );
             sink.tableRow( null );
diff --git a/doxia-core/src/test/java/org/apache/maven/doxia/sink/impl/XhtmlBaseSinkTest.java b/doxia-core/src/test/java/org/apache/maven/doxia/sink/impl/XhtmlBaseSinkTest.java
index 9672138..0efe53a 100644
--- a/doxia-core/src/test/java/org/apache/maven/doxia/sink/impl/XhtmlBaseSinkTest.java
+++ b/doxia-core/src/test/java/org/apache/maven/doxia/sink/impl/XhtmlBaseSinkTest.java
@@ -65,9 +65,9 @@ public class XhtmlBaseSinkTest
 
             sink.paragraph();
             sink.text( "There should be no space before the " );
-            sink.italic();
+            sink.inline( SinkEventAttributeSet.Semantics.ITALIC );
             sink.text( "period" );
-            sink.italic_();
+            sink.inline_();
             sink.text( "." );
             sink.paragraph_();
         }
@@ -816,12 +816,12 @@ public class XhtmlBaseSinkTest
         try
         {
             sink = new XhtmlBaseSink( writer );
-            sink.italic();
-            sink.italic_();
-            sink.bold();
-            sink.bold_();
-            sink.monospaced();
-            sink.monospaced_();
+            sink.inline( SinkEventAttributeSet.Semantics.ITALIC );
+            sink.inline_();
+            sink.inline( SinkEventAttributeSet.Semantics.BOLD );
+            sink.inline_();
+            sink.inline( SinkEventAttributeSet.Semantics.MONOSPACED );
+            sink.inline_();
         }
         finally
         {
diff --git a/doxia-core/src/test/java/org/apache/maven/doxia/xsd/AbstractXmlValidator.java b/doxia-core/src/test/java/org/apache/maven/doxia/xsd/AbstractXmlValidator.java
index 80e38f3..69a78f3 100644
--- a/doxia-core/src/test/java/org/apache/maven/doxia/xsd/AbstractXmlValidator.java
+++ b/doxia-core/src/test/java/org/apache/maven/doxia/xsd/AbstractXmlValidator.java
@@ -60,7 +60,10 @@ public abstract class AbstractXmlValidator
     /** XMLReader to validate xml file */
     private XMLReader xmlReader;
 
-    /**
+    /** HTML5 does not have a DTD or XSD, include option to disable validation */
+    private boolean validate = true;
+
+	/**
      * Filter fail message.
      *
      * @param message not null
@@ -150,6 +153,22 @@ public abstract class AbstractXmlValidator
      */
     protected abstract EntityResolver getEntityResolver();
 
+    /**
+     * Returns whether the XMLReader should validate XML.
+     * @return true if validation should be performed, false otherwise.
+     */
+    protected boolean isValidate() {
+		return validate;
+	}
+
+    /**
+     * Sets whether the XMLReader should validate XML.
+     * @param validate true if validation should be performed, false otherwise.
+     */
+    protected void setValidate(boolean validate) {
+		this.validate = validate;
+	}
+
     // ----------------------------------------------------------------------
     // Private methods
     // ----------------------------------------------------------------------
@@ -161,8 +180,8 @@ public abstract class AbstractXmlValidator
             try
             {
                 xmlReader = XMLReaderFactory.createXMLReader( "org.apache.xerces.parsers.SAXParser" );
-                xmlReader.setFeature( "http://xml.org/sax/features/validation", true );
-                xmlReader.setFeature( "http://apache.org/xml/features/validation/schema", true );
+                xmlReader.setFeature( "http://xml.org/sax/features/validation", validate );
+                xmlReader.setFeature( "http://apache.org/xml/features/validation/schema", validate );
                 xmlReader.setErrorHandler( new MessagesErrorHandler() );
                 xmlReader.setEntityResolver( getEntityResolver() );
             }
diff --git a/doxia-modules/doxia-module-apt/src/main/java/org/apache/maven/doxia/module/apt/AptSink.java b/doxia-modules/doxia-module-apt/src/main/java/org/apache/maven/doxia/module/apt/AptSink.java
index 6bdd0a4..b232c4e 100644
--- a/doxia-modules/doxia-module-apt/src/main/java/org/apache/maven/doxia/module/apt/AptSink.java
+++ b/doxia-modules/doxia-module-apt/src/main/java/org/apache/maven/doxia/module/apt/AptSink.java
@@ -21,10 +21,13 @@ package org.apache.maven.doxia.module.apt;
 
 import java.io.PrintWriter;
 import java.io.Writer;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Stack;
 
 import org.apache.maven.doxia.sink.SinkEventAttributes;
 import org.apache.maven.doxia.sink.impl.AbstractTextSink;
+import org.apache.maven.doxia.sink.impl.SinkEventAttributeSet;
 import org.codehaus.plexus.util.StringUtils;
 
 /**
@@ -104,6 +107,9 @@ public class AptSink
     /**  listStyles. */
     private final Stack<String> listStyles;
 
+    /** Keep track of the closing tags for inline events. */
+    protected Stack<List<String>> inlineStack = new Stack<List<String>>();
+
     // ----------------------------------------------------------------------
     // Public protected methods
     // ----------------------------------------------------------------------
@@ -178,6 +184,7 @@ public class AptSink
         this.cellJustif = null;
         this.rowLine = null;
         this.listStyles.clear();
+        this.inlineStack.clear();
     }
 
     /**
@@ -810,57 +817,91 @@ public class AptSink
     }
 
     /** {@inheritDoc} */
-    public void italic()
+    public void inline()
+    {
+        inline( null );
+    }
+
+    /** {@inheritDoc} */
+    public void inline( SinkEventAttributes attributes )
     {
         if ( !headerFlag )
         {
-            write( ITALIC_START_MARKUP );
+            List<String> tags = new ArrayList<String>();
+
+            if ( attributes != null )
+            {
+
+                if ( attributes.containsAttribute( SinkEventAttributes.SEMANTICS, "italic" ) )
+                {
+                    write( ITALIC_START_MARKUP );
+                    tags.add( 0, ITALIC_END_MARKUP );
+                }
+
+                if ( attributes.containsAttribute( SinkEventAttributes.SEMANTICS, "bold" ) )
+                {
+                    write( BOLD_START_MARKUP );
+                    tags.add( 0, BOLD_END_MARKUP );
+                }
+
+                if ( attributes.containsAttribute( SinkEventAttributes.SEMANTICS, "code" ) )
+                {
+                    write( MONOSPACED_START_MARKUP );
+                    tags.add( 0, MONOSPACED_END_MARKUP );
+                }
+
+            }
+
+            inlineStack.push( tags );
         }
     }
 
     /** {@inheritDoc} */
-    public void italic_()
+    public void inline_()
     {
         if ( !headerFlag )
         {
-            write( ITALIC_END_MARKUP );
+            for ( String tag: inlineStack.pop() )
+            {
+                write( tag );
+            }
         }
     }
 
     /** {@inheritDoc} */
+    public void italic()
+    {
+        inline( SinkEventAttributeSet.Semantics.ITALIC );
+    }
+
+    /** {@inheritDoc} */
+    public void italic_()
+    {
+        inline_();
+    }
+
+    /** {@inheritDoc} */
     public void bold()
     {
-        if ( !headerFlag )
-        {
-            write( BOLD_START_MARKUP );
-        }
+        inline( SinkEventAttributeSet.Semantics.BOLD );
     }
 
     /** {@inheritDoc} */
     public void bold_()
     {
-        if ( !headerFlag )
-        {
-            write( BOLD_END_MARKUP );
-        }
+        inline_();
     }
 
     /** {@inheritDoc} */
     public void monospaced()
     {
-        if ( !headerFlag )
-        {
-            write( MONOSPACED_START_MARKUP );
-        }
+        inline( SinkEventAttributeSet.Semantics.CODE );
     }
 
     /** {@inheritDoc} */
     public void monospaced_()
     {
-        if ( !headerFlag )
-        {
-            write( MONOSPACED_END_MARKUP );
-        }
+        inline_();
     }
 
     /** {@inheritDoc} */
diff --git a/doxia-modules/doxia-module-apt/src/test/java/org/apache/maven/doxia/module/apt/AptSinkTest.java b/doxia-modules/doxia-module-apt/src/test/java/org/apache/maven/doxia/module/apt/AptSinkTest.java
index 50cf0d9..2a946b8 100644
--- a/doxia-modules/doxia-module-apt/src/test/java/org/apache/maven/doxia/module/apt/AptSinkTest.java
+++ b/doxia-modules/doxia-module-apt/src/test/java/org/apache/maven/doxia/module/apt/AptSinkTest.java
@@ -83,6 +83,24 @@ public class AptSinkTest extends AbstractSinkTest
     }
 
     /** {@inheritDoc} */
+    protected String getArticleBlock()
+    {
+        return "";
+    }
+
+    /** {@inheritDoc} */
+    protected String getNavigationBlock()
+    {
+        return "";
+    }
+
+    /** {@inheritDoc} */
+    protected String getSidebarBlock()
+    {
+        return "";
+    }
+
+    /** {@inheritDoc} */
     protected String getSectionTitleBlock( String title )
     {
         return title;
@@ -122,6 +140,24 @@ public class AptSinkTest extends AbstractSinkTest
     }
 
     /** {@inheritDoc} */
+    protected String getHeaderBlock()
+    {
+        return "";
+    }
+
+    /** {@inheritDoc} */
+    protected String getContentBlock()
+    {
+        return "";
+    }
+
+    /** {@inheritDoc} */
+    protected String getFooterBlock()
+    {
+        return "";
+    }
+
+    /** {@inheritDoc} */
     protected String getListBlock( String item )
     {
         return EOL + EOL + Markup.SPACE + "" + AptMarkup.LIST_START_MARKUP + "" + Markup.SPACE + item + EOL + EOL
@@ -171,6 +207,36 @@ public class AptSinkTest extends AbstractSinkTest
     }
 
     /** {@inheritDoc} */
+    protected String getDataBlock( String value, String text )
+    {
+        return text;
+    }
+
+    /** {@inheritDoc} */
+    protected String getTimeBlock( String datetime, String text )
+    {
+        return text;
+    }
+
+    /** {@inheritDoc} */
+    protected String getAddressBlock( String text )
+    {
+        return text;
+    }
+
+    /** {@inheritDoc} */
+    protected String getBlockquoteBlock( String text )
+    {
+        return text;
+    }
+
+    /** {@inheritDoc} */
+    protected String getDivisionBlock( String text )
+    {
+        return text;
+    }
+
+    /** {@inheritDoc} */
     protected String getVerbatimBlock( String text )
     {
         return EOL + EOL + AptMarkup.BOXED_VERBATIM_START_MARKUP + EOL + text + EOL
@@ -203,6 +269,30 @@ public class AptSinkTest extends AbstractSinkTest
     }
 
     /** {@inheritDoc} */
+    protected String getInlineBlock( String text )
+    {
+        return text;
+    }
+
+    /** {@inheritDoc} */
+    protected String getInlineItalicBlock( String text )
+    {
+        return AptMarkup.ITALIC_START_MARKUP + text + AptMarkup.ITALIC_END_MARKUP;
+    }
+
+    /** {@inheritDoc} */
+    protected String getInlineBoldBlock( String text )
+    {
+        return AptMarkup.BOLD_START_MARKUP + text + AptMarkup.BOLD_END_MARKUP;
+    }
+
+    /** {@inheritDoc} */
+    protected String getInlineCodeBlock( String text )
+    {
+        return AptMarkup.MONOSPACED_START_MARKUP + text + AptMarkup.MONOSPACED_END_MARKUP;
+    }
+
+    /** {@inheritDoc} */
     protected String getItalicBlock( String text )
     {
         return AptMarkup.ITALIC_START_MARKUP + text + AptMarkup.ITALIC_END_MARKUP;
@@ -217,7 +307,7 @@ public class AptSinkTest extends AbstractSinkTest
     /** {@inheritDoc} */
     protected String getMonospacedBlock( String text )
     {
-        return AptMarkup.MONOSPACED_START_MARKUP + text + AptMarkup.MONOSPACED_END_MARKUP;
+        return text;
     }
 
     /** {@inheritDoc} */
@@ -227,6 +317,12 @@ public class AptSinkTest extends AbstractSinkTest
     }
 
     /** {@inheritDoc} */
+    protected String getLineBreakOpportunityBlock()
+    {
+        return "";
+    }
+
+    /** {@inheritDoc} */
     protected String getNonBreakingSpaceBlock()
     {
         return AptMarkup.NON_BREAKING_SPACE_MARKUP;
diff --git a/doxia-modules/doxia-module-confluence/src/main/java/org/apache/maven/doxia/module/confluence/ConfluenceSink.java b/doxia-modules/doxia-module-confluence/src/main/java/org/apache/maven/doxia/module/confluence/ConfluenceSink.java
index b8f2b90..4aa968a 100644
--- a/doxia-modules/doxia-module-confluence/src/main/java/org/apache/maven/doxia/module/confluence/ConfluenceSink.java
+++ b/doxia-modules/doxia-module-confluence/src/main/java/org/apache/maven/doxia/module/confluence/ConfluenceSink.java
@@ -22,12 +22,15 @@ package org.apache.maven.doxia.module.confluence;
 import java.io.PrintWriter;
 import java.io.StringWriter;
 import java.io.Writer;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Stack;
 
 import javax.swing.text.html.HTML.Attribute;
 
 import org.apache.maven.doxia.sink.SinkEventAttributes;
 import org.apache.maven.doxia.sink.impl.AbstractTextSink;
+import org.apache.maven.doxia.sink.impl.SinkEventAttributeSet;
 import org.apache.maven.doxia.util.HtmlTools;
 import org.codehaus.plexus.util.StringUtils;
 
@@ -61,6 +64,9 @@ public class ConfluenceSink
     /** An indication on if we're in monospaced mode. */
     private boolean monospacedFlag;
 
+    /** Keep track of the closing tags for inline events. */
+    protected Stack<List<String>> inlineStack = new Stack<List<String>>();
+
     /** An indication on if we're in verbatim box mode. */
     private boolean verbatimBoxedFlag;
 
@@ -159,13 +165,13 @@ public class ConfluenceSink
     /** {@inheritDoc} */
     public void bold()
     {
-        write( BOLD_START_MARKUP );
+        inline( SinkEventAttributeSet.Semantics.BOLD );
     }
 
     /** {@inheritDoc} */
     public void bold_()
     {
-        write( BOLD_END_MARKUP );
+        inline_();
     }
 
     /**
@@ -417,15 +423,67 @@ public class ConfluenceSink
     }
 
     /** {@inheritDoc} */
+    public void inline()
+    {
+        inline( null );
+    }
+
+    /** {@inheritDoc} */
+    public void inline( SinkEventAttributes attributes )
+    {
+        if ( !headFlag )
+        {
+            List<String> tags = new ArrayList<String>();
+
+            if ( attributes != null )
+            {
+
+                if ( attributes.containsAttribute( SinkEventAttributes.SEMANTICS, "italic" ) )
+                {
+                    write( ITALIC_START_MARKUP );
+                    tags.add( 0, ITALIC_END_MARKUP );
+                }
+
+                if ( attributes.containsAttribute( SinkEventAttributes.SEMANTICS, "bold" ) )
+                {
+                    write( BOLD_START_MARKUP );
+                    tags.add( 0, BOLD_END_MARKUP );
+                }
+
+                if ( attributes.containsAttribute( SinkEventAttributes.SEMANTICS, "code" ) )
+                {
+                    write( MONOSPACED_START_MARKUP );
+                    tags.add( 0, MONOSPACED_END_MARKUP );
+                }
+
+            }
+
+            inlineStack.push( tags );
+        }
+    }
+
+    /** {@inheritDoc} */
+    public void inline_()
+    {
+        if ( !headFlag )
+        {
+            for ( String tag: inlineStack.pop() )
+            {
+                write( tag );
+            }
+        }
+    }
+
+    /** {@inheritDoc} */
     public void italic()
     {
-        write( ITALIC_START_MARKUP );
+        inline( SinkEventAttributeSet.Semantics.ITALIC );
     }
 
     /** {@inheritDoc} */
     public void italic_()
     {
-        write( ITALIC_END_MARKUP );
+        inline_();
     }
 
     /** {@inheritDoc} */
@@ -510,14 +568,14 @@ public class ConfluenceSink
     public void monospaced()
     {
         monospacedFlag = true;
-        write( MONOSPACED_START_MARKUP );
+        inline( SinkEventAttributeSet.Semantics.CODE );
     }
 
     /** {@inheritDoc} */
     public void monospaced_()
     {
         monospacedFlag = false;
-        write( MONOSPACED_END_MARKUP );
+        inline_();
     }
 
     /**
diff --git a/doxia-modules/doxia-module-confluence/src/test/java/org/apache/maven/doxia/module/confluence/ConfluenceSinkTest.java b/doxia-modules/doxia-module-confluence/src/test/java/org/apache/maven/doxia/module/confluence/ConfluenceSinkTest.java
index 6ca360d..5e75bc1 100644
--- a/doxia-modules/doxia-module-confluence/src/test/java/org/apache/maven/doxia/module/confluence/ConfluenceSinkTest.java
+++ b/doxia-modules/doxia-module-confluence/src/test/java/org/apache/maven/doxia/module/confluence/ConfluenceSinkTest.java
@@ -53,6 +53,19 @@ public class ConfluenceSinkTest
         return false;
     }
 
+    /** {@inheritDoc} */
+    protected String getAddressBlock( String text )
+    {
+        return text;
+    }
+
+    /** Not used.
+     * {@inheritDoc} */
+    protected String getArticleBlock()
+    {
+        return "";
+    }
+
     /** Not used.
      * {@inheritDoc} */
     protected String getAuthorBlock( String author )
@@ -60,6 +73,12 @@ public class ConfluenceSinkTest
         return null;
     }
 
+    /** {@inheritDoc} */
+    protected String getBlockquoteBlock( String text )
+    {
+        return text;
+    }
+
     /** Not used.
      * {@inheritDoc} */
     protected String getBodyBlock()
@@ -75,6 +94,13 @@ public class ConfluenceSinkTest
 
     /** Not used.
      * {@inheritDoc} */
+    protected String getDataBlock( String value, String text )
+    {
+        return text;
+    }
+
+    /** Not used.
+     * {@inheritDoc} */
     protected String getDateBlock( String date )
     {
         return null;
@@ -87,6 +113,12 @@ public class ConfluenceSinkTest
     }
 
     /** {@inheritDoc} */
+    protected String getDivisionBlock( String text )
+    {
+        return text;
+    }
+
+    /** {@inheritDoc} */
     protected String getFigureBlock( String source, String caption )
     {
         String figureBlock = EOL + ConfluenceMarkup.FIGURE_START_MARKUP + source + ConfluenceMarkup.FIGURE_END_MARKUP;
@@ -111,6 +143,30 @@ public class ConfluenceSinkTest
     }
 
     /** {@inheritDoc} */
+    protected String getInlineBlock( String text )
+    {
+        return text;
+    }
+
+    /** {@inheritDoc} */
+    protected String getInlineBoldBlock( String text )
+    {
+        return ConfluenceMarkup.BOLD_START_MARKUP + text + ConfluenceMarkup.BOLD_END_MARKUP;
+    }
+
+    /** {@inheritDoc} */
+    protected String getInlineCodeBlock( String text )
+    {
+        return ConfluenceMarkup.MONOSPACED_START_MARKUP + text + ConfluenceMarkup.MONOSPACED_END_MARKUP;
+    }
+
+    /** {@inheritDoc} */
+    protected String getInlineItalicBlock( String text )
+    {
+        return ConfluenceMarkup.ITALIC_START_MARKUP + text + ConfluenceMarkup.ITALIC_END_MARKUP;
+    }
+
+    /** {@inheritDoc} */
     protected String getItalicBlock( String text )
     {
         return ConfluenceMarkup.ITALIC_START_MARKUP + text + ConfluenceMarkup.ITALIC_END_MARKUP;
@@ -123,6 +179,12 @@ public class ConfluenceSinkTest
     }
 
     /** {@inheritDoc} */
+    protected String getLineBreakOpportunityBlock()
+    {
+        return "";
+    }
+
+    /** {@inheritDoc} */
     protected String getLinkBlock( String link, String text )
     {
         return ConfluenceMarkup.LINK_START_MARKUP + text + ConfluenceMarkup.LINK_MIDDLE_MARKUP + link
@@ -141,6 +203,13 @@ public class ConfluenceSinkTest
         return ConfluenceMarkup.MONOSPACED_START_MARKUP + text + ConfluenceMarkup.MONOSPACED_END_MARKUP;
     }
 
+    /** Not used.
+     * {@inheritDoc} */
+    protected String getNavigationBlock()
+    {
+        return "";
+    }
+
     /** {@inheritDoc} */
     protected String getNonBreakingSpaceBlock()
     {
@@ -165,6 +234,19 @@ public class ConfluenceSinkTest
         return text + EOL + EOL;
     }
 
+    /** Not used.
+     * {@inheritDoc} */
+    protected String getSidebarBlock()
+    {
+        return "";
+    }
+
+    /** {@inheritDoc} */
+    protected String getTimeBlock( String datetime, String text )
+    {
+        return text;
+    }
+
     /** {@inheritDoc} */
     protected String getRawTextBlock( String text )
     {
@@ -207,6 +289,27 @@ public class ConfluenceSinkTest
         return title;
     }
 
+    /** Not used.
+     * {@inheritDoc} */
+    protected String getHeaderBlock()
+    {
+        return "";
+    }
+
+    /** Not used.
+     * {@inheritDoc} */
+    protected String getContentBlock()
+    {
+        return "";
+    }
+
+    /** Not used.
+     * {@inheritDoc} */
+    protected String getFooterBlock()
+    {
+        return "";
+    }
+
     /** {@inheritDoc} */
     protected String getTableBlock( String cell, String caption )
     {
diff --git a/doxia-modules/doxia-module-docbook-simple/src/main/java/org/apache/maven/doxia/module/docbook/DocBookSink.java b/doxia-modules/doxia-module-docbook-simple/src/main/java/org/apache/maven/doxia/module/docbook/DocBookSink.java
index 00991e4..da91a8e 100644
--- a/doxia-modules/doxia-module-docbook-simple/src/main/java/org/apache/maven/doxia/module/docbook/DocBookSink.java
+++ b/doxia-modules/doxia-module-docbook-simple/src/main/java/org/apache/maven/doxia/module/docbook/DocBookSink.java
@@ -22,22 +22,25 @@ package org.apache.maven.doxia.module.docbook;
 import java.io.PrintWriter;
 import java.io.StringWriter;
 import java.io.Writer;
+import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
+import java.util.Stack;
 import java.util.StringTokenizer;
 import java.util.TreeSet;
 
 import javax.swing.text.MutableAttributeSet;
 import javax.swing.text.SimpleAttributeSet;
 
+import org.apache.maven.doxia.sink.Sink;
 import org.apache.maven.doxia.sink.SinkEventAttributes;
 import org.apache.maven.doxia.sink.impl.AbstractXmlSink;
-import org.apache.maven.doxia.sink.Sink;
+import org.apache.maven.doxia.sink.impl.SinkEventAttributeSet;
 import org.apache.maven.doxia.util.DoxiaUtils;
 import org.apache.maven.doxia.util.HtmlTools;
-
 import org.codehaus.plexus.util.FileUtils;
 
 /**
@@ -150,6 +153,9 @@ public class DocBookSink
 
     private String encoding;
 
+    /** Keep track of the closing tags for inline events. */
+    protected Stack<List<String>> inlineStack = new Stack<List<String>>();
+
     /** Map of warn messages with a String as key to describe the error type and a Set as value.
      * Using to reduce warn messages. */
     private Map<String, Set<String>> warnMessages;
@@ -683,6 +689,24 @@ public class DocBookSink
 
     /**
      * {@inheritDoc}
+     * @see SimplifiedDocbookMarkup#SIDEBAR_TAG
+     */
+    public void sidebar()
+    {
+        writeStartTag( SimplifiedDocbookMarkup.SIDEBAR_TAG );
+    }
+
+    /**
+     * {@inheritDoc}
+     * @see SimplifiedDocbookMarkup#SIDEBAR_TAG
+     */
+    public void sidebar_()
+    {
+        writeEndTag( SimplifiedDocbookMarkup.SIDEBAR_TAG );
+    }
+
+    /**
+     * {@inheritDoc}
      * @see SimplifiedDocbookMarkup#SECTION_TAG
      */
     public void section1()
@@ -881,6 +905,24 @@ public class DocBookSink
 
     /**
      * {@inheritDoc}
+     * @see SimplifiedDocbookMarkup#SECTIONINFO_TAG
+     */
+    public void header()
+    {
+        writeStartTag( SimplifiedDocbookMarkup.SECTIONINFO_TAG );
+    }
+
+    /**
+     * {@inheritDoc}
+     * @see SimplifiedDocbookMarkup#SECTIONINFO_TAG
+     */
+    public void header_()
+    {
+        writeEndTag( SimplifiedDocbookMarkup.SECTIONINFO_TAG );
+    }
+
+    /**
+     * {@inheritDoc}
      * @see SimplifiedDocbookMarkup#ITEMIZEDLIST_TAG
      */
     public void list()
@@ -1494,45 +1536,88 @@ public class DocBookSink
     }
 
     /** {@inheritDoc} */
+    public void inline()
+    {
+        inline( null );
+    }
+
+    /** {@inheritDoc} */
+    public void inline( SinkEventAttributes attributes )
+    {
+        List<String> tags = new ArrayList<String>();
+
+        if ( attributes != null )
+        {
+
+            if ( attributes.containsAttribute( SinkEventAttributes.SEMANTICS, "italic" ) )
+            {
+                markup( italicBeginTag );
+                tags.add( 0, italicEndTag );
+            }
+
+            if ( attributes.containsAttribute( SinkEventAttributes.SEMANTICS, "bold" ) )
+            {
+                write( boldBeginTag );
+                tags.add( 0, boldEndTag );
+            }
+
+            if ( attributes.containsAttribute( SinkEventAttributes.SEMANTICS, "code" ) )
+            {
+                if ( !authorDateFlag )
+                {
+                    write( monospacedBeginTag );
+                    tags.add( 0, monospacedEndTag );
+                }
+            }
+
+        }
+
+        inlineStack.push( tags );
+    }
+
+    /** {@inheritDoc} */
+    public void inline_()
+    {
+        for ( String tag: inlineStack.pop() )
+        {
+            markup( tag );
+        }
+    }
+
+    /** {@inheritDoc} */
     public void italic()
     {
-        markup( italicBeginTag );
+        inline( SinkEventAttributeSet.Semantics.ITALIC );
     }
 
     /** {@inheritDoc} */
     public void italic_()
     {
-        markup( italicEndTag );
+        inline_();
     }
 
     /** {@inheritDoc} */
     public void bold()
     {
-        markup( boldBeginTag );
+        inline( SinkEventAttributeSet.Semantics.BOLD );
     }
 
     /** {@inheritDoc} */
     public void bold_()
     {
-        markup( boldEndTag );
+        inline_();
     }
 
     /** {@inheritDoc} */
     public void monospaced()
     {
-        if ( !authorDateFlag )
-        {
-            markup( monospacedBeginTag );
-        }
+        inline( SinkEventAttributeSet.Semantics.CODE );
     }
 
     /** {@inheritDoc} */
     public void monospaced_()
     {
-        if ( !authorDateFlag )
-        {
-            markup( monospacedEndTag );
-        }
+        inline_();
     }
 
     /** {@inheritDoc} */
diff --git a/doxia-modules/doxia-module-docbook-simple/src/test/java/org/apache/maven/doxia/module/docbook/DocBookSinkTest.java b/doxia-modules/doxia-module-docbook-simple/src/test/java/org/apache/maven/doxia/module/docbook/DocBookSinkTest.java
index 20b86cc..c862f3d 100644
--- a/doxia-modules/doxia-module-docbook-simple/src/test/java/org/apache/maven/doxia/module/docbook/DocBookSinkTest.java
+++ b/doxia-modules/doxia-module-docbook-simple/src/test/java/org/apache/maven/doxia/module/docbook/DocBookSinkTest.java
@@ -20,7 +20,6 @@ package org.apache.maven.doxia.module.docbook;
  */
 
 import java.io.Writer;
-
 import java.util.Locale;
 
 import javax.swing.text.MutableAttributeSet;
@@ -30,7 +29,6 @@ import org.apache.maven.doxia.sink.Sink;
 import org.apache.maven.doxia.sink.impl.AbstractSinkTest;
 import org.apache.maven.doxia.sink.impl.SinkUtils;
 import org.apache.maven.doxia.util.DoxiaUtils;
-
 import org.codehaus.plexus.util.FileUtils;
 
 /**
@@ -90,6 +88,24 @@ public class DocBookSinkTest extends AbstractSinkTest
     }
 
     /** {@inheritDoc} */
+    protected String getArticleBlock()
+    {
+        return "";
+    }
+
+    /** {@inheritDoc} */
+    protected String getNavigationBlock()
+    {
+        return "";
+    }
+
+    /** {@inheritDoc} */
+    protected String getSidebarBlock()
+    {
+        return "<sidebar></sidebar>";
+    }
+
+    /** {@inheritDoc} */
     protected String getSectionTitleBlock( String title )
     {
         return "<title>" + title + "</title>";
@@ -98,31 +114,49 @@ public class DocBookSinkTest extends AbstractSinkTest
     /** {@inheritDoc} */
     protected String getSection1Block( String title )
     {
-        return "<section><title>" + title + "</title>" + "</section>";
+        return "<section><sectioninfo><title>" + title + "</title></sectioninfo></section>";
     }
 
     /** {@inheritDoc} */
     protected String getSection2Block( String title )
     {
-        return "<section><title>" + title + "</title>" + "</section>";
+        return "<section><sectioninfo><title>" + title + "</title></sectioninfo></section>";
     }
 
     /** {@inheritDoc} */
     protected String getSection3Block( String title )
     {
-        return "<section><title>" + title + "</title>" + "</section>";
+        return "<section><sectioninfo><title>" + title + "</title></sectioninfo></section>";
     }
 
     /** {@inheritDoc} */
     protected String getSection4Block( String title )
     {
-        return "<section><title>" + title + "</title>" + "</section>";
+        return "<section><sectioninfo><title>" + title + "</title></sectioninfo></section>";
     }
 
     /** {@inheritDoc} */
     protected String getSection5Block( String title )
     {
-        return "<section><title>" + title + "</title>" + "</section>";
+        return "<section><sectioninfo><title>" + title + "</title></sectioninfo></section>";
+    }
+
+    /** {@inheritDoc} */
+    protected String getHeaderBlock()
+    {
+        return "<sectioninfo></sectioninfo>";
+    }
+
+    /** {@inheritDoc} */
+    protected String getContentBlock()
+    {
+        return "";
+    }
+
+    /** {@inheritDoc} */
+    protected String getFooterBlock()
+    {
+        return "";
     }
 
     /** {@inheritDoc} */
@@ -183,6 +217,36 @@ public class DocBookSinkTest extends AbstractSinkTest
     }
 
     /** {@inheritDoc} */
+    protected String getDataBlock( String value, String text )
+    {
+        return text;
+    }
+
+    /** {@inheritDoc} */
+    protected String getTimeBlock( String datetime, String text )
+    {
+        return text;
+    }
+
+    /** {@inheritDoc} */
+    protected String getAddressBlock( String text )
+    {
+        return text;
+    }
+
+    /** {@inheritDoc} */
+    protected String getBlockquoteBlock( String text )
+    {
+        return text;
+    }
+
+    /** {@inheritDoc} */
+    protected String getDivisionBlock( String text )
+    {
+        return text;
+    }
+
+    /** {@inheritDoc} */
     protected String getVerbatimBlock( String text )
     {
         return "<programlisting>" + text + "</programlisting>";
@@ -214,6 +278,30 @@ public class DocBookSinkTest extends AbstractSinkTest
     }
 
     /** {@inheritDoc} */
+    protected String getInlineBlock( String text )
+    {
+        return text;
+    }
+
+    /** {@inheritDoc} */
+    protected String getInlineItalicBlock( String text )
+    {
+        return "<emphasis>" + text + "</emphasis>";
+    }
+
+    /** {@inheritDoc} */
+    protected String getInlineBoldBlock( String text )
+    {
+        return "<emphasis role=\"bold\">" + text + "</emphasis>";
+    }
+
+    /** {@inheritDoc} */
+    protected String getInlineCodeBlock( String text )
+    {
+        return "<literal>" + text + "</literal>";
+    }
+
+    /** {@inheritDoc} */
     protected String getItalicBlock( String text )
     {
         return "<emphasis>" + text + "</emphasis>";
@@ -238,6 +326,12 @@ public class DocBookSinkTest extends AbstractSinkTest
     }
 
     /** {@inheritDoc} */
+    protected String getLineBreakOpportunityBlock()
+    {
+        return "";
+    }
+
+    /** {@inheritDoc} */
     protected String getNonBreakingSpaceBlock()
     {
         return "&#x00A0;";
diff --git a/doxia-modules/doxia-module-fml/src/main/java/org/apache/maven/doxia/module/fml/FmlContentParser.java b/doxia-modules/doxia-module-fml/src/main/java/org/apache/maven/doxia/module/fml/FmlContentParser.java
index ee1478b..a268d36 100644
--- a/doxia-modules/doxia-module-fml/src/main/java/org/apache/maven/doxia/module/fml/FmlContentParser.java
+++ b/doxia-modules/doxia-module-fml/src/main/java/org/apache/maven/doxia/module/fml/FmlContentParser.java
@@ -20,7 +20,7 @@ package org.apache.maven.doxia.module.fml;
  */
 
 import org.apache.maven.doxia.macro.MacroExecutionException;
-import org.apache.maven.doxia.parser.XhtmlBaseParser;
+import org.apache.maven.doxia.parser.Xhtml5BaseParser;
 import org.apache.maven.doxia.sink.Sink;
 import org.apache.maven.doxia.sink.impl.SinkEventAttributeSet;
 import org.codehaus.plexus.util.xml.pull.XmlPullParser;
@@ -34,7 +34,7 @@ import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
  * @since 1.0
  */
 public class FmlContentParser
-    extends XhtmlBaseParser
+    extends Xhtml5BaseParser
     implements FmlMarkup
 {
     /** Empty elements don't write a closing tag. */
diff --git a/doxia-modules/doxia-module-fml/src/main/java/org/apache/maven/doxia/module/fml/FmlParser.java b/doxia-modules/doxia-module-fml/src/main/java/org/apache/maven/doxia/module/fml/FmlParser.java
index d617321..c2a296e 100644
--- a/doxia-modules/doxia-module-fml/src/main/java/org/apache/maven/doxia/module/fml/FmlParser.java
+++ b/doxia-modules/doxia-module-fml/src/main/java/org/apache/maven/doxia/module/fml/FmlParser.java
@@ -23,7 +23,6 @@ import java.io.IOException;
 import java.io.Reader;
 import java.io.StringReader;
 import java.io.StringWriter;
-
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
@@ -46,7 +45,6 @@ import org.apache.maven.doxia.sink.impl.SinkEventAttributeSet;
 import org.apache.maven.doxia.sink.impl.XhtmlBaseSink;
 import org.apache.maven.doxia.util.DoxiaUtils;
 import org.apache.maven.doxia.util.HtmlTools;
-
 import org.codehaus.plexus.component.annotations.Component;
 import org.codehaus.plexus.util.IOUtil;
 import org.codehaus.plexus.util.StringUtils;
@@ -583,9 +581,9 @@ public class FmlParser
             if ( StringUtils.isNotEmpty( part.getTitle() ) )
             {
                 sink.paragraph();
-                sink.bold();
+                sink.inline( SinkEventAttributeSet.Semantics.BOLD );
                 xdocParser.parse( part.getTitle(), sink );
-                sink.bold_();
+                sink.inline_();
                 sink.paragraph_();
             }
 
diff --git a/doxia-modules/doxia-module-fml/src/test/java/org/apache/maven/doxia/module/fml/FmlParserTest.java b/doxia-modules/doxia-module-fml/src/test/java/org/apache/maven/doxia/module/fml/FmlParserTest.java
index c2991db..176650c 100644
--- a/doxia-modules/doxia-module-fml/src/test/java/org/apache/maven/doxia/module/fml/FmlParserTest.java
+++ b/doxia-modules/doxia-module-fml/src/test/java/org/apache/maven/doxia/module/fml/FmlParserTest.java
@@ -123,9 +123,9 @@ public class FmlParserTest
         assertEquals( "anchor_", ( it.next() ).getName() );
         assertEquals( "sectionTitle1_", ( it.next() ).getName() );
         assertEquals( "paragraph", ( it.next() ).getName() );
-        assertEquals( "bold", ( it.next() ).getName() );
+        assertEquals( "inline", ( it.next() ).getName() );
         assertEquals( "text", ( it.next() ).getName() );
-        assertEquals( "bold_", ( it.next() ).getName() );
+        assertEquals( "inline_", ( it.next() ).getName() );
         assertEquals( "paragraph_", ( it.next() ).getName() );
         assertEquals( "numberedList", ( it.next() ).getName() );
         assertEquals( "numberedListItem", ( it.next() ).getName() );
@@ -197,13 +197,13 @@ public class FmlParserTest
         assertEquals( "anchor_", ( it.next() ).getName() );
         assertEquals( "sectionTitle1_", ( it.next() ).getName() );
         assertEquals( "paragraph", ( it.next() ).getName() );
-        assertEquals( "bold", ( it.next() ).getName() );
+        assertEquals( "inline", ( it.next() ).getName() );
 
         // part title in TOC
         assertTextEvent( it.next(), "<" );
         assertTextEvent( it.next(), "\u0391" );
 
-        assertEquals( "bold_", ( it.next() ).getName() );
+        assertEquals( "inline_", ( it.next() ).getName() );
         assertEquals( "paragraph_", ( it.next() ).getName() );
         assertEquals( "numberedList", ( it.next() ).getName() );
         assertEquals( "numberedListItem", ( it.next() ).getName() );
@@ -239,11 +239,11 @@ public class FmlParserTest
         assertEquals( "paragraph", ( it.next() ).getName() );
 
         // answer
-        assertEquals( "monospaced", ( it.next() ).getName() );
+        assertEquals( "inline", ( it.next() ).getName() );
         assertTextEvent( it.next(), "<" );
         assertTextEvent( it.next(), "img" );
         assertTextEvent( it.next(), ">" );
-        assertEquals( "monospaced_", ( it.next() ).getName() );
+        assertEquals( "inline_", ( it.next() ).getName() );
         assertTextEvent( it.next(), "\"" );
         assertTextEvent( it.next(), "\u0391" );
 
diff --git a/doxia-modules/doxia-module-fo/src/main/java/org/apache/maven/doxia/module/fo/FoSink.java b/doxia-modules/doxia-module-fo/src/main/java/org/apache/maven/doxia/module/fo/FoSink.java
index da6c6c7..2a448a3 100644
--- a/doxia-modules/doxia-module-fo/src/main/java/org/apache/maven/doxia/module/fo/FoSink.java
+++ b/doxia-modules/doxia-module-fo/src/main/java/org/apache/maven/doxia/module/fo/FoSink.java
@@ -24,9 +24,11 @@ import java.io.IOException;
 import java.io.PrintWriter;
 import java.io.StringWriter;
 import java.io.Writer;
+import java.util.ArrayList;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.LinkedList;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.Stack;
@@ -113,6 +115,9 @@ public class FoSink
     /** The stack of table caption */
     private final LinkedList<String> tableCaptionStack;
 
+    /** Keep track of the closing tags for inline events. */
+    protected Stack<List<Tag>> inlineStack = new Stack<List<Tag>>();
+
     /** Map of warn messages with a String as key to describe the error type and a Set as value.
      * Using to reduce warn messages. */
     protected Map<String, Set<String>> warnMessages;
@@ -1253,39 +1258,85 @@ public class FoSink
     }
 
     /** {@inheritDoc} */
+    public void inline()
+    {
+        inline( null );
+    }
+
+    /** {@inheritDoc} */
+    public void inline( SinkEventAttributes attributes )
+    {
+        List<Tag> tags = new ArrayList<Tag>();
+
+        if ( attributes != null )
+        {
+
+            if ( attributes.containsAttribute( SinkEventAttributes.SEMANTICS, "italic" ) )
+            {
+                writeStartTag( INLINE_TAG, "italic" );
+                tags.add( 0, INLINE_TAG );
+            }
+
+            if ( attributes.containsAttribute( SinkEventAttributes.SEMANTICS, "bold" ) )
+            {
+                writeStartTag( INLINE_TAG, "bold" );
+                tags.add( 0, INLINE_TAG );
+            }
+
+            if ( attributes.containsAttribute( SinkEventAttributes.SEMANTICS, "code" ) )
+            {
+                writeStartTag( INLINE_TAG, "monospace" );
+                tags.add( 0, INLINE_TAG );
+            }
+
+        }
+
+        inlineStack.push( tags );
+    }
+
+    /** {@inheritDoc} */
+    public void inline_()
+    {
+        for ( Tag tag: inlineStack.pop() )
+        {
+            writeEndTag( tag );
+        }
+    }
+
+    /** {@inheritDoc} */
     public void italic()
     {
-        writeStartTag( INLINE_TAG, "italic" );
+        inline( SinkEventAttributeSet.Semantics.ITALIC );
     }
 
     /** {@inheritDoc} */
     public void italic_()
     {
-        writeEndTag( INLINE_TAG );
+        inline_();
     }
 
     /** {@inheritDoc} */
     public void bold()
     {
-        writeStartTag( INLINE_TAG, "bold" );
+        inline( SinkEventAttributeSet.Semantics.BOLD );
     }
 
     /** {@inheritDoc} */
     public void bold_()
     {
-        writeEndTag( INLINE_TAG );
+        inline_();
     }
 
     /** {@inheritDoc} */
     public void monospaced()
     {
-        writeStartTag( INLINE_TAG, "monospace" );
+        inline( SinkEventAttributeSet.Semantics.CODE );
     }
 
     /** {@inheritDoc} */
     public void monospaced_()
     {
-        writeEndTag( INLINE_TAG );
+        inline_();
     }
 
     /** {@inheritDoc} */
diff --git a/doxia-modules/doxia-module-fo/src/test/java/org/apache/maven/doxia/module/fo/FoSinkTest.java b/doxia-modules/doxia-module-fo/src/test/java/org/apache/maven/doxia/module/fo/FoSinkTest.java
index 70ce09e..7d78aca 100644
--- a/doxia-modules/doxia-module-fo/src/test/java/org/apache/maven/doxia/module/fo/FoSinkTest.java
+++ b/doxia-modules/doxia-module-fo/src/test/java/org/apache/maven/doxia/module/fo/FoSinkTest.java
@@ -199,6 +199,21 @@ public class FoSinkTest
         return EOL + "</fo:flow>" + EOL + "</fo:page-sequence>" + EOL + "</fo:root>" + EOL;
     }
 
+    protected String getArticleBlock()
+    {
+        return "";
+    }
+
+    protected String getNavigationBlock()
+    {
+        return "";
+    }
+
+    protected String getSidebarBlock()
+    {
+        return "";
+    }
+
     /** {@inheritDoc} */
     protected String getSectionTitleBlock( String title )
     {
@@ -250,6 +265,22 @@ public class FoSinkTest
             + "</fo:block>" + EOL + "</fo:block>" + EOL;
     }
 
+    protected String getHeaderBlock()
+    {
+        return "";
+    }
+
+    /** {@inheritDoc} */
+    protected String getContentBlock()
+    {
+        return "";
+    }
+
+    protected String getFooterBlock()
+    {
+        return "";
+    }
+
     /** {@inheritDoc} */
     protected String getListBlock( String item )
     {
@@ -332,6 +363,36 @@ public class FoSinkTest
     }
 
     /** {@inheritDoc} */
+    protected String getDataBlock( String value, String text )
+    {
+        return text;
+    }
+
+    /** {@inheritDoc} */
+    protected String getTimeBlock( String datetime, String text )
+    {
+        return text;
+    }
+
+    /** {@inheritDoc} */
+    protected String getAddressBlock( String text )
+    {
+        return text;
+    }
+
+    /** {@inheritDoc} */
+    protected String getBlockquoteBlock( String text )
+    {
+        return text;
+    }
+
+    /** {@inheritDoc} */
+    protected String getDivisionBlock( String text )
+    {
+        return text;
+    }
+
+    /** {@inheritDoc} */
     protected String getVerbatimBlock( String text )
     {
         String attribs = getConfig().getAttributeString( "body.source" );
@@ -367,6 +428,33 @@ public class FoSinkTest
     }
 
     /** {@inheritDoc} */
+    protected String getInlineBlock( String text )
+    {
+        return text;
+    }
+
+    /** {@inheritDoc} */
+    protected String getInlineItalicBlock( String text )
+    {
+        String attribs = getConfig().getAttributeString( "italic" );
+        return EOL + "<fo:inline" + attribs + ">" + text + "</fo:inline>";
+    }
+
+    /** {@inheritDoc} */
+    protected String getInlineBoldBlock( String text )
+    {
+        String attribs = getConfig().getAttributeString( "bold" );
+        return EOL + "<fo:inline" + attribs + ">" + text + "</fo:inline>";
+    }
+
+    /** {@inheritDoc} */
+    protected String getInlineCodeBlock( String text )
+    {
+        String attribs = getConfig().getAttributeString( "monospace" );
+        return EOL + "<fo:inline" + attribs + ">" + text + "</fo:inline>";
+    }
+
+    /** {@inheritDoc} */
     protected String getItalicBlock( String text )
     {
         String attribs = getConfig().getAttributeString( "italic" );
@@ -394,6 +482,12 @@ public class FoSinkTest
     }
 
     /** {@inheritDoc} */
+    protected String getLineBreakOpportunityBlock()
+    {
+        return "";
+    }
+
+    /** {@inheritDoc} */
     protected String getNonBreakingSpaceBlock()
     {
         return "&#160;";
diff --git a/doxia-modules/doxia-module-itext/src/main/java/org/apache/maven/doxia/module/itext/ITextSink.java b/doxia-modules/doxia-module-itext/src/main/java/org/apache/maven/doxia/module/itext/ITextSink.java
index 76b788a..7dd32ec 100644
--- a/doxia-modules/doxia-module-itext/src/main/java/org/apache/maven/doxia/module/itext/ITextSink.java
+++ b/doxia-modules/doxia-module-itext/src/main/java/org/apache/maven/doxia/module/itext/ITextSink.java
@@ -32,15 +32,19 @@ import java.io.StringWriter;
 import java.io.Writer;
 import java.net.MalformedURLException;
 import java.net.URL;
+import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
+import java.util.Stack;
 import java.util.TreeSet;
 
 import org.apache.maven.doxia.sink.Sink;
 import org.apache.maven.doxia.sink.SinkEventAttributes;
 import org.apache.maven.doxia.sink.impl.AbstractXmlSink;
+import org.apache.maven.doxia.sink.impl.SinkEventAttributeSet;
 import org.apache.maven.doxia.util.DoxiaUtils;
 import org.apache.maven.doxia.util.HtmlTools;
 
@@ -118,6 +122,9 @@ public class ITextSink
     /** Flag to know if an figure event is called. */
     private boolean figureDefined = false;
 
+    /** Keep track of the closing tags for inline events. */
+    protected Stack<List<String>> inlineStack = new Stack<List<String>>();
+
     /** Map of warn messages with a String as key to describe the error type and a Set as value.
      * Using to reduce warn messages. */
     private Map<String, Set<String>> warnMessages;
@@ -1268,39 +1275,96 @@ public class ITextSink
     // ----------------------------------------------------------------------
 
     /** {@inheritDoc} */
+    public void inline()
+    {
+        inline( null );
+    }
+
+    /** {@inheritDoc} */
+    public void inline( SinkEventAttributes attributes )
+    {
+        List<String> tags = new ArrayList<String>();
+
+        if ( attributes != null )
+        {
+
+            if ( attributes.containsAttribute( SinkEventAttributes.SEMANTICS, "italic" ) )
+            {
+                font.addItalic();
+                tags.add( 0, "italic" );
+            }
+
+            if ( attributes.containsAttribute( SinkEventAttributes.SEMANTICS, "bold" ) )
+            {
+                font.addBold();
+                tags.add( 0, "bold" );
+            }
+
+            if ( attributes.containsAttribute( SinkEventAttributes.SEMANTICS, "code" ) )
+            {
+                font.setMonoSpaced( true );
+                tags.add( 0, "code" );
+            }
+
+        }
+
+        inlineStack.push( tags );
+    }
+
+    /** {@inheritDoc} */
+    public void inline_()
+    {
+        for ( String tag: inlineStack.pop() )
+        {
+            if ( "italic".equals( tag ) )
+            {
+                font.removeItalic();
+            }
+            else if ( "bold".equals( tag ) )
+            {
+                font.removeBold();
+            }
+            else if ( "code".equals( tag ) )
+            {
+                font.setMonoSpaced( false );
+            }
+        }
+    }
+
+    /** {@inheritDoc} */
     public void bold_()
     {
-        font.removeBold();
+        inline_();
     }
 
     /** {@inheritDoc} */
     public void bold()
     {
-        font.addBold();
+        inline( SinkEventAttributeSet.Semantics.BOLD );
     }
 
     /** {@inheritDoc} */
     public void italic_()
     {
-        font.removeItalic();
+        inline_();
     }
 
     /** {@inheritDoc} */
     public void italic()
     {
-        font.addItalic();
+        inline( SinkEventAttributeSet.Semantics.ITALIC );
     }
 
     /** {@inheritDoc} */
     public void monospaced_()
     {
-        font.setMonoSpaced( false );
+        inline_();
     }
 
     /** {@inheritDoc} */
     public void monospaced()
     {
-        font.setMonoSpaced( true );
+        inline( SinkEventAttributeSet.Semantics.CODE );
     }
 
     // ----------------------------------------------------------------------
diff --git a/doxia-modules/doxia-module-latex/src/main/java/org/apache/maven/doxia/module/latex/LatexSink.java b/doxia-modules/doxia-module-latex/src/main/java/org/apache/maven/doxia/module/latex/LatexSink.java
index 0bce451..9566af4 100644
--- a/doxia-modules/doxia-module-latex/src/main/java/org/apache/maven/doxia/module/latex/LatexSink.java
+++ b/doxia-modules/doxia-module-latex/src/main/java/org/apache/maven/doxia/module/latex/LatexSink.java
@@ -32,7 +32,10 @@ import org.codehaus.plexus.util.StringUtils;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.Writer;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Locale;
+import java.util.Stack;
 
 /**
  * Latex Sink implementation.
@@ -80,6 +83,9 @@ public class LatexSink
 
     private String title;
 
+    /** Keep track of the closing tags for inline events. */
+    protected Stack<List<String>> inlineStack = new Stack<List<String>>();
+
     // ----------------------------------------------------------------------
     //
     // ----------------------------------------------------------------------
@@ -1126,12 +1132,58 @@ public class LatexSink
         markup( "}" );
     }
 
+    /** {@inheritDoc} */
+    public void inline()
+    {
+        inline( null );
+    }
+
+    /** {@inheritDoc} */
+    public void inline( SinkEventAttributes attributes )
+    {
+        List<String> tags = new ArrayList<String>();
+
+        if ( attributes != null )
+        {
+
+            if ( attributes.containsAttribute( SinkEventAttributes.SEMANTICS, "italic" ) )
+            {
+                markup( "\\textit{" );
+                tags.add( 0, "}" );
+            }
+
+            if ( attributes.containsAttribute( SinkEventAttributes.SEMANTICS, "bold" ) )
+            {
+                markup( "\\textbf{" );
+                tags.add( 0, "}" );
+            }
+
+            if ( attributes.containsAttribute( SinkEventAttributes.SEMANTICS, "code" ) )
+            {
+                markup( "\\texttt{\\small " );
+                tags.add( 0, "}" );
+            }
+
+        }
+
+        inlineStack.push( tags );
+    }
+
+    /** {@inheritDoc} */
+    public void inline_()
+    {
+        for ( String tag: inlineStack.pop() )
+        {
+            markup( tag );
+        }
+    }
+
     /**
      * {@inheritDoc}
      */
     public void italic()
     {
-        markup( "\\textit{" );
+        inline( SinkEventAttributeSet.Semantics.ITALIC );
     }
 
     /**
@@ -1139,7 +1191,7 @@ public class LatexSink
      */
     public void italic_()
     {
-        markup( "}" );
+        inline_();
     }
 
     /**
@@ -1147,7 +1199,7 @@ public class LatexSink
      */
     public void bold()
     {
-        markup( "\\textbf{" );
+        inline( SinkEventAttributeSet.Semantics.BOLD );
     }
 
     /**
@@ -1155,7 +1207,7 @@ public class LatexSink
      */
     public void bold_()
     {
-        markup( "}" );
+        inline_();
     }
 
     /**
@@ -1163,7 +1215,7 @@ public class LatexSink
      */
     public void monospaced()
     {
-        markup( "\\texttt{\\small " );
+        inline( SinkEventAttributeSet.Semantics.CODE );
     }
 
     /**
@@ -1171,7 +1223,7 @@ public class LatexSink
      */
     public void monospaced_()
     {
-        markup( "}" );
+        inline_();
     }
 
     /**
diff --git a/doxia-modules/doxia-module-latex/src/test/java/org/apache/maven/doxia/module/latex/LatexSinkTest.java b/doxia-modules/doxia-module-latex/src/test/java/org/apache/maven/doxia/module/latex/LatexSinkTest.java
index e2f0e68..dc259a5 100644
--- a/doxia-modules/doxia-module-latex/src/test/java/org/apache/maven/doxia/module/latex/LatexSinkTest.java
+++ b/doxia-modules/doxia-module-latex/src/test/java/org/apache/maven/doxia/module/latex/LatexSinkTest.java
@@ -83,6 +83,24 @@ public class LatexSinkTest
     }
 
     /** {@inheritDoc} */
+    protected String getArticleBlock()
+    {
+        return "";
+    }
+
+    /** {@inheritDoc} */
+    protected String getNavigationBlock()
+    {
+        return "";
+    }
+
+    /** {@inheritDoc} */
+    protected String getSidebarBlock()
+    {
+        return "";
+    }
+
+    /** {@inheritDoc} */
     protected String getSectionTitleBlock( String title )
     {
         return title;
@@ -119,6 +137,24 @@ public class LatexSinkTest
     }
 
     /** {@inheritDoc} */
+    protected String getHeaderBlock()
+    {
+        return "";
+    }
+
+    /** {@inheritDoc} */
+    protected String getContentBlock()
+    {
+        return "";
+    }
+
+    /** {@inheritDoc} */
+    protected String getFooterBlock()
+    {
+        return "";
+    }
+
+    /** {@inheritDoc} */
     protected String getListBlock( String item )
     {
         return EOL + "\\begin{itemize}" + EOL + "\\item " + LatexSink.escaped( item ) + EOL + "\\end{itemize}" + EOL;
@@ -166,6 +202,36 @@ public class LatexSinkTest
     }
 
     /** {@inheritDoc} */
+    protected String getDataBlock( String value, String text )
+    {
+        return text;
+    }
+
+    /** {@inheritDoc} */
+    protected String getTimeBlock( String datetime, String text )
+    {
+        return text;
+    }
+
+    /** {@inheritDoc} */
+    protected String getAddressBlock( String text )
+    {
+        return text;
+    }
+
+    /** {@inheritDoc} */
+    protected String getBlockquoteBlock( String text )
+    {
+        return text;
+    }
+
+    /** {@inheritDoc} */
+    protected String getDivisionBlock( String text )
+    {
+        return text;
+    }
+
+    /** {@inheritDoc} */
     protected String getVerbatimBlock( String text )
     {
         return EOL + "\\begin{small}" + EOL + "\\begin{Verbatim}[frame=single]" + EOL + text + EOL
@@ -197,6 +263,30 @@ public class LatexSinkTest
     }
 
     /** {@inheritDoc} */
+    protected String getInlineBlock( String text )
+    {
+        return text;
+    }
+
+    /** {@inheritDoc} */
+    protected String getInlineItalicBlock( String text )
+    {
+        return "\\textit{" + text + "}";
+    }
+
+    /** {@inheritDoc} */
+    protected String getInlineBoldBlock( String text )
+    {
+        return "\\textbf{" + text + "}";
+    }
+
+    /** {@inheritDoc} */
+    protected String getInlineCodeBlock( String text )
+    {
+        return "\\texttt{\\small " + text + "}";
+    }
+
+    /** {@inheritDoc} */
     protected String getItalicBlock( String text )
     {
         return "\\textit{" + text + "}";
@@ -221,6 +311,12 @@ public class LatexSinkTest
     }
 
     /** {@inheritDoc} */
+    protected String getLineBreakOpportunityBlock()
+    {
+        return "";
+    }
+
+    /** {@inheritDoc} */
     protected String getNonBreakingSpaceBlock()
     {
         return "~";
diff --git a/doxia-modules/doxia-module-markdown/src/test/java/org/apache/maven/doxia/module/markdown/MarkdownParserTest.java b/doxia-modules/doxia-module-markdown/src/test/java/org/apache/maven/doxia/module/markdown/MarkdownParserTest.java
index 2f99bc9..b1fb22c 100644
--- a/doxia-modules/doxia-module-markdown/src/test/java/org/apache/maven/doxia/module/markdown/MarkdownParserTest.java
+++ b/doxia-modules/doxia-module-markdown/src/test/java/org/apache/maven/doxia/module/markdown/MarkdownParserTest.java
@@ -101,7 +101,7 @@ public class MarkdownParserTest
     {
         Iterator<SinkEventElement> it = parseFileToEventTestingSink( "bold" ).getEventList().iterator();
 
-        assertEquals( it, "head", "head_", "body", "paragraph", "bold", "text", "bold_", "paragraph_", "body_" );
+        assertEquals( it, "head", "head_", "body", "paragraph", "inline", "text", "inline_", "paragraph_", "body_" );
 
         assertFalse( it.hasNext() );
     }
@@ -116,7 +116,7 @@ public class MarkdownParserTest
     {
         Iterator<SinkEventElement> it = parseFileToEventTestingSink( "italic" ).getEventList().iterator();
 
-        assertEquals( it, "head", "head_", "body", "paragraph", "italic", "text", "italic_", "paragraph_", "body_" );
+        assertEquals( it, "head", "head_", "body", "paragraph", "inline", "text", "inline_", "paragraph_", "body_" );
 
         assertFalse( it.hasNext() );
     }
@@ -290,8 +290,8 @@ public class MarkdownParserTest
         Iterator<SinkEventElement> it = parseFileToEventTestingSink( "html-content" ).getEventList().iterator();
 
         // NOTE: H1 and DIV are rendered as "unknown" and H2 is "section1" (see DOXIA-203)
-        assertEquals( it, "head", "head_", "body", "unknown", "text", "paragraph", "bold", "text",
-                      "bold_", "text", "bold", "text", "bold_", "text", "paragraph_", "text", "unknown", "text", "horizontalRule", "unknown",
+        assertEquals( it, "head", "head_", "body", "unknown", "text", "paragraph", "inline", "text",
+                      "inline_", "text", "inline", "text", "inline_", "text", "paragraph_", "text", "unknown", "text", "horizontalRule", "unknown",
                 "text", "unknown", "paragraph", "text", "paragraph_", "text", "table", "tableRows", "text", "tableRow",
                 "tableHeaderCell", "text", "tableHeaderCell_", "tableRow_", "text", "tableRow",
                                 "tableCell", "text", "tableCell_", "tableRow_", "text", "tableRows_", "table_",
diff --git a/doxia-modules/doxia-module-rtf/src/main/java/org/apache/maven/doxia/module/rtf/RtfSink.java b/doxia-modules/doxia-module-rtf/src/main/java/org/apache/maven/doxia/module/rtf/RtfSink.java
index 8809fa0..24da5ba 100644
--- a/doxia-modules/doxia-module-rtf/src/main/java/org/apache/maven/doxia/module/rtf/RtfSink.java
+++ b/doxia-modules/doxia-module-rtf/src/main/java/org/apache/maven/doxia/module/rtf/RtfSink.java
@@ -20,7 +20,6 @@ package org.apache.maven.doxia.module.rtf;
  */
 
 import java.awt.Color;
-
 import java.io.BufferedOutputStream;
 import java.io.BufferedWriter;
 import java.io.IOException;
@@ -28,12 +27,14 @@ import java.io.OutputStream;
 import java.io.OutputStreamWriter;
 import java.io.PrintWriter;
 import java.io.Writer;
-
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Hashtable;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.Stack;
 import java.util.StringTokenizer;
 import java.util.TreeSet;
 import java.util.Vector;
@@ -41,6 +42,7 @@ import java.util.Vector;
 import org.apache.maven.doxia.sink.Sink;
 import org.apache.maven.doxia.sink.SinkEventAttributes;
 import org.apache.maven.doxia.sink.impl.AbstractTextSink;
+import org.apache.maven.doxia.sink.impl.SinkEventAttributeSet;
 
 /**
  * <a href="http://en.wikipedia.org/wiki/Rich_Text_Format">RTF</a> Sink implementation.
@@ -215,6 +217,9 @@ public class RtfSink
 
     protected OutputStream stream; // for raw image data
 
+    /** Keep track of the closing tags for inline events. */
+    protected Stack<List<Integer>> inlineStack = new Stack<List<Integer>>();
+
     /** Map of warn messages with a String as key to describe the error type and a Set as value.
      * Using to reduce warn messages. */
     private Map warnMessages;
@@ -1445,39 +1450,86 @@ public class RtfSink
     }
 
     /** {@inheritDoc} */
+    public void inline()
+    {
+        inline( null );
+    }
+
+    /** {@inheritDoc} */
+    public void inline( SinkEventAttributes attributes )
+    {
+        List<Integer> tags = new ArrayList<Integer>();
+
+        if ( attributes != null )
+        {
+
+            if ( attributes.containsAttribute( SinkEventAttributes.SEMANTICS, "italic" ) )
+            {
+                tags.add( 0, this.style );
+                beginStyle( STYLE_ITALIC );
+            }
+
+            if ( attributes.containsAttribute( SinkEventAttributes.SEMANTICS, "bold" ) )
+            {
+                tags.add( 0, this.style );
+                beginStyle( STYLE_BOLD );
+            }
+
+            if ( attributes.containsAttribute( SinkEventAttributes.SEMANTICS, "code" ) )
+            {
+                tags.add( 0, this.style );
+                beginStyle( STYLE_TYPEWRITER );
+            }
+
+        }
+
+        inlineStack.push( tags );
+    }
+
+    /** {@inheritDoc} */
+    public void inline_()
+    {
+        for ( Integer style: inlineStack.pop() )
+        {
+            endStyle();
+            this.style = style;
+        }
+    }
+
+    /** {@inheritDoc} */
     public void italic()
     {
-        beginStyle( STYLE_ITALIC );
+        inline( SinkEventAttributeSet.Semantics.ITALIC );
     }
 
     /** {@inheritDoc} */
     public void italic_()
     {
-        endStyle();
+        inline_();
     }
 
     /** {@inheritDoc} */
     public void bold()
     {
-        beginStyle( STYLE_BOLD );
+        inline( SinkEventAttributeSet.Semantics.BOLD );
     }
 
     /** {@inheritDoc} */
     public void bold_()
     {
-        endStyle();
+        inline_();
     }
 
     /** {@inheritDoc} */
     public void monospaced()
     {
-        beginStyle( STYLE_TYPEWRITER );
+        inline( SinkEventAttributeSet.Semantics.CODE );
     }
 
     /** {@inheritDoc} */
     public void monospaced_()
     {
-        endStyle();
+        inline_();
     }
 
     private void beginStyle( int style )
diff --git a/doxia-modules/doxia-module-twiki/src/main/java/org/apache/maven/doxia/module/twiki/TWikiSink.java b/doxia-modules/doxia-module-twiki/src/main/java/org/apache/maven/doxia/module/twiki/TWikiSink.java
index a125716..dffbcb6 100644
--- a/doxia-modules/doxia-module-twiki/src/main/java/org/apache/maven/doxia/module/twiki/TWikiSink.java
+++ b/doxia-modules/doxia-module-twiki/src/main/java/org/apache/maven/doxia/module/twiki/TWikiSink.java
@@ -22,6 +22,8 @@ package org.apache.maven.doxia.module.twiki;
 import java.io.PrintWriter;
 import java.io.StringWriter;
 import java.io.Writer;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Stack;
 
 import javax.swing.text.MutableAttributeSet;
@@ -57,9 +59,6 @@ public class TWikiSink
     /** An indication on if we're in bold mode. */
     private boolean boldFlag;
 
-    /** An indication on if we're in bold italic or monospaced mode. */
-    private boolean boldItalicOrMonodpacedFlag;
-
     /** An indication on if we're in head mode. */
     private boolean headFlag;
 
@@ -68,6 +67,12 @@ public class TWikiSink
     /**  listStyles. */
     private final Stack<String> listStyles;
 
+    /** Keep track of the nested bold flag. */
+    protected Stack<Boolean> boldStack = new Stack<Boolean>();
+
+    /** Keep track of the closing tags for inline events. */
+    protected Stack<List<String>> inlineStack = new Stack<List<String>>();
+
     /**
      * Constructor, initialize the Writer and the variables.
      *
@@ -155,19 +160,13 @@ public class TWikiSink
     /** {@inheritDoc} */
     public void bold()
     {
-        boldFlag = true;
-        write( BOLD_START_MARKUP );
+        inline( SinkEventAttributeSet.Semantics.BOLD );
     }
 
     /** {@inheritDoc} */
     public void bold_()
     {
-        boldFlag = false;
-        if ( !boldItalicOrMonodpacedFlag )
-        {
-            write( BOLD_END_MARKUP );
-        }
-        boldItalicOrMonodpacedFlag = false;
+        inline_();
     }
 
     /**
@@ -398,34 +397,87 @@ public class TWikiSink
     }
 
     /** {@inheritDoc} */
-    public void italic()
+    public void inline()
     {
-        if ( boldFlag )
+        inline( null );
+    }
+
+    /** {@inheritDoc} */
+    public void inline( SinkEventAttributes attributes )
+    {
+        List<String> tags = new ArrayList<String>();
+
+        boldStack.push( boldFlag );
+
+        if ( attributes != null )
         {
-            boldItalicOrMonodpacedFlag = true;
 
-            String tmp = writer.toString();
-            writer = new StringWriter();
-            writer.write( tmp.substring( 0, tmp.length() - 1 ) );
-            write( BOLD_ITALIC_START_MARKUP );
+            if ( attributes.containsAttribute( SinkEventAttributes.SEMANTICS, "bold" ) )
+            {
+                boldFlag = true;
+                write( BOLD_START_MARKUP );
+                tags.add( 0, BOLD_END_MARKUP );
+            }
+
+            if ( attributes.containsAttribute( SinkEventAttributes.SEMANTICS, "italic" ) )
+            {
+                if ( boldFlag )
+                {
+                    String tmp = writer.toString();
+                    writer = new StringWriter();
+                    writer.write( tmp.substring( 0, tmp.length() - 1 ) );
+                    write( BOLD_ITALIC_START_MARKUP );
+                    tags.add( 0, BOLD_ITALIC_END_MARKUP );
+                }
+                else
+                {
+                    write( ITALIC_START_MARKUP );
+                    tags.add( ITALIC_END_MARKUP );
+                }
+            }
+
+            if ( attributes.containsAttribute( SinkEventAttributes.SEMANTICS, "code" ) )
+            {
+                if ( boldFlag )
+                {
+                    String tmp = writer.toString();
+                    writer = new StringWriter();
+                    writer.write( tmp.substring( 0, tmp.length() - 1 ) );
+                    write( BOLD_MONOSPACED_START_MARKUP );
+                    tags.add( 0, BOLD_MONOSPACED_END_MARKUP );
+                }
+                else
+                {
+                    write( MONOSPACED_START_MARKUP );
+                    tags.add( 0, MONOSPACED_END_MARKUP );
+                }
+            }
+
         }
-        else
+
+        inlineStack.push( tags );
+    }
+
+    /** {@inheritDoc} */
+    public void inline_()
+    {
+        for ( String tag: inlineStack.pop() )
         {
-            write( ITALIC_START_MARKUP );
+            write( tag );
         }
+        this.boldFlag = boldStack.pop();
+    }
+
+    /** {@inheritDoc} */
+    public void italic()
+    {
+        inline( SinkEventAttributeSet.Semantics.ITALIC );
     }
 
     /** {@inheritDoc} */
     public void italic_()
     {
-        if ( boldFlag )
-        {
-            write( BOLD_ITALIC_END_MARKUP );
-        }
-        else
-        {
-            write( ITALIC_END_MARKUP );
-        }
+        inline_();
     }
 
     /**
@@ -506,32 +558,13 @@ public class TWikiSink
     /** {@inheritDoc} */
     public void monospaced()
     {
-        if ( boldFlag )
-        {
-            boldItalicOrMonodpacedFlag = true;
-
-            String tmp = writer.toString();
-            writer = new StringWriter();
-            writer.write( tmp.substring( 0, tmp.length() - 1 ) );
-            write( BOLD_MONOSPACED_START_MARKUP );
-        }
-        else
-        {
-            write( MONOSPACED_START_MARKUP );
-        }
+        inline( SinkEventAttributeSet.Semantics.CODE );
     }
 
     /** {@inheritDoc} */
     public void monospaced_()
     {
-        if ( boldFlag )
-        {
-            write( BOLD_MONOSPACED_END_MARKUP );
-        }
-        else
-        {
-            write( MONOSPACED_END_MARKUP );
-        }
+        inline_();
     }
 
     /**
@@ -1277,7 +1310,6 @@ public class TWikiSink
         this.levelList = 0;
         this.listStyles.clear();
         this.boldFlag = false;
-        this.boldItalicOrMonodpacedFlag = false;
     }
 
     /**
diff --git a/doxia-modules/doxia-module-twiki/src/test/java/org/apache/maven/doxia/module/twiki/TWikiSinkTest.java b/doxia-modules/doxia-module-twiki/src/test/java/org/apache/maven/doxia/module/twiki/TWikiSinkTest.java
index 378ea8b..815ce1a 100644
--- a/doxia-modules/doxia-module-twiki/src/test/java/org/apache/maven/doxia/module/twiki/TWikiSinkTest.java
+++ b/doxia-modules/doxia-module-twiki/src/test/java/org/apache/maven/doxia/module/twiki/TWikiSinkTest.java
@@ -49,11 +49,23 @@ public class TWikiSinkTest
     }
 
     /** {@inheritDoc} */
+    protected String getAddressBlock( String text )
+    {
+        return text;
+    }
+
+    /** {@inheritDoc} */
     protected String getAnchorBlock( String anchor )
     {
         return EOL + "#" + anchor + anchor;
     }
 
+    /** {@inheritDoc} */
+    protected String getArticleBlock()
+    {
+        return "";
+    }
+
     /** Not used.
      * {@inheritDoc} */
     protected String getAuthorBlock( String author )
@@ -61,6 +73,12 @@ public class TWikiSinkTest
         return null;
     }
 
+    /** {@inheritDoc} */
+    protected String getBlockquoteBlock( String text )
+    {
+        return text;
+    }
+
     /** Not used.
      * {@inheritDoc} */
     protected String getBodyBlock()
@@ -74,6 +92,18 @@ public class TWikiSinkTest
         return TWikiMarkup.BOLD_START_MARKUP + text + TWikiMarkup.BOLD_END_MARKUP;
     }
 
+    /** {@inheritDoc} */
+    protected String getContentBlock()
+    {
+        return "";
+    }
+
+    /** {@inheritDoc} */
+    protected String getDataBlock( String value, String text )
+    {
+        return text;
+    }
+
     /** Not used.
      * {@inheritDoc} */
     protected String getDateBlock( String date )
@@ -89,6 +119,12 @@ public class TWikiSinkTest
     }
 
     /** {@inheritDoc} */
+    protected String getDivisionBlock( String text )
+    {
+        return text;
+    }
+
+    /** {@inheritDoc} */
     protected String getFigureBlock( String source, String caption )
     {
         String figureBlock = "<img src=\"" + source + "\"";
@@ -100,6 +136,12 @@ public class TWikiSinkTest
         return figureBlock;
     }
 
+    /** {@inheritDoc} */
+    protected String getFooterBlock()
+    {
+        return "";
+    }
+
     /** Not used.
      * {@inheritDoc} */
     protected String getHeadBlock()
@@ -108,12 +150,42 @@ public class TWikiSinkTest
     }
 
     /** {@inheritDoc} */
+    protected String getHeaderBlock()
+    {
+        return "";
+    }
+
+    /** {@inheritDoc} */
     protected String getHorizontalRuleBlock()
     {
         return TWikiMarkup.HORIZONTAL_RULE_MARKUP + EOL;
     }
 
     /** {@inheritDoc} */
+    protected String getInlineBlock( String text )
+    {
+        return text;
+    }
+
+    /** {@inheritDoc} */
+    protected String getInlineItalicBlock( String text )
+    {
+        return TWikiMarkup.ITALIC_START_MARKUP + text + TWikiMarkup.ITALIC_END_MARKUP;
+    }
+
+    /** {@inheritDoc} */
+    protected String getInlineBoldBlock( String text )
+    {
+        return TWikiMarkup.BOLD_START_MARKUP + text + TWikiMarkup.BOLD_END_MARKUP;
+    }
+
+    /** {@inheritDoc} */
+    protected String getInlineCodeBlock( String text )
+    {
+        return TWikiMarkup.MONOSPACED_START_MARKUP + text + TWikiMarkup.MONOSPACED_END_MARKUP;
+    }
+
+    /** {@inheritDoc} */
     protected String getItalicBlock( String text )
     {
         return TWikiMarkup.ITALIC_START_MARKUP + text + TWikiMarkup.ITALIC_END_MARKUP;
@@ -126,6 +198,12 @@ public class TWikiSinkTest
     }
 
     /** {@inheritDoc} */
+    protected String getLineBreakOpportunityBlock()
+    {
+        return "";
+    }
+
+    /** {@inheritDoc} */
     protected String getLinkBlock( String link, String text )
     {
         return TWikiMarkup.LINK_START_MARKUP + link + TWikiMarkup.LINK_MIDDLE_MARKUP + text
@@ -145,6 +223,12 @@ public class TWikiSinkTest
     }
 
     /** {@inheritDoc} */
+    protected String getNavigationBlock()
+    {
+        return "";
+    }
+
+    /** {@inheritDoc} */
     protected String getNonBreakingSpaceBlock()
     {
         return "";
@@ -211,6 +295,12 @@ public class TWikiSinkTest
     }
 
     /** {@inheritDoc} */
+    protected String getSidebarBlock()
+    {
+        return "";
+    }
+
+    /** {@inheritDoc} */
     protected String getTableBlock( String cell, String caption )
     {
         return "| " + cell + " |" + EOL + "Table_caption";
@@ -222,6 +312,12 @@ public class TWikiSinkTest
         return HtmlTools.escapeHTML( text );
     }
 
+    /** {@inheritDoc} */
+    protected String getTimeBlock( String datetime, String text )
+    {
+        return text;
+    }
+
     /** Not used.
      * {@inheritDoc} */
     protected String getTitleBlock( String title )
diff --git a/doxia-modules/doxia-module-xdoc/src/main/java/org/apache/maven/doxia/module/xdoc/XdocParser.java b/doxia-modules/doxia-module-xdoc/src/main/java/org/apache/maven/doxia/module/xdoc/XdocParser.java
index 9740eff..32f062f 100644
--- a/doxia-modules/doxia-module-xdoc/src/main/java/org/apache/maven/doxia/module/xdoc/XdocParser.java
+++ b/doxia-modules/doxia-module-xdoc/src/main/java/org/apache/maven/doxia/module/xdoc/XdocParser.java
@@ -29,15 +29,14 @@ import java.util.Map;
 import javax.swing.text.html.HTML.Attribute;
 
 import org.apache.maven.doxia.macro.MacroExecutionException;
-import org.apache.maven.doxia.macro.manager.MacroNotFoundException;
 import org.apache.maven.doxia.macro.MacroRequest;
+import org.apache.maven.doxia.macro.manager.MacroNotFoundException;
 import org.apache.maven.doxia.parser.ParseException;
 import org.apache.maven.doxia.parser.Parser;
 import org.apache.maven.doxia.parser.XhtmlBaseParser;
 import org.apache.maven.doxia.sink.Sink;
 import org.apache.maven.doxia.sink.impl.SinkEventAttributeSet;
 import org.apache.maven.doxia.util.HtmlTools;
-
 import org.codehaus.plexus.component.annotations.Component;
 import org.codehaus.plexus.util.IOUtil;
 import org.codehaus.plexus.util.StringUtils;
diff --git a/doxia-modules/doxia-module-xdoc/src/test/java/org/apache/maven/doxia/module/xdoc/XdocSinkTest.java b/doxia-modules/doxia-module-xdoc/src/test/java/org/apache/maven/doxia/module/xdoc/XdocSinkTest.java
index fe85246..ae2fba5 100644
--- a/doxia-modules/doxia-module-xdoc/src/test/java/org/apache/maven/doxia/module/xdoc/XdocSinkTest.java
+++ b/doxia-modules/doxia-module-xdoc/src/test/java/org/apache/maven/doxia/module/xdoc/XdocSinkTest.java
@@ -88,6 +88,24 @@ public class XdocSinkTest
     }
... 2768 lines suppressed ...