diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/visualization/CssBasedBoxModelBuilder.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/visualization/CssBasedBoxModelBuilder.java
index a45df61..14c2d24 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/visualization/CssBasedBoxModelBuilder.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/visualization/CssBasedBoxModelBuilder.java
@@ -152,7 +152,9 @@
 			public VisualizeResult visit(final IElement element) {
 				final Styles styles = styleSheet.getStyles(element);
 				final Collection<VisualizeResult> childrenResults = traverseChildren(element);
-				if (isTable(styles)) {
+				if (isNestedTable(styles, element)) {
+					return new VisualizeResult(element, styles, childrenResults, visualizeAsNestedTable(element, styles, childrenResults));
+				} else if (isTable(styles)) {
 					final Table table = visualizeAsTable(element, styles, childrenResults);
 					return new VisualizeResult(element, styles, childrenResults, table);
 				} else if (isTableRowGroup(styles)) {
@@ -219,6 +221,10 @@
 		return CSS.TABLE.equals(styles.getDisplay());
 	}
 
+	private static boolean isNestedTable(final Styles styles, final IElement element) {
+		return "entrytbl".equals(element.getLocalName()) && isTable(styles);
+	}
+
 	private static boolean isTableRowGroup(final Styles styles) {
 		return CSS.TABLE_ROW_GROUP.equals(styles.getDisplay())
 				|| CSS.TABLE_HEADER_GROUP.equals(styles.getDisplay())
@@ -241,7 +247,6 @@
 	}
 
 	private static boolean isDisplayedAsBlock(final Styles styles) {
-		// currently we can only render blocks or inline, hence everything that is not inline must be a block
 		return !isDisplayedInline(styles);
 	}
 
@@ -315,28 +320,23 @@
 		return wrapUpStructuralElementContent(element, styles, childrenResults, row);
 	}
 
+	private IStructuralBox visualizeAsNestedTable(final IElement element, final Styles styles, final Collection<VisualizeResult> childrenResults) {
+		final IStructuralBox cellContent = table(visualizeStructuralElementContent(element, styles, childrenResults));
+		final TableCell cell = tableCell(frame(surroundWithPseudoElements(cellContent, element, styles), styles));
+
+		if ("entrytbl".equals(element.getLocalName())) {
+			configureCALSCell(element, cell);
+		}
+
+		return wrapWithNodeReference(element, childrenResults, cell);
+	}
+
 	private IStructuralBox visualizeAsTableCell(final IElement element, final Styles styles, final Collection<VisualizeResult> childrenResults) {
 		final IStructuralBox cellContent = visualizeStructuralElementContent(element, styles, childrenResults);
 		final TableCell cell = tableCell(frame(surroundWithPseudoElements(cellContent, element, styles), styles));
 
 		if ("entry".equals(element.getLocalName())) {
-			final IAttribute colName = element.getAttribute("colname");
-			final IAttribute spanName = element.getAttribute("spanname");
-			if (colName != null) {
-				cell.setColumnName(colName.getValue());
-			} else if (spanName != null) {
-				cell.setColumnName(spanName.getValue());
-			}
-
-			final IAttribute nameStart = element.getAttribute("namest");
-			final IAttribute nameEnd = element.getAttribute("nameend");
-			if (nameStart != null && nameEnd != null) {
-				cell.setStartColumnName(nameStart.getValue());
-				cell.setEndColumnName(nameEnd.getValue());
-			}
-
-			final IAttribute moreRows = element.getAttribute("morerows");
-			cell.setVerticalSpan(1 + toInt(moreRows));
+			configureCALSCell(element, cell);
 		} else if ("th".equals(element.getLocalName()) || "td".equals(element.getLocalName())) {
 			// TODO HTML table
 		}
@@ -344,6 +344,26 @@
 		return wrapWithNodeReference(element, childrenResults, cell);
 	}
 
+	private static void configureCALSCell(final IElement element, final TableCell cell) {
+		final IAttribute colName = element.getAttribute("colname");
+		final IAttribute spanName = element.getAttribute("spanname");
+		if (colName != null) {
+			cell.setColumnName(colName.getValue());
+		} else if (spanName != null) {
+			cell.setColumnName(spanName.getValue());
+		}
+
+		final IAttribute nameStart = element.getAttribute("namest");
+		final IAttribute nameEnd = element.getAttribute("nameend");
+		if (nameStart != null && nameEnd != null) {
+			cell.setStartColumnName(nameStart.getValue());
+			cell.setEndColumnName(nameEnd.getValue());
+		}
+
+		final IAttribute moreRows = element.getAttribute("morerows");
+		cell.setVerticalSpan(1 + toInt(moreRows));
+	}
+
 	private static int toInt(final IAttribute attribute) {
 		if (attribute == null) {
 			return 0;
