Index: src/java/org/apache/fop/layoutmgr/FootenoteUtil.java
===================================================================
--- src/java/org/apache/fop/layoutmgr/FootenoteUtil.java	(revision 0)
+++ src/java/org/apache/fop/layoutmgr/FootenoteUtil.java	(working copy)
@@ -0,0 +1,35 @@
+package org.apache.fop.layoutmgr;
+
+import java.util.List;
+import java.util.ListIterator;
+
+import org.apache.fop.layoutmgr.inline.KnuthInlineBox;
+
+public final class FootenoteUtil {
+
+    private FootenoteUtil() {
+    }
+
+    public static void collectFoonotes(List elemList, List<LayoutManager> footnoteList) {
+        collectFoonotes(elemList.listIterator(), elemList.size() - 1, footnoteList);
+    }
+
+    public static void collectFoonotes(List elemList,
+            int startIndex, int endIndex, List<LayoutManager> footnoteList) {
+        collectFoonotes(elemList.listIterator(startIndex), endIndex, footnoteList);
+    }
+
+    public static void collectFoonotes(ListIterator<?> iter, int endIndex,
+            List<LayoutManager> footnoteList) {
+        Object el;
+        while (iter.nextIndex() <= endIndex) {
+            el = iter.next();
+            if (el instanceof KnuthInlineBox
+                    && ((KnuthInlineBox) el).isAnchor()) {
+                footnoteList.add(((KnuthInlineBox) el).getFootnoteBodyLM());
+            } else if (el instanceof KnuthBlockBox && ((KnuthBlockBox) el).hasAnchors()) {
+                footnoteList.addAll(((KnuthBlockBox) el).getFootnoteBodyLMs());
+            }
+        }
+    }
+}
Index: src/java/org/apache/fop/layoutmgr/inline/LineLayoutManager.java
===================================================================
--- src/java/org/apache/fop/layoutmgr/inline/LineLayoutManager.java	(revision 1586765)
+++ src/java/org/apache/fop/layoutmgr/inline/LineLayoutManager.java	(working copy)
@@ -50,6 +50,7 @@
 import org.apache.fop.layoutmgr.BreakElement;
 import org.apache.fop.layoutmgr.BreakingAlgorithm;
 import org.apache.fop.layoutmgr.ElementListObserver;
+import org.apache.fop.layoutmgr.FootenoteUtil;
 import org.apache.fop.layoutmgr.InlineKnuthSequence;
 import org.apache.fop.layoutmgr.Keep;
 import org.apache.fop.layoutmgr.KnuthBlockBox;
@@ -980,16 +981,7 @@
                     // create a list of the FootnoteBodyLM handling footnotes
                     // whose citations are in this line
                     List<LayoutManager> footnoteList = new LinkedList<LayoutManager>();
-                    ListIterator<KnuthElement> elementIterator = seq.listIterator(startIndex);
-                    while (elementIterator.nextIndex() <= endIndex) {
-                        KnuthElement element = elementIterator.next();
-                        if (element instanceof KnuthInlineBox
-                                && ((KnuthInlineBox) element).isAnchor()) {
-                            footnoteList.add(((KnuthInlineBox) element).getFootnoteBodyLM());
-                        } else if (element instanceof KnuthBlockBox) {
-                            footnoteList.addAll(((KnuthBlockBox) element).getFootnoteBodyLMs());
-                        }
-                    }
+                    FootenoteUtil.collectFoonotes(seq, startIndex, endIndex, footnoteList);
                     startIndex = endIndex + 1;
                     LineBreakPosition lbp = (LineBreakPosition) llPoss.getChosenPosition(i);
                     if (baselineOffset < 0) {
Index: src/java/org/apache/fop/layoutmgr/list/ListItemLayoutManager.java
===================================================================
--- src/java/org/apache/fop/layoutmgr/list/ListItemLayoutManager.java	(revision 1586765)
+++ src/java/org/apache/fop/layoutmgr/list/ListItemLayoutManager.java	(working copy)
@@ -39,7 +39,7 @@
 import org.apache.fop.layoutmgr.BreakOpportunityHelper;
 import org.apache.fop.layoutmgr.ElementListObserver;
 import org.apache.fop.layoutmgr.ElementListUtils;
-import org.apache.fop.layoutmgr.FootnoteBodyLayoutManager;
+import org.apache.fop.layoutmgr.FootenoteUtil;
 import org.apache.fop.layoutmgr.Keep;
 import org.apache.fop.layoutmgr.KnuthBlockBox;
 import org.apache.fop.layoutmgr.KnuthBox;
@@ -322,18 +322,9 @@
             // collect footnote information
             // TODO this should really not be done like this. ListItemLM should remain as
             // footnote-agnostic as possible
-            LinkedList<FootnoteBodyLayoutManager> footnoteList = null;
-            ListElement el;
+            LinkedList<LayoutManager> footnoteList = new LinkedList<LayoutManager>();
             for (int i = 0; i < elementLists.length; i++) {
-                for (int j = start[i]; j <= end[i]; j++) {
-                    el = (ListElement) elementLists[i].get(j);
-                    if (el instanceof KnuthBlockBox && ((KnuthBlockBox) el).hasAnchors()) {
-                        if (footnoteList == null) {
-                            footnoteList = new LinkedList<FootnoteBodyLayoutManager>();
-                        }
-                        footnoteList.addAll(((KnuthBlockBox) el).getFootnoteBodyLMs());
-                    }
-                }
+                FootenoteUtil.collectFoonotes(elementLists[i], start[i], end[i], footnoteList);
             }
 
             // add the new elements
Index: src/java/org/apache/fop/layoutmgr/table/TableContentLayoutManager.java
===================================================================
--- src/java/org/apache/fop/layoutmgr/table/TableContentLayoutManager.java	(revision 1586765)
+++ src/java/org/apache/fop/layoutmgr/table/TableContentLayoutManager.java	(working copy)
@@ -39,12 +39,15 @@
 import org.apache.fop.fo.flow.table.TablePart;
 import org.apache.fop.layoutmgr.BreakElement;
 import org.apache.fop.layoutmgr.ElementListUtils;
+import org.apache.fop.layoutmgr.FootenoteUtil;
 import org.apache.fop.layoutmgr.Keep;
+import org.apache.fop.layoutmgr.KnuthBlockBox;
 import org.apache.fop.layoutmgr.KnuthBox;
 import org.apache.fop.layoutmgr.KnuthElement;
 import org.apache.fop.layoutmgr.KnuthGlue;
 import org.apache.fop.layoutmgr.KnuthPossPosIter;
 import org.apache.fop.layoutmgr.LayoutContext;
+import org.apache.fop.layoutmgr.LayoutManager;
 import org.apache.fop.layoutmgr.ListElement;
 import org.apache.fop.layoutmgr.Position;
 import org.apache.fop.layoutmgr.PositionIterator;
@@ -147,6 +150,9 @@
         KnuthBox headerAsFirst = null;
         KnuthBox headerAsSecondToLast = null;
         KnuthBox footerAsLast = null;
+
+        LinkedList returnList = new LinkedList();
+
         if (headerIter != null && headerList == null) {
             this.headerList = getKnuthElementsForRowIterator(
                     headerIter, context, alignment, TableRowIterator.HEADER);
@@ -158,12 +164,24 @@
             }
             TableHeaderFooterPosition pos = new TableHeaderFooterPosition(
                     getTableLM(), true, this.headerList);
-            KnuthBox box = new KnuthBox(headerNetHeight, pos, false);
+            List<LayoutManager> footnoteList = new LinkedList<LayoutManager>();
+            FootenoteUtil.collectFoonotes(headerList, footnoteList);
+
+            KnuthBox box;
+            if (footnoteList.isEmpty()
+                    || !getTableLM().getTable().omitHeaderAtBreak())
+                box = new KnuthBox(headerNetHeight, pos, false);
+            else
+                box = new KnuthBlockBox(headerNetHeight, footnoteList, pos, false);
             if (getTableLM().getTable().omitHeaderAtBreak()) {
                 //We can simply add the table header at the start
                 //of the whole list
                 headerAsFirst = box;
             } else {
+                if (footnoteList.size() > 0)
+                    returnList.add(new KnuthBlockBox(headerNetHeight, footnoteList,
+                         new TableHeaderFooterPosition(
+                                getTableLM(), true, new LinkedList()), true));
                 headerAsSecondToLast = box;
             }
         }
@@ -179,11 +197,18 @@
             //We can simply add the table footer at the end of the whole list
             TableHeaderFooterPosition pos = new TableHeaderFooterPosition(
                     getTableLM(), false, this.footerList);
-            KnuthBox box = new KnuthBox(footerNetHeight, pos, false);
+            List<LayoutManager> footnoteList = new LinkedList<LayoutManager>();
+            FootenoteUtil.collectFoonotes(footerList, footnoteList);
+
+            KnuthBox box;
+            if (footnoteList.isEmpty())
+                box = new KnuthBox(footerNetHeight, pos, false);
+            else
+                box = new KnuthBlockBox(footerNetHeight, footnoteList, pos, false);
             footerAsLast = box;
         }
-        LinkedList returnList = getKnuthElementsForRowIterator(
-                bodyIter, context, alignment, TableRowIterator.BODY);
+        returnList.addAll(getKnuthElementsForRowIterator(
+                bodyIter, context, alignment, TableRowIterator.BODY));
         if (headerAsFirst != null) {
             int insertionPoint = 0;
             if (returnList.size() > 0 && ((ListElement)returnList.getFirst()).isForcedBreak()) {
