Index: src/java/org/apache/fop/layoutmgr/table/ActiveCell.java
===================================================================
--- src/java/org/apache/fop/layoutmgr/table/ActiveCell.java	(revision 655602)
+++ src/java/org/apache/fop/layoutmgr/table/ActiveCell.java	(working copy)
@@ -21,6 +21,7 @@
 
 import java.util.List;
 import java.util.ListIterator;
+import java.util.LinkedList;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -33,6 +34,7 @@
 import org.apache.fop.layoutmgr.BlockLevelLayoutManager;
 import org.apache.fop.layoutmgr.ElementListUtils;
 import org.apache.fop.layoutmgr.KnuthBox;
+import org.apache.fop.layoutmgr.KnuthBlockBox;
 import org.apache.fop.layoutmgr.KnuthElement;
 import org.apache.fop.layoutmgr.KnuthPenalty;
 import org.apache.fop.layoutmgr.MinOptMaxUtil;
@@ -101,6 +103,8 @@
         private int penaltyLength;
         /** Value of the penalty ending this step, 0 if the step does not end on a penalty. */
         private int penaltyValue;
+        /** list of footnotes for this step */
+        private List footnoteList;
         /**
          * One of {@link Constants#EN_AUTO}, {@link Constants#EN_COLUMN},
          * {@link Constants#EN_PAGE}, {@link Constants#EN_EVEN_PAGE},
@@ -130,6 +134,7 @@
             this.totalLength   = other.totalLength;
             this.penaltyLength = other.penaltyLength;
             this.penaltyValue  = other.penaltyValue;
+            this.footnoteList  = other.footnoteList;
             this.condBeforeContentLength = other.condBeforeContentLength;
             this.breakClass    = other.breakClass;
         }
@@ -293,6 +298,7 @@
         afterNextStep.penaltyValue = 0;
         afterNextStep.condBeforeContentLength = 0;
         afterNextStep.breakClass = Constants.EN_AUTO;
+        afterNextStep.footnoteList = null;
         boolean breakFound = false;
         boolean prevIsBox = false;
         boolean boxFound = false;
@@ -322,6 +328,14 @@
                 }
                 prevIsBox = false;
             } else {
+                if (el instanceof KnuthBlockBox
+                        && ((KnuthBlockBox)el).hasAnchors()) {
+                    if (afterNextStep.footnoteList == null) {
+                        afterNextStep.footnoteList = new LinkedList();
+                    }
+                    afterNextStep.footnoteList.addAll(
+                            ((KnuthBlockBox)el).getFootnoteBodyLMs());
+                }
                 prevIsBox = true;
                 boxFound = true;
                 afterNextStep.contentLength += el.getW();
@@ -555,6 +569,27 @@
         }
     }
 
+    /**
+     * Return the list of FootnoteBodyLMs for the 
+     * next step.
+     * 
+     * @return  the list of footnotes
+     */
+    List getFootnoteList() {
+        return this.nextStep.footnoteList;
+    }
+
+    /**
+     * Return <code>true</code> if the next step has 
+     * associated footnotes.
+     * 
+     * @return  true if there are associated footnotes
+     */
+    boolean hasFootnotes() {
+        return this.nextStep.footnoteList != null 
+                && !this.nextStep.footnoteList.isEmpty();
+    }
+
     /** {@inheritDoc} */
     public String toString() {
         return "Cell " + (pgu.getRowIndex() + 1) + "." + (pgu.getColIndex() + 1);
Index: src/java/org/apache/fop/layoutmgr/table/TableStepper.java
===================================================================
--- src/java/org/apache/fop/layoutmgr/table/TableStepper.java	(revision 655602)
+++ src/java/org/apache/fop/layoutmgr/table/TableStepper.java	(working copy)
@@ -33,6 +33,7 @@
 import org.apache.fop.layoutmgr.BlockLevelLayoutManager;
 import org.apache.fop.layoutmgr.BreakElement;
 import org.apache.fop.layoutmgr.KeepUtil;
+import org.apache.fop.layoutmgr.KnuthBlockBox;
 import org.apache.fop.layoutmgr.KnuthBox;
 import org.apache.fop.layoutmgr.KnuthElement;
 import org.apache.fop.layoutmgr.KnuthGlue;
@@ -199,12 +200,17 @@
                 }
             }
 
+            LinkedList footnoteList = new LinkedList();
             //Put all involved grid units into a list
             List cellParts = new java.util.ArrayList(columnCount);
             for (Iterator iter = activeCells.iterator(); iter.hasNext();) {
                 ActiveCell activeCell = (ActiveCell) iter.next();
                 CellPart part = activeCell.createCellPart();
                 cellParts.add(part);
+                if (activeCell.hasFootnotes()) {
+                    footnoteList.addAll(
+                            activeCell.getFootnoteList());
+                }
             }
 
             //Create elements for step
@@ -217,8 +223,13 @@
                 tcpos.setFlag(TableContentPosition.FIRST_IN_ROWGROUP, true);
             }
             lastTCPos = tcpos;
-            returnList.add(new KnuthBox(boxLen, tcpos, false));
 
+            if (footnoteList.isEmpty()) {
+                returnList.add(new KnuthBox(boxLen, tcpos, false));
+            } else {
+                returnList.add(new KnuthBlockBox(boxLen, footnoteList, tcpos, false));
+            }
+
             int effPenaltyLen = Math.max(0, penaltyOrGlueLen);
             TableHFPenaltyPosition penaltyPos = new TableHFPenaltyPosition(getTableLM());
             if (bodyType == TableRowIterator.BODY) {
