Index: fop-core/src/main/java/org/apache/fop/layoutmgr/table/TableLayoutManager.java
===================================================================
--- fop-core/src/main/java/org/apache/fop/layoutmgr/table/TableLayoutManager.java	(revision 1855129)
+++ fop-core/src/main/java/org/apache/fop/layoutmgr/table/TableLayoutManager.java	(working copy)
@@ -19,8 +19,12 @@
 
 package org.apache.fop.layoutmgr.table;
 
+import java.awt.Point;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
@@ -30,6 +34,7 @@
 
 import org.apache.fop.area.Area;
 import org.apache.fop.area.Block;
+import org.apache.fop.area.Trait;
 import org.apache.fop.datatypes.LengthBase;
 import org.apache.fop.fo.Constants;
 import org.apache.fop.fo.FONode;
@@ -53,9 +58,13 @@
 import org.apache.fop.layoutmgr.PositionIterator;
 import org.apache.fop.layoutmgr.SpacedBorderedPaddedBlockLayoutManager;
 import org.apache.fop.layoutmgr.TraitSetter;
+import org.apache.fop.pdf.TableBorderRenderingMode;
+import org.apache.fop.render.pdf.PDFRendererOption;
+import org.apache.fop.traits.BorderProps;
 import org.apache.fop.traits.MinOptMax;
 import org.apache.fop.traits.SpaceVal;
 import org.apache.fop.util.BreakUtil;
+import org.apache.xmlgraphics.java2d.color.ColorUtil;
 
 /**
  * LayoutManager for a table FO.
@@ -379,6 +388,20 @@
         lc.setRefIPD(getContentAreaIPD());
         contentLM.setStartXOffset(startXOffset);
         contentLM.addAreas(parentIter, lc);
+
+        Map<String, Object> rendererOptions = fobj.getUserAgent().getRendererOptions();
+
+        String tableBorderRenderingModeKey = PDFRendererOption.TABLE_BORDER_RENDERING_MODE.getName();
+
+        if (rendererOptions.containsKey(tableBorderRenderingModeKey)) {
+
+            TableBorderRenderingMode tableBorderRenderingMode = (TableBorderRenderingMode) rendererOptions.get(tableBorderRenderingModeKey);
+
+            if (tableBorderRenderingMode == TableBorderRenderingMode.OVERPAINT) {
+                overPaintBorders();
+            }
+        }
+
         tableHeight += contentLM.getUsedBPD();
 
         curBlockArea.setBPD(tableHeight);
@@ -422,6 +445,299 @@
         notifyEndOfLayout();
     }
 
+    private void overPaintBorders() {
+
+        List<Block> newBlocks = new ArrayList<Block>();
+
+        List<Object> childAreas = new ArrayList<Object>(curBlockArea.getChildAreas());
+        Collections.sort(childAreas, new Comparator<Object>() {
+            public int compare(Object o1, Object o2) {
+                Block b1 = (Block)o1;
+                Block b2 = (Block)o2;
+                Integer paddingStart1 = (Integer)b1.getTrait(Trait.PADDING_START);
+                Integer paddingStart2 = (Integer)b2.getTrait(Trait.PADDING_START);
+                int x1 = b1.getXOffset() - (paddingStart1 != null ? paddingStart1 : 0);
+                int x2 = b2.getXOffset() - (paddingStart2 != null ? paddingStart2 : 0);
+                if (x1 > x2)
+                    return 1;
+                else if (x1 < x2)
+                    return -1;
+                else {
+                    if (b1.getYOffset() > b2.getYOffset())
+                        return 1;
+                    else if (b1.getYOffset() < b2.getYOffset())
+                        return -1;
+                    else
+                        return 0;
+                }
+            };
+        });
+
+        mergeBordersOfType(newBlocks, childAreas,
+                new Integer[] {Trait.BORDER_BEFORE, Trait.BORDER_AFTER});
+
+        Collections.sort(childAreas, new Comparator<Object>() {
+            public int compare(Object o1, Object o2) {
+                Block b1 = (Block)o1;
+                Block b2 = (Block)o2;
+                Integer paddingStart1 = (Integer)b1.getTrait(Trait.PADDING_START);
+                Integer paddingStart2 = (Integer)b2.getTrait(Trait.PADDING_START);
+                int x1 = b1.getXOffset() - (paddingStart1 != null ? paddingStart1 : 0);
+                int x2 = b2.getXOffset() - (paddingStart2 != null ? paddingStart2 : 0);
+                if (b1.getYOffset() > b2.getYOffset())
+                    return 1;
+                else if (b1.getYOffset() < b2.getYOffset())
+                    return -1;
+                else {
+                    if (x1 > x2)
+                        return 1;
+                    else if (x1 < x2)
+                        return -1;
+                    else {
+                        return 0;
+                    }
+                }
+            };
+        });
+
+        mergeBordersOfType(newBlocks,childAreas,
+                new Integer[] {Trait.BORDER_START, Trait.BORDER_END});
+
+        for (Block borderBlock : newBlocks) {
+            curBlockArea.addBlock(borderBlock);
+        }
+    }
+
+
+    private void mergeBordersOfType(List<Block> newBlocks, List<?> childAreas, Integer[] borderTraits) {
+
+        HashMap<Integer, HashMap<Point, Block>> mergeMap = new HashMap<Integer, HashMap<Point,Block>>();
+        for (Integer traitType : borderTraits) {
+            mergeMap.put(traitType, null);
+        }
+
+        for (Object child : childAreas) {
+            Block childBlock = (Block)child;
+
+            log.debug("Block - x=" + childBlock.getXOffset() + ",y=" + childBlock.getYOffset());
+
+            BorderProps startBps = (BorderProps)childBlock.getTrait(Trait.BORDER_START);
+            BorderProps endBps = (BorderProps)childBlock.getTrait(Trait.BORDER_END);
+            BorderProps beforeBps = (BorderProps)childBlock.getTrait(Trait.BORDER_BEFORE);
+            BorderProps afterBps = (BorderProps)childBlock.getTrait(Trait.BORDER_AFTER);
+
+            for (Integer traitType : borderTraits) {
+
+                Block currBlock = childBlock;
+
+                BorderProps borderProps = (BorderProps)currBlock.getTrait(traitType);
+                if (borderProps == null) {
+                    continue;
+                }
+
+
+                log.debug("Merge: " + traitType);
+
+                HashMap<Point, Block> currTraitMap = mergeMap.get(traitType);
+                Point endPoint = this.getEndMiddlePoint(currBlock, traitType, startBps, endBps,
+                        beforeBps, afterBps);
+
+                BorderProps bpsCurr = (BorderProps) currBlock.getTrait(traitType);
+
+                Block prevBlock = null;
+                if (currTraitMap == null)
+                {
+                    currTraitMap = new HashMap<Point, Block>();
+                    mergeMap.put(traitType, currTraitMap);
+                }
+                else
+                {
+                    Point startPoint = this.getStartMiddlePoint(currBlock, traitType, startBps, endBps, beforeBps, afterBps);
+
+                    log.debug("Start now");
+                    Iterator<Point> iter = currTraitMap.keySet().iterator();
+                    while (iter.hasNext()) {
+                        Point prevEndPoint = iter.next();
+                        log.debug("end: " + prevEndPoint);
+                        log.debug("start: " + startPoint);
+                        boolean isVertical = traitType == Trait.BORDER_START || traitType == Trait.BORDER_END;
+                        boolean isHorizontal = traitType == Trait.BORDER_BEFORE || traitType == Trait.BORDER_AFTER;
+
+                        if ((isHorizontal && prevEndPoint.y == startPoint.y && prevEndPoint.x >= startPoint.x)
+                                || (isVertical && prevEndPoint.x == startPoint.x && prevEndPoint.y >= startPoint.y)) {
+                            log.debug("try merge");
+
+                            Block prevBlockCurr = currTraitMap.get(prevEndPoint);
+                            iter.remove();
+                            BorderProps bpsPrev = (BorderProps) prevBlockCurr.getTrait(traitType);
+                            if (this.canMergeBorders(bpsPrev, bpsCurr)) {
+                                prevBlock = prevBlockCurr;
+                            }
+
+                            break;
+                        }
+                    }
+                }
+
+                Block borderBlock;
+                if (prevBlock != null && newBlocks.contains(prevBlock)) {
+                    borderBlock = prevBlock;
+                } else {
+                    borderBlock = new Block();
+                    borderBlock.addTrait(Trait.IS_REFERENCE_AREA, Boolean.TRUE);
+                    borderBlock.setPositioning(Block.ABSOLUTE);
+                    borderBlock.setBidiLevel(currBlock.getBidiLevel());
+                    newBlocks.add(borderBlock);
+
+                    BorderProps prevBeforeBps = (BorderProps)currBlock.getTrait(Trait.BORDER_BEFORE);
+                    int prevBefore = prevBeforeBps != null ? prevBeforeBps.width : 0;
+                    Integer prevPaddingStart = (Integer)currBlock.getTrait(Trait.PADDING_START);
+                    Integer prevPaddingEnd = (Integer)currBlock.getTrait(Trait.PADDING_END);
+                    Integer prevPaddingBefore = (Integer)currBlock.getTrait(Trait.PADDING_BEFORE);
+                    Integer prevPaddingAfter = (Integer)currBlock.getTrait(Trait.PADDING_AFTER);
+
+                    if (traitType == Trait.BORDER_START) {
+                        borderBlock.setYOffset(currBlock.getYOffset()
+                                + prevBefore);
+                        borderBlock.setXOffset(currBlock.getXOffset()
+                                - (prevPaddingStart != null ? prevPaddingStart : 0));
+                    } else if (traitType == Trait.BORDER_END) {
+                        borderBlock.setYOffset(currBlock.getYOffset()
+                                + prevBefore);
+                        borderBlock.setXOffset(currBlock.getXOffset()
+                                - (prevPaddingStart != null ? prevPaddingStart : 0));
+                        borderBlock.setIPD(currBlock.getIPD()
+                                + (prevPaddingStart != null ? prevPaddingStart : 0)
+                                + (prevPaddingEnd != null ? prevPaddingEnd : 0));
+                    } else if (traitType == Trait.BORDER_BEFORE) {
+                        borderBlock.setYOffset(currBlock.getYOffset());
+                        borderBlock.setXOffset(currBlock.getXOffset()
+                                - (prevPaddingStart != null ? prevPaddingStart : 0));
+                    } else if (traitType == Trait.BORDER_AFTER) {
+                        borderBlock.setYOffset(currBlock.getYOffset()
+                                + prevBefore);
+                        borderBlock.setXOffset(currBlock.getXOffset()
+                                - (prevPaddingStart != null ? prevPaddingStart : 0));
+                        borderBlock.setBPD(currBlock.getBPD()
+                                + (prevPaddingBefore != null ? prevPaddingBefore : 0)
+                                + (prevPaddingAfter != null ? prevPaddingAfter : 0));
+                    }
+                }
+
+                Integer paddingEnd = (Integer)currBlock.getTrait(Trait.PADDING_END);
+                Integer paddingAfter = (Integer)currBlock.getTrait(Trait.PADDING_AFTER);
+                if (traitType == Trait.BORDER_BEFORE || traitType == Trait.BORDER_AFTER) {
+                    int newEndPoint = currBlock.getXOffset()
+                            + currBlock.getIPD()
+                            + (paddingEnd != null ? paddingEnd : 0);
+                    borderBlock.setIPD(newEndPoint - borderBlock.getXOffset());
+                } else if (traitType == Trait.BORDER_START
+                        || traitType == Trait.BORDER_END) {
+                    int newEndPoint = currBlock.getYOffset()
+                            + currBlock.getBPD()
+                            + currBlock.getBorderAndPaddingWidthBefore()
+                            + (paddingAfter != null ? paddingAfter : 0);
+                    borderBlock.setBPD(newEndPoint - borderBlock.getYOffset());
+                }
+
+                BorderProps newBps = new BorderProps(bpsCurr.style, bpsCurr.width, 0,
+                        0, bpsCurr.color/*new Color(255, 0, 0)*/, bpsCurr.getMode());
+                borderBlock.addTrait(traitType, newBps);
+                //
+                currBlock = borderBlock;
+
+                log.debug("merge!");
+
+                currTraitMap.put(endPoint, currBlock);
+            }
+        }
+    }
+
+    private boolean canMergeBorders(BorderProps bpsPrev, BorderProps bpsCurr) {
+        return bpsPrev.style == bpsCurr.style
+                && ColorUtil.isSameColor(bpsPrev.color, bpsCurr.color)
+                && bpsPrev.width == bpsCurr.width
+                && bpsPrev.getMode() == bpsPrev.getMode()
+                && bpsPrev.getRadiusEnd() == 0
+                && bpsCurr.getRadiusStart() == 0;
+    }
+
+
+    private Point getEndMiddlePoint(Block block, int borderTrait, BorderProps startBps,
+            BorderProps endBps, BorderProps beforeBps, BorderProps afterBps) {
+        int x, y;
+        if (borderTrait == Trait.BORDER_START) {
+            Integer paddingStart = (Integer)block.getTrait(Trait.PADDING_START);
+            x = block.getXOffset()
+                    - (paddingStart != null ? paddingStart : 0)
+                    - BorderProps.getClippedWidth(startBps);
+            y = block.getYOffset() + block.getBPD()
+            + block.getBorderAndPaddingWidthBefore()
+            + block.getBorderAndPaddingWidthAfter();
+        } else if (borderTrait == Trait.BORDER_END) {
+            Integer paddingEnd = (Integer)block.getTrait(Trait.PADDING_END);
+            x = block.getXOffset() + block.getIPD()
+            + (paddingEnd != null ? paddingEnd : 0)
+            + BorderProps.getClippedWidth(endBps);
+            y = block.getYOffset() + block.getBPD()
+            + block.getBorderAndPaddingWidthBefore()
+            + block.getBorderAndPaddingWidthAfter();
+        } else if (borderTrait == Trait.BORDER_AFTER) {
+            Integer paddingEnd = (Integer)block.getTrait(Trait.PADDING_END);
+            x = block.getXOffset() + block.getIPD()
+            + (paddingEnd != null ? paddingEnd : 0)
+            + BorderProps.getClippedWidth(endBps);
+            Integer paddingAfter = (Integer)block.getTrait(Trait.PADDING_AFTER);
+            y = block.getYOffset() + block.getBPD()
+            + block.getBorderAndPaddingWidthBefore()
+            + (paddingAfter != null ? paddingAfter : 0)
+            + BorderProps.getClippedWidth(afterBps);
+        } else if (borderTrait == Trait.BORDER_BEFORE) {
+            Integer paddingEnd = (Integer)block.getTrait(Trait.PADDING_END);
+            x = block.getXOffset() + block.getIPD()
+            + (paddingEnd != null ? paddingEnd : 0)
+            + BorderProps.getClippedWidth(endBps);
+            y = block.getYOffset()
+                    + BorderProps.getClippedWidth(beforeBps);
+        } else {
+            throw new IllegalArgumentException("Invalid trait: " + borderTrait);
+        }
+        return new Point(x, y);
+    }
+
+    private Point getStartMiddlePoint(Block block, int borderTrait, BorderProps startBps, BorderProps endBps,
+            BorderProps beforeBps, BorderProps afterBps) {
+        int x, y;
+        if (borderTrait == Trait.BORDER_START) {
+            Integer paddingStart = (Integer)block.getTrait(Trait.PADDING_START);
+            x = block.getXOffset()
+                    - (paddingStart != null ? paddingStart : 0)
+                    - BorderProps.getClippedWidth(startBps);
+            y = block.getYOffset();
+        } else if (borderTrait == Trait.BORDER_BEFORE) {
+            x = block.getXOffset() - block.getBorderAndPaddingWidthStart();
+            y = block.getYOffset()
+                    + BorderProps.getClippedWidth(beforeBps);
+        } else if (borderTrait == Trait.BORDER_END) {
+            Integer paddingEnd = (Integer)block.getTrait(Trait.PADDING_END);
+            x = block.getXOffset() + block.getIPD()
+            + (paddingEnd != null ? paddingEnd : 0)
+            + BorderProps.getClippedWidth(endBps);
+            y = block.getYOffset();
+        } else if (borderTrait == Trait.BORDER_AFTER) {
+            x = block.getXOffset() - block.getBorderAndPaddingWidthStart();
+            Integer paddingAfter = (Integer)block.getTrait(Trait.PADDING_AFTER);
+            y = block.getYOffset() + block.getBorderAndPaddingWidthBefore()
+            + block.getBPD()
+            + (paddingAfter != null ? paddingAfter : 0)
+            + BorderProps.getClippedWidth(afterBps);
+        } else {
+            throw new IllegalArgumentException("Invalid trait: " + borderTrait);
+        }
+        return new Point(x, y);
+    }
+
+
     /**
      * Return an Area which can contain the passed childArea. The childArea
      * may not yet have any content, but it has essential traits set.
Index: fop-core/src/main/java/org/apache/fop/pdf/TableBorderRenderingMode.java
===================================================================
--- fop-core/src/main/java/org/apache/fop/pdf/TableBorderRenderingMode.java	(nonexistent)
+++ fop-core/src/main/java/org/apache/fop/pdf/TableBorderRenderingMode.java	(working copy)
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* $Id$ */
+
+package org.apache.fop.pdf;
+
+/**
+ * A table border rendering mode.
+ */
+public enum TableBorderRenderingMode {
+    STANDARD("standard"),
+    /** overpainting standard borders with merged variant */
+    OVERPAINT("overpaint");
+
+    private final String tableBorderRenderingMode;
+
+    private TableBorderRenderingMode(String tableBorderRenderingMode) {
+        this.tableBorderRenderingMode = tableBorderRenderingMode;
+    }
+
+    /**
+     * Given the table border rendering mode as a String, returns the corresponding enumerated type.
+     *
+     * @param tableBorderRenderingMode a table border rendering mode
+     * @return the corresponding TableBorderRenderingMode instance
+     * @throws IllegalArgumentException if the argument does not correspond to any
+     * existing table border rendering mode
+     */
+    public static TableBorderRenderingMode getValueOf(String tableBorderRenderingMode) {
+        for (TableBorderRenderingMode validTableBorderRenderingMode : TableBorderRenderingMode.values()) {
+            if (validTableBorderRenderingMode.toString().equals(tableBorderRenderingMode)) {
+                return validTableBorderRenderingMode;
+            }
+        }
+        throw new IllegalArgumentException("Invalid table border rendering mode given: " + tableBorderRenderingMode);
+    }
+
+    @Override
+    public String toString() {
+        return tableBorderRenderingMode;
+    }
+}
Index: fop-core/src/main/java/org/apache/fop/render/pdf/PDFRendererConfig.java
===================================================================
--- fop-core/src/main/java/org/apache/fop/render/pdf/PDFRendererConfig.java	(revision 1855129)
+++ fop-core/src/main/java/org/apache/fop/render/pdf/PDFRendererConfig.java	(working copy)
@@ -64,6 +64,7 @@
 import static org.apache.fop.render.pdf.PDFRendererOption.PDF_UA_MODE;
 import static org.apache.fop.render.pdf.PDFRendererOption.PDF_VT_MODE;
 import static org.apache.fop.render.pdf.PDFRendererOption.PDF_X_MODE;
+import static org.apache.fop.render.pdf.PDFRendererOption.TABLE_BORDER_RENDERING_MODE;
 import static org.apache.fop.render.pdf.PDFRendererOption.VERSION;
 
 /**
@@ -150,8 +151,9 @@
                 parseAndPut(DISABLE_SRGB_COLORSPACE, cfg);
                 parseAndPut(MERGE_FONTS, cfg);
                 parseAndPut(LINEARIZATION, cfg);
+                parseAndPut(TABLE_BORDER_RENDERING_MODE, cfg);
+                parseAndPut(VERSION, cfg);
 
-                parseAndPut(VERSION, cfg);
             } catch (ConfigurationException e) {
                 LogUtil.handleException(LOG, e, strict);
             }
Index: fop-core/src/main/java/org/apache/fop/render/pdf/PDFRendererOption.java
===================================================================
--- fop-core/src/main/java/org/apache/fop/render/pdf/PDFRendererOption.java	(revision 1855129)
+++ fop-core/src/main/java/org/apache/fop/render/pdf/PDFRendererOption.java	(working copy)
@@ -27,6 +27,7 @@
 import org.apache.fop.pdf.PDFUAMode;
 import org.apache.fop.pdf.PDFVTMode;
 import org.apache.fop.pdf.PDFXMode;
+import org.apache.fop.pdf.TableBorderRenderingMode;
 import org.apache.fop.pdf.Version;
 import org.apache.fop.render.RendererConfigOption;
 
@@ -103,6 +104,12 @@
                 throw new RuntimeException(e);
             }
         }
+    },
+    TABLE_BORDER_RENDERING_MODE("table-border-rendering-mode", TableBorderRenderingMode.STANDARD) {
+        @Override
+        TableBorderRenderingMode deserialize(String value) {
+            return TableBorderRenderingMode.getValueOf(value);
+        }
     };
 
     private final String name;
Index: fop-core/src/main/java/org/apache/fop/render/pdf/PDFRendererOptionsConfig.java
===================================================================
--- fop-core/src/main/java/org/apache/fop/render/pdf/PDFRendererOptionsConfig.java	(revision 1855129)
+++ fop-core/src/main/java/org/apache/fop/render/pdf/PDFRendererOptionsConfig.java	(working copy)
@@ -29,6 +29,7 @@
 import org.apache.fop.pdf.PDFUAMode;
 import org.apache.fop.pdf.PDFVTMode;
 import org.apache.fop.pdf.PDFXMode;
+import org.apache.fop.pdf.TableBorderRenderingMode;
 import org.apache.fop.pdf.Version;
 
 import static org.apache.fop.render.pdf.PDFRendererOption.DISABLE_SRGB_COLORSPACE;
@@ -40,8 +41,10 @@
 import static org.apache.fop.render.pdf.PDFRendererOption.PDF_UA_MODE;
 import static org.apache.fop.render.pdf.PDFRendererOption.PDF_VT_MODE;
 import static org.apache.fop.render.pdf.PDFRendererOption.PDF_X_MODE;
+import static org.apache.fop.render.pdf.PDFRendererOption.TABLE_BORDER_RENDERING_MODE;
 import static org.apache.fop.render.pdf.PDFRendererOption.VERSION;
 
+
 /**
  * The renderer options configuration data.
  */
@@ -142,4 +145,9 @@
     public Boolean getLinearizationEnabled() {
         return (Boolean)properties.get(LINEARIZATION);
     }
+
+    public TableBorderRenderingMode getTableBorderRenderingMode() {
+        return (TableBorderRenderingMode) properties.get(TABLE_BORDER_RENDERING_MODE);
+    }
+
 }
Index: fop-core/src/main/java/org/apache/fop/render/pdf/PDFRenderingUtil.java
===================================================================
--- fop-core/src/main/java/org/apache/fop/render/pdf/PDFRenderingUtil.java	(revision 1855129)
+++ fop-core/src/main/java/org/apache/fop/render/pdf/PDFRenderingUtil.java	(working copy)
@@ -150,6 +150,7 @@
 
     void mergeRendererOptionsConfig(PDFRendererOptionsConfig config) {
         rendererConfig = rendererConfig.merge(config);
+        userAgent.getRendererOptions().put(PDFRendererOption.TABLE_BORDER_RENDERING_MODE.getName(), rendererConfig.getTableBorderRenderingMode());
     }
 
     private void updateInfo() {
Index: fop-core/src/test/java/org/apache/fop/apps/PDFRendererConfBuilder.java
===================================================================
--- fop-core/src/test/java/org/apache/fop/apps/PDFRendererConfBuilder.java	(revision 1855129)
+++ fop-core/src/test/java/org/apache/fop/apps/PDFRendererConfBuilder.java	(working copy)
@@ -34,6 +34,7 @@
 import static org.apache.fop.render.pdf.PDFRendererOption.OUTPUT_PROFILE;
 import static org.apache.fop.render.pdf.PDFRendererOption.PDF_A_MODE;
 import static org.apache.fop.render.pdf.PDFRendererOption.PDF_X_MODE;
+import static org.apache.fop.render.pdf.PDFRendererOption.TABLE_BORDER_RENDERING_MODE;
 import static org.apache.fop.render.pdf.PDFRendererOption.VERSION;
 
 /**
@@ -93,6 +94,11 @@
         return this;
     }
 
+    public PDFRendererConfBuilder setTableBorderRenderingMode(String tableBorderRenderingMode) {
+        createTextElement(TABLE_BORDER_RENDERING_MODE, tableBorderRenderingMode);
+        return this;
+    }
+
     public final class EncryptionParamsBuilder {
         private final Element el;
 
Index: fop-core/src/test/java/org/apache/fop/intermediate/TestAssistant.java
===================================================================
--- fop-core/src/test/java/org/apache/fop/intermediate/TestAssistant.java	(revision 1855129)
+++ fop-core/src/test/java/org/apache/fop/intermediate/TestAssistant.java	(working copy)
@@ -20,6 +20,7 @@
 package org.apache.fop.intermediate;
 
 import java.io.File;
+import java.io.FileInputStream;
 import java.io.IOException;
 
 import javax.xml.parsers.DocumentBuilder;
@@ -44,9 +45,11 @@
 
 import org.apache.fop.apps.EnvironmentProfile;
 import org.apache.fop.apps.EnvironmentalProfileFactory;
+import org.apache.fop.apps.FopConfParser;
 import org.apache.fop.apps.FopFactory;
 import org.apache.fop.apps.FopFactoryBuilder;
 import org.apache.fop.apps.io.ResourceResolverFactory;
+import org.xml.sax.SAXException;
 
 /**
  * Helper class for running FOP tests.
@@ -119,7 +122,31 @@
         EnvironmentProfile envProfile = EnvironmentalProfileFactory.createRestrictedIO(
                 testDir.getParentFile().toURI(),
                 ResourceResolverFactory.createDefaultResourceResolver());
-        FopFactoryBuilder builder = new FopFactoryBuilder(envProfile);
+
+        FopFactoryBuilder builder;
+
+        String configPath = testDoc.getDocumentElement().getAttribute("config-path");
+
+        FopConfParser fopConfParser = null;
+
+        if (!configPath.isEmpty()) {
+            try {
+                fopConfParser = new FopConfParser(new FileInputStream(new File(configPath)), envProfile);
+
+            } catch (IOException ioe) {
+                throw new RuntimeException("The specified config file could not be found", ioe);
+
+            } catch (SAXException se) {
+                throw new RuntimeException("The specified config file could not be parsed", se);
+            }
+        }
+
+        if (fopConfParser != null) {
+            builder = fopConfParser.getFopFactoryBuilder();
+        } else {
+            builder = new FopFactoryBuilder(envProfile);
+        }
+
         builder.setStrictFOValidation(isStrictValidation(testDoc));
         builder.getFontManager().setBase14KerningEnabled(isBase14KerningEnabled(testDoc));
         return builder.build();
Index: fop-core/src/test/java/org/apache/fop/layoutengine/LayoutEngineTestCase.java
===================================================================
--- fop-core/src/test/java/org/apache/fop/layoutengine/LayoutEngineTestCase.java	(revision 1855129)
+++ fop-core/src/test/java/org/apache/fop/layoutengine/LayoutEngineTestCase.java	(working copy)
@@ -71,6 +71,8 @@
 import org.apache.fop.intermediate.TestAssistant;
 import org.apache.fop.layoutmgr.ElementListObserver;
 import org.apache.fop.render.intermediate.IFContext;
+import org.apache.fop.render.intermediate.IFDocumentHandler;
+import org.apache.fop.render.intermediate.IFException;
 import org.apache.fop.render.intermediate.IFRenderer;
 import org.apache.fop.render.intermediate.IFSerializer;
 import org.apache.fop.render.xml.XMLRenderer;
@@ -133,7 +135,7 @@
      * @throws ParserConfigurationException In case of a problem with the XML parser setup
      */
     @Test
-    public void runTest() throws TransformerException, SAXException, IOException,
+    public void runTest() throws TransformerException, SAXException, IFException, IOException,
             ParserConfigurationException {
 
         DOMResult domres = new DOMResult();
@@ -164,11 +166,23 @@
 
             XMLRenderer atrenderer = new XMLRenderer(ua);
             atrenderer.setContentHandler(athandler);
+
+            String targetMime = testDoc.getDocumentElement().getAttribute("target-mime");
+
+            SAXResult fores;
+
+            if (!targetMime.isEmpty()) {
+                //Merge the renderer config with the target one
+                atrenderer.mimicRenderer(ua.getRendererFactory().createRenderer(ua, targetMime));
+            }
+
             ua.setRendererOverride(atrenderer);
+
             fop = effFactory.newFop(ua);
+            fores = new SAXResult(fop.getDefaultHandler());
 
-            SAXResult fores = new SAXResult(fop.getDefaultHandler());
             transformer.transform(src, fores);
+
         } finally {
             ElementListObserver.removeObserver(elCollector);
         }
Index: fop-core/src/test/java/org/apache/fop/pdf/TableBorderRenderingModeTestCase.java
===================================================================
--- fop-core/src/test/java/org/apache/fop/pdf/TableBorderRenderingModeTestCase.java	(nonexistent)
+++ fop-core/src/test/java/org/apache/fop/pdf/TableBorderRenderingModeTestCase.java	(working copy)
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* $Id$ */
+
+package org.apache.fop.pdf;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * This is a test case for ({@link TableBorderRenderingMode}.
+ */
+public class TableBorderRenderingModeTestCase {
+
+    /**
+     * Test the <code>getValue()</code> method. This should return {@link TableBorderRenderingMode} given a
+     * {@link String}.
+     */
+    @Test
+    public void testGetValue() {
+        assertEquals(TableBorderRenderingMode.STANDARD, TableBorderRenderingMode.getValueOf("standard"));
+        assertEquals(TableBorderRenderingMode.OVERPAINT, TableBorderRenderingMode.getValueOf("overpaint"));
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testGetValueIllegalArgument() {
+        TableBorderRenderingMode.getValueOf("blah");
+    }
+
+}
Index: fop-core/src/test/java/org/apache/fop/render/pdf/PDFRendererOptionsConfigTestCase.java
===================================================================
--- fop-core/src/test/java/org/apache/fop/render/pdf/PDFRendererOptionsConfigTestCase.java	(revision 1855129)
+++ fop-core/src/test/java/org/apache/fop/render/pdf/PDFRendererOptionsConfigTestCase.java	(working copy)
@@ -34,6 +34,7 @@
 import org.apache.fop.pdf.PDFAMode;
 import org.apache.fop.pdf.PDFEncryptionParams;
 import org.apache.fop.pdf.PDFXMode;
+import org.apache.fop.pdf.TableBorderRenderingMode;
 import org.apache.fop.pdf.Version;
 
 import static org.apache.fop.render.pdf.PDFRendererOption.DISABLE_SRGB_COLORSPACE;
@@ -41,6 +42,7 @@
 import static org.apache.fop.render.pdf.PDFRendererOption.OUTPUT_PROFILE;
 import static org.apache.fop.render.pdf.PDFRendererOption.PDF_A_MODE;
 import static org.apache.fop.render.pdf.PDFRendererOption.PDF_X_MODE;
+import static org.apache.fop.render.pdf.PDFRendererOption.TABLE_BORDER_RENDERING_MODE;
 import static org.apache.fop.render.pdf.PDFRendererOption.VERSION;
 
 public class PDFRendererOptionsConfigTestCase {
@@ -88,6 +90,7 @@
         options.put(OUTPUT_PROFILE, new URI("xxx"));
         options.put(PDF_A_MODE, PDFAMode.PDFA_1A);
         options.put(PDF_X_MODE, PDFXMode.PDFX_3_2003);
+        options.put(TABLE_BORDER_RENDERING_MODE, TableBorderRenderingMode.OVERPAINT);
         options.put(VERSION, Version.V1_0);
         return Collections.unmodifiableMap(options);
     }
@@ -99,6 +102,7 @@
         assertEquals((URI) expectedOptions.get(OUTPUT_PROFILE), actual.getOutputProfileURI());
         assertEquals((PDFAMode) expectedOptions.get(PDF_A_MODE), actual.getPDFAMode());
         assertEquals((PDFXMode) expectedOptions.get(PDF_X_MODE), actual.getPDFXMode());
+        assertEquals((TableBorderRenderingMode) expectedOptions.get(TABLE_BORDER_RENDERING_MODE), actual.getTableBorderRenderingMode());
         assertEquals((Version) expectedOptions.get(VERSION), actual.getPDFVersion());
         assertEncryptionParamsEquals(expectedEncryptionParams, actual.getEncryptionParameters());
     }
Index: fop/test/config/table-border-rendering-mode-overpaint.xconf
===================================================================
--- fop/test/config/table-border-rendering-mode-overpaint.xconf	(nonexistent)
+++ fop/test/config/table-border-rendering-mode-overpaint.xconf	(working copy)
@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+<!-- $Id$ -->
+
+<fop version="1.0">
+  <renderers>
+    <!-- for layout test the PDF config is ignored -->
+    <renderer mime="application/pdf">
+      <table-border-rendering-mode>overpaint</table-border-rendering-mode>
+    </renderer>
+    <renderer mime="application/X-fop-intermediate-format">
+      <table-border-rendering-mode>overpaint</table-border-rendering-mode>
+    </renderer>
+  </renderers>
+</fop>
Index: fop/test/config/table-border-rendering-mode-standard.xconf
===================================================================
--- fop/test/config/table-border-rendering-mode-standard.xconf	(nonexistent)
+++ fop/test/config/table-border-rendering-mode-standard.xconf	(working copy)
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<!-- $Id$ -->
+
+<fop version="1.0">
+  <renderers>
+    <!-- for layout test the PDF config is ignored -->
+    <!--
+    <renderer mime="application/pdf">
+      <table-border-rendering-mode>standard</table-border-rendering-mode>
+    </renderer>
+    -->
+    <renderer mime="application/X-fop-intermediate-format">
+      <!-- standard rendering mode is a default value -->
+      <!--
+      <table-border-rendering-mode>standard</table-border-rendering-mode>
+      -->
+    </renderer>
+  </renderers>
+</fop>
Index: fop/test/layoutengine/standard-testcases/table-border-rendering-mode-overpaint.xml
===================================================================
--- fop/test/layoutengine/standard-testcases/table-border-rendering-mode-overpaint.xml	(nonexistent)
+++ fop/test/layoutengine/standard-testcases/table-border-rendering-mode-overpaint.xml	(working copy)
@@ -0,0 +1,243 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<!-- $Id$ -->
+<testcase target-mime="application/pdf" config-path="test/config/table-border-rendering-mode-overpaint.xconf">
+  <info>
+    <p>
+      This test checks if table borders are overpainted.
+    </p>
+  </info>
+  <fo>
+     <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
+        <fo:layout-master-set>
+           <fo:simple-page-master master-name="body">
+              <fo:region-body margin="15mm"/>
+           </fo:simple-page-master>
+        </fo:layout-master-set>
+        <fo:page-sequence master-reference="body">
+           <fo:flow flow-name="xsl-region-body">
+              <fo:table border-before-width.conditionality="retain" border-collapse="collapse"
+                 text-align="start" border="none" table-layout="fixed" width="100%">
+                 <fo:table-column column-number="1"/>
+                 <fo:table-column column-number="2"/>
+                 <fo:table-column column-number="3"/>
+                 <fo:table-column column-number="4"/>
+                 <fo:table-column column-number="5"/>
+                 <fo:table-column column-number="6"/>
+                 <fo:table-column column-number="7"/>
+                 <fo:table-column column-number="8"/>
+                 <fo:table-header start-indent="0pt" end-indent="0pt" border-top="0.5pt solid green"
+                    border-right="0.5pt solid green" border-left="0.5pt solid green">
+                    <fo:table-row keep-with-next.within-column="always"
+                       keep-with-previous.within-column="auto">
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-bottom="0.5pt solid white"
+                          border-right="0.5pt solid white" background-color="green" color="white"
+                          number-rows-spanned="3">
+                          <fo:block font-weight="bold">Color Name</fo:block>
+                       </fo:table-cell>
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-bottom="0.5pt solid white"
+                          background-color="green" color="white" number-columns-spanned="7">
+                          <fo:block font-weight="bold">Color Value</fo:block>
+                       </fo:table-cell>
+                    </fo:table-row>
+                    <fo:table-row keep-with-next.within-column="always"
+                       keep-with-previous.within-column="auto">
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-bottom="0.5pt solid white"
+                          border-right="0.5pt solid white" background-color="green" color="white"
+                          number-columns-spanned="3">
+                          <fo:block font-weight="bold">RGB</fo:block>
+                       </fo:table-cell>
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-bottom="0.5pt solid white"
+                          background-color="green" color="white" number-columns-spanned="4">
+                          <fo:block font-weight="bold">CMYK</fo:block>
+                       </fo:table-cell>
+                    </fo:table-row>
+                    <fo:table-row keep-with-next.within-column="always"
+                       keep-with-previous.within-column="auto">
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-bottom="0.5pt solid white"
+                          border-right="0.5pt solid white" background-color="green" color="white">
+                          <fo:block font-weight="bold">R</fo:block>
+                       </fo:table-cell>
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-bottom="0.5pt solid white"
+                          border-right="0.5pt solid white" background-color="green" color="white">
+                          <fo:block font-weight="bold">G</fo:block>
+                       </fo:table-cell>
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-bottom="0.5pt solid white"
+                          border-right="0.5pt solid white" background-color="green" color="white">
+                          <fo:block font-weight="bold">B</fo:block>
+                       </fo:table-cell>
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-bottom="0.5pt solid white"
+                          border-right="0.5pt solid white" background-color="green" color="white">
+                          <fo:block font-weight="bold">C</fo:block>
+                       </fo:table-cell>
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-bottom="0.5pt solid white"
+                          border-right="0.5pt solid white" background-color="green" color="white">
+                          <fo:block font-weight="bold">M</fo:block>
+                       </fo:table-cell>
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-bottom="0.5pt solid white"
+                          border-right="0.5pt solid white" background-color="green" color="white">
+                          <fo:block font-weight="bold">Y</fo:block>
+                       </fo:table-cell>
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-bottom="0.5pt solid white"
+                          background-color="green" color="white">
+                          <fo:block font-weight="bold">K</fo:block>
+                       </fo:table-cell>
+                    </fo:table-row>
+                 </fo:table-header>
+                 <fo:table-body start-indent="0pt" end-indent="0pt" border-bottom="0.5pt solid green"
+                    border-right="0.5pt solid green" border-left="0.5pt solid green">
+                    <fo:table-row keep-with-next.within-column="always"
+                       keep-with-previous.within-column="auto">
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-bottom="0.5pt solid green"
+                          border-right="0.5pt solid green">
+                          <fo:block>Red</fo:block>
+                       </fo:table-cell>
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-bottom="0.5pt solid green"
+                          border-right="0.5pt solid green">
+                          <fo:block>255</fo:block>
+                       </fo:table-cell>
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-bottom="0.5pt solid green"
+                          border-right="0.5pt solid green">
+                          <fo:block>0</fo:block>
+                       </fo:table-cell>
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-bottom="0.5pt solid green"
+                          border-right="0.5pt solid green">
+                          <fo:block>0</fo:block>
+                       </fo:table-cell>
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-bottom="0.5pt solid green"
+                          border-right="0.5pt solid green">
+                          <fo:block>0.00</fo:block>
+                       </fo:table-cell>
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-bottom="0.5pt solid green"
+                          border-right="0.5pt solid green">
+                          <fo:block>1.00</fo:block>
+                       </fo:table-cell>
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-bottom="0.5pt solid green"
+                          border-right="0.5pt solid green">
+                          <fo:block>1.00</fo:block>
+                       </fo:table-cell>
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-bottom="0.5pt solid green">
+                          <fo:block>0.00</fo:block>
+                       </fo:table-cell>
+                    </fo:table-row>
+                    <fo:table-row keep-with-next.within-column="auto"
+                       keep-with-previous.within-column="auto">
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-bottom="0.5pt solid green"
+                          border-right="0.5pt solid green">
+                          <fo:block>Green</fo:block>
+                       </fo:table-cell>
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-bottom="0.5pt solid green"
+                          border-right="0.5pt solid green">
+                          <fo:block>0</fo:block>
+                       </fo:table-cell>
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-bottom="0.5pt solid green"
+                          border-right="0.5pt solid green">
+                          <fo:block>255</fo:block>
+                       </fo:table-cell>
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-bottom="0.5pt solid green"
+                          border-right="0.5pt solid green">
+                          <fo:block>0</fo:block>
+                       </fo:table-cell>
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-bottom="0.5pt solid green"
+                          border-right="0.5pt solid green">
+                          <fo:block>1.00</fo:block>
+                       </fo:table-cell>
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-bottom="0.5pt solid green"
+                          border-right="0.5pt solid green">
+                          <fo:block>0.00</fo:block>
+                       </fo:table-cell>
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-bottom="0.5pt solid green"
+                          border-right="0.5pt solid green">
+                          <fo:block>1.00</fo:block>
+                       </fo:table-cell>
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-bottom="0.5pt solid green">
+                          <fo:block>0.00</fo:block>
+                       </fo:table-cell>
+                    </fo:table-row>
+                    <fo:table-row keep-with-next.within-column="auto"
+                       keep-with-previous.within-column="always">
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-right="0.5pt solid green">
+                          <fo:block>Blue</fo:block>
+                       </fo:table-cell>
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-right="0.5pt solid green">
+                          <fo:block>0</fo:block>
+                       </fo:table-cell>
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-right="0.5pt solid green">
+                          <fo:block>0</fo:block>
+                       </fo:table-cell>
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-right="0.5pt solid green">
+                          <fo:block>255</fo:block>
+                       </fo:table-cell>
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-right="0.5pt solid green">
+                          <fo:block>1.00</fo:block>
+                       </fo:table-cell>
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-right="0.5pt solid green">
+                          <fo:block>1.00</fo:block>
+                       </fo:table-cell>
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-right="0.5pt solid green">
+                          <fo:block>0.00</fo:block>
+                       </fo:table-cell>
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm">
+                          <fo:block>0.00</fo:block>
+                       </fo:table-cell>
+                    </fo:table-row>
+                 </fo:table-body>
+              </fo:table>
+           </fo:flow>
+        </fo:page-sequence>
+     </fo:root>
+  </fo>
+  <checks>
+    <eval expected="130" xpath="count(//block)"/>
+  </checks>
+</testcase>
Index: fop/test/layoutengine/standard-testcases/table-border-rendering-mode-standard.xml
===================================================================
--- fop/test/layoutengine/standard-testcases/table-border-rendering-mode-standard.xml	(nonexistent)
+++ fop/test/layoutengine/standard-testcases/table-border-rendering-mode-standard.xml	(working copy)
@@ -0,0 +1,243 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<!-- $Id$ -->
+<testcase target-mime="application/pdf" config-path="test/config/table-border-rendering-mode-standard.xconf">
+  <info>
+    <p>
+      This test checks if table borders are rendered without overpainting.
+    </p>
+  </info>
+  <fo>
+     <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
+        <fo:layout-master-set>
+           <fo:simple-page-master master-name="body">
+              <fo:region-body margin="15mm"/>
+           </fo:simple-page-master>
+        </fo:layout-master-set>
+        <fo:page-sequence master-reference="body">
+           <fo:flow flow-name="xsl-region-body">
+              <fo:table border-before-width.conditionality="retain" border-collapse="collapse"
+                 text-align="start" border="none" table-layout="fixed" width="100%">
+                 <fo:table-column column-number="1"/>
+                 <fo:table-column column-number="2"/>
+                 <fo:table-column column-number="3"/>
+                 <fo:table-column column-number="4"/>
+                 <fo:table-column column-number="5"/>
+                 <fo:table-column column-number="6"/>
+                 <fo:table-column column-number="7"/>
+                 <fo:table-column column-number="8"/>
+                 <fo:table-header start-indent="0pt" end-indent="0pt" border-top="0.5pt solid green"
+                    border-right="0.5pt solid green" border-left="0.5pt solid green">
+                    <fo:table-row keep-with-next.within-column="always"
+                       keep-with-previous.within-column="auto">
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-bottom="0.5pt solid white"
+                          border-right="0.5pt solid white" background-color="green" color="white"
+                          number-rows-spanned="3">
+                          <fo:block font-weight="bold">Color Name</fo:block>
+                       </fo:table-cell>
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-bottom="0.5pt solid white"
+                          background-color="green" color="white" number-columns-spanned="7">
+                          <fo:block font-weight="bold">Color Value</fo:block>
+                       </fo:table-cell>
+                    </fo:table-row>
+                    <fo:table-row keep-with-next.within-column="always"
+                       keep-with-previous.within-column="auto">
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-bottom="0.5pt solid white"
+                          border-right="0.5pt solid white" background-color="green" color="white"
+                          number-columns-spanned="3">
+                          <fo:block font-weight="bold">RGB</fo:block>
+                       </fo:table-cell>
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-bottom="0.5pt solid white"
+                          background-color="green" color="white" number-columns-spanned="4">
+                          <fo:block font-weight="bold">CMYK</fo:block>
+                       </fo:table-cell>
+                    </fo:table-row>
+                    <fo:table-row keep-with-next.within-column="always"
+                       keep-with-previous.within-column="auto">
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-bottom="0.5pt solid white"
+                          border-right="0.5pt solid white" background-color="green" color="white">
+                          <fo:block font-weight="bold">R</fo:block>
+                       </fo:table-cell>
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-bottom="0.5pt solid white"
+                          border-right="0.5pt solid white" background-color="green" color="white">
+                          <fo:block font-weight="bold">G</fo:block>
+                       </fo:table-cell>
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-bottom="0.5pt solid white"
+                          border-right="0.5pt solid white" background-color="green" color="white">
+                          <fo:block font-weight="bold">B</fo:block>
+                       </fo:table-cell>
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-bottom="0.5pt solid white"
+                          border-right="0.5pt solid white" background-color="green" color="white">
+                          <fo:block font-weight="bold">C</fo:block>
+                       </fo:table-cell>
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-bottom="0.5pt solid white"
+                          border-right="0.5pt solid white" background-color="green" color="white">
+                          <fo:block font-weight="bold">M</fo:block>
+                       </fo:table-cell>
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-bottom="0.5pt solid white"
+                          border-right="0.5pt solid white" background-color="green" color="white">
+                          <fo:block font-weight="bold">Y</fo:block>
+                       </fo:table-cell>
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-bottom="0.5pt solid white"
+                          background-color="green" color="white">
+                          <fo:block font-weight="bold">K</fo:block>
+                       </fo:table-cell>
+                    </fo:table-row>
+                 </fo:table-header>
+                 <fo:table-body start-indent="0pt" end-indent="0pt" border-bottom="0.5pt solid green"
+                    border-right="0.5pt solid green" border-left="0.5pt solid green">
+                    <fo:table-row keep-with-next.within-column="always"
+                       keep-with-previous.within-column="auto">
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-bottom="0.5pt solid green"
+                          border-right="0.5pt solid green">
+                          <fo:block>Red</fo:block>
+                       </fo:table-cell>
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-bottom="0.5pt solid green"
+                          border-right="0.5pt solid green">
+                          <fo:block>255</fo:block>
+                       </fo:table-cell>
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-bottom="0.5pt solid green"
+                          border-right="0.5pt solid green">
+                          <fo:block>0</fo:block>
+                       </fo:table-cell>
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-bottom="0.5pt solid green"
+                          border-right="0.5pt solid green">
+                          <fo:block>0</fo:block>
+                       </fo:table-cell>
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-bottom="0.5pt solid green"
+                          border-right="0.5pt solid green">
+                          <fo:block>0.00</fo:block>
+                       </fo:table-cell>
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-bottom="0.5pt solid green"
+                          border-right="0.5pt solid green">
+                          <fo:block>1.00</fo:block>
+                       </fo:table-cell>
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-bottom="0.5pt solid green"
+                          border-right="0.5pt solid green">
+                          <fo:block>1.00</fo:block>
+                       </fo:table-cell>
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-bottom="0.5pt solid green">
+                          <fo:block>0.00</fo:block>
+                       </fo:table-cell>
+                    </fo:table-row>
+                    <fo:table-row keep-with-next.within-column="auto"
+                       keep-with-previous.within-column="auto">
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-bottom="0.5pt solid green"
+                          border-right="0.5pt solid green">
+                          <fo:block>Green</fo:block>
+                       </fo:table-cell>
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-bottom="0.5pt solid green"
+                          border-right="0.5pt solid green">
+                          <fo:block>0</fo:block>
+                       </fo:table-cell>
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-bottom="0.5pt solid green"
+                          border-right="0.5pt solid green">
+                          <fo:block>255</fo:block>
+                       </fo:table-cell>
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-bottom="0.5pt solid green"
+                          border-right="0.5pt solid green">
+                          <fo:block>0</fo:block>
+                       </fo:table-cell>
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-bottom="0.5pt solid green"
+                          border-right="0.5pt solid green">
+                          <fo:block>1.00</fo:block>
+                       </fo:table-cell>
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-bottom="0.5pt solid green"
+                          border-right="0.5pt solid green">
+                          <fo:block>0.00</fo:block>
+                       </fo:table-cell>
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-bottom="0.5pt solid green"
+                          border-right="0.5pt solid green">
+                          <fo:block>1.00</fo:block>
+                       </fo:table-cell>
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-bottom="0.5pt solid green">
+                          <fo:block>0.00</fo:block>
+                       </fo:table-cell>
+                    </fo:table-row>
+                    <fo:table-row keep-with-next.within-column="auto"
+                       keep-with-previous.within-column="always">
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-right="0.5pt solid green">
+                          <fo:block>Blue</fo:block>
+                       </fo:table-cell>
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-right="0.5pt solid green">
+                          <fo:block>0</fo:block>
+                       </fo:table-cell>
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-right="0.5pt solid green">
+                          <fo:block>0</fo:block>
+                       </fo:table-cell>
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-right="0.5pt solid green">
+                          <fo:block>255</fo:block>
+                       </fo:table-cell>
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-right="0.5pt solid green">
+                          <fo:block>1.00</fo:block>
+                       </fo:table-cell>
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-right="0.5pt solid green">
+                          <fo:block>1.00</fo:block>
+                       </fo:table-cell>
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm" border-right="0.5pt solid green">
+                          <fo:block>0.00</fo:block>
+                       </fo:table-cell>
+                       <fo:table-cell padding-top="1.3mm" padding-bottom="1.3mm" padding-left="2.5mm"
+                          padding-right="2.5mm">
+                          <fo:block>0.00</fo:block>
+                       </fo:table-cell>
+                    </fo:table-row>
+                 </fo:table-body>
+              </fo:table>
+           </fo:flow>
+        </fo:page-sequence>
+     </fo:root>
+  </fo>
+  <checks>
+    <eval expected="88" xpath="count(//block)"/>
+  </checks>
+</testcase>
