diff --git a/build.xml b/build.xml
index 28bb27d..1d9939b 100644
--- a/build.xml
+++ b/build.xml
@@ -448,6 +448,7 @@
       <class location="${build.unit.tests.dir}"/>
       <auxClasspath>
         <path refid="libs-build-classpath"/>
+        <path refid="libs-build-tools-classpath"/>
         <path>
           <fileset dir="${ant.library.dir}">
             <include name="ant.jar"/>
@@ -458,4 +459,22 @@
     </findbugs>
     <fail if="findbugs.warnings"/>
   </target>
+  
+  <target name="jar-sources" description="Generates a jar file with all the sources">
+    <tstamp>
+      <format property="ts" pattern="yyyyMMdd-HHmmss-z"/>
+    </tstamp>
+    <patternset id="java-only">
+      <include name="**/*.java"/>
+    </patternset>
+    <jar jarfile="${build.dir}/${name}-${version}-sources.jar">
+      <fileset dir="${src.java.dir}">
+        <patternset refid="java-only"/>
+      </fileset>
+      <fileset dir="${basedir}">
+        <include name="LICENSE"/>
+        <include name="NOTICE"/>
+      </fileset>
+    </jar>
+  </target>  
 </project>
diff --git a/src/java/org/apache/fop/render/pdf/pdfbox/PageParentTreeFinder.java b/src/java/org/apache/fop/render/pdf/pdfbox/PageParentTreeFinder.java
index 92d5139..0aa5950 100644
--- a/src/java/org/apache/fop/render/pdf/pdfbox/PageParentTreeFinder.java
+++ b/src/java/org/apache/fop/render/pdf/pdfbox/PageParentTreeFinder.java
@@ -35,7 +35,7 @@
 
 public class PageParentTreeFinder {
 
-    PDPage srcPage;
+    private PDPage srcPage;
     public PageParentTreeFinder(PDPage srcPage) {
         this.srcPage = srcPage;
     }
@@ -57,7 +57,7 @@
         Iterable<COSName> mapXObject = srcPage.getResources().getXObjectNames();
         for (COSName n : mapXObject) {
             PDXObject t = srcPage.getResources().getXObject(n);
-            COSDictionary xObjectDict = (COSDictionary)t.getCOSObject();
+            COSDictionary xObjectDict = t.getCOSObject();
             position = xObjectDict.getInt(COSName.STRUCT_PARENTS);
             if (position != -1) {
                 return position;
@@ -77,11 +77,13 @@
             parentTree = (COSArray) numberTreeNodeDict.getDictionaryObject(COSName.KIDS);
             traverseKids(parentTree, position, nums);
         }
+        if (nums.isEmpty()) {
+            return new COSArray();
+        }
         return nums.get(0);
     }
 
     private void traverseKids(COSBase kids, int position, List<COSArray> numList) {
-        COSArray pageParentTree;
         if (!numList.isEmpty()) {
             return;
         }
@@ -95,7 +97,6 @@
             COSObject kidCOSObj = (COSObject) kids;
             if (kidCOSObj.getDictionaryObject(COSName.NUMS) == null) {
                 traverseKids(kidCOSObj.getDictionaryObject(COSName.KIDS), position, numList);
-
             } else {
                 if (kidCOSObj.getDictionaryObject(COSName.LIMITS) != null) {
                     COSArray kidCOSArray = (COSArray) kidCOSObj.getDictionaryObject(COSName.LIMITS);
@@ -103,8 +104,7 @@
                     int upperLimit = ((COSInteger) kidCOSArray.get(1)).intValue();
                     if (lowerLimit <= position && position <= upperLimit) {
                         COSArray nums = (COSArray) kidCOSObj.getDictionaryObject(COSName.NUMS);
-                        pageParentTree = (COSArray) nums.getObject(((position - lowerLimit) * 2) + 1);
-                        numList.add(pageParentTree);
+                        numList.add(extractMarkedContentParents(nums, position));
                     }
                 } else {
                     COSArray nums = (COSArray) kidCOSObj.getDictionaryObject(COSName.NUMS);
diff --git a/test/java/org/apache/fop/render/pdf/PageParentTreeFinderTestCase.java b/test/java/org/apache/fop/render/pdf/PageParentTreeFinderTestCase.java
index 854ea7d..750bc07 100644
--- a/test/java/org/apache/fop/render/pdf/PageParentTreeFinderTestCase.java
+++ b/test/java/org/apache/fop/render/pdf/PageParentTreeFinderTestCase.java
@@ -31,6 +31,7 @@
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.pdmodel.PDPage;
 import org.apache.pdfbox.pdmodel.PDResources;
+import org.apache.pdfbox.pdmodel.common.PDNumberTreeNode;
 
 import org.apache.fop.render.pdf.pdfbox.PageParentTreeFinder;
 
@@ -62,6 +63,7 @@
         test = secondKid.getInt("MCID");
         expected = 1;
         Assert.assertEquals(test, expected);
+        doc.close();
     }
 
     @Test
@@ -75,4 +77,18 @@
         int test = parentTree.size();
         Assert.assertEquals(test, 0);
     }
+
+    @Test
+    public void testTraverseKids() throws IOException {
+        PDDocument doc = PDDocument.load(new File(LINK));
+        PDNumberTreeNode srcNumberTreeNode = doc.getDocumentCatalog().getStructureTreeRoot().getParentTree();
+        COSArray parentTree = (COSArray) srcNumberTreeNode.getCOSObject().getDictionaryObject(COSName.KIDS);
+        COSObject kidCOSObj = (COSObject) parentTree.get(0);
+        COSArray nums = (COSArray) kidCOSObj.getDictionaryObject(COSName.NUMS);
+        nums.add(0, COSInteger.get(9));
+        nums.add(1, new COSDictionary());
+        COSArray numList = new PageParentTreeFinder(doc.getPage(0)).getPageParentTreeArray(doc);
+        Assert.assertEquals(numList.size(), 3);
+        doc.close();
+    }
 }
