Index: trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/formatter/EbnfHtmlFormatterVisitor.java
===================================================================
--- trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/formatter/EbnfHtmlFormatterVisitor.java	(revision 37)
+++ trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/formatter/EbnfHtmlFormatterVisitor.java	(revision 38)
@@ -8,4 +8,6 @@
 
 import de.ugoe.cs.swe.bnftools.ebnf.EtsiBnf;
+import de.ugoe.cs.swe.bnftools.ebnf.Rule;
+import de.ugoe.cs.swe.bnftools.ebnf.RuleReference;
 import de.ugoe.cs.swe.bnftools.ebnf.SectionHeading;
 
@@ -125,4 +127,8 @@
 	// -----------------------------------------------------------------------------
 	
+	protected void visitAfter(EtsiBnf node) {
+		weaveComments();
+	}
+
 	protected void visitBefore(SectionHeading node) {
 		if (!lastWasSectionHeading && !buf.substring(buf.length()-2).equals("\n\n"))
@@ -138,7 +144,41 @@
 	protected void visitAfter(SectionHeading node) {
 	}
+	
+	protected void visitBefore(RuleReference node) {
+		wrap();
+		
+		metaText("<a href=\"#" + node.getRuleref().getName() + "\">");
+		text(node.getRuleref().getName());
+		metaText("</a>");
+	}
 
-	protected void visitAfter(EtsiBnf node) {
-		weaveComments();
+	protected void visitAfter(RuleReference node) {
+	}
+
+	protected void visitBefore(Rule node) {
+		if (lastWasSectionHeading)
+			newLine();
+		
+		lastWasSectionHeading=false;
+
+		newLineOffsetCounter = 0;
+
+		if (node.getRulenumber() > 0)
+			text(node.getRulenumber() + ". ");
+		
+		metaText("<a name=\"#" + node.getName() + "\">");
+		text(node.getName());
+		metaText("</a>");
+		text(" ::= ");
+		
+		rightHandSideRuleOffset = newLineOffsetCounter;
+		ruleSpacingStack.push(newLineOffsetCounter);
+	}
+	
+	protected void visitAfter(Rule node) {
+		metaText("<br/>");
+		text(";");
+		newLine();
+		ruleSpacingStack.pop();
 	}
 }
