Index: pdfbox/src/main/java/org/apache/pdfbox/pdfparser/PDFParser.java
===================================================================
--- pdfbox/src/main/java/org/apache/pdfbox/pdfparser/PDFParser.java	(revision 1226367)
+++ pdfbox/src/main/java/org/apache/pdfbox/pdfparser/PDFParser.java	(working copy)
@@ -66,7 +66,7 @@
     /** Collects all Xref/trailer objects and resolves them into single
      *  object using startxref reference. 
      */
-    private XrefTrailerResolver xrefTrailerResolver = new XrefTrailerResolver();
+    protected XrefTrailerResolver xrefTrailerResolver = new XrefTrailerResolver();
 
     /**
      * Temp file directory.
@@ -659,7 +659,7 @@
      * @return false on parsing error
      * @throws IOException If an IO error occurs.
      */
-    private boolean parseStartXref() throws IOException
+    protected boolean parseStartXref() throws IOException
     {
         if(pdfSource.peek() != 's')
         {
@@ -686,7 +686,7 @@
      * @return false on parsing error
      * @throws IOException If an IO error occurs.
      */
-    private boolean parseXrefTable( long startByteOffset ) throws IOException
+    protected boolean parseXrefTable( long startByteOffset ) throws IOException
     {
         if(pdfSource.peek() != 'x')
         {
@@ -767,7 +767,7 @@
      * @return false on parsing error
      * @throws IOException If an IO error occurs.
      */
-    private boolean parseTrailer() throws IOException
+    protected boolean parseTrailer() throws IOException
     {
         if(pdfSource.peek() != 't')
         {
Index: pdfbox/src/main/java/org/apache/pdfbox/pdfparser/PDFXrefStreamParser.java
===================================================================
--- pdfbox/src/main/java/org/apache/pdfbox/pdfparser/PDFXrefStreamParser.java	(revision 1226367)
+++ pdfbox/src/main/java/org/apache/pdfbox/pdfparser/PDFXrefStreamParser.java	(working copy)
@@ -150,9 +150,26 @@
                         break;
                     case 2:
                         /*
+                         * object stored in object stream; 2nd argument is object number of object stream;
+                         * 3rd argument index of object within object stream
+                         * 
+                         * For sequential PDFParser we do not need this information
+                         * because
                          * These objects are handled by the dereferenceObjects() method
                          * since they're only pointing to object numbers
+                         * 
+                         * However for XRef aware parsers we have to know which objects contain
+                         * object streams. We will store this information in normal xref mapping
+                         * table but add object stream number with minus sign in order to
+                         * distinguish from file offsets
                          */
+	                      int objstmObjNr = 0;
+	                      for(int i = 0; i < w1; i++)
+	                      {
+	                      		objstmObjNr += (currLine[i + w0] & 0x00ff) << ((w1 - i - 1) * 8);
+	                      }
+                        objKey = new COSObjectKey( objID.intValue(), 0 );
+                        xrefTrailerResolver.setXRef( objKey, -objstmObjNr );
                         break;
                     default:
                         break;
Index: pdfbox/src/main/java/org/apache/pdfbox/pdfparser/XrefTrailerResolver.java
===================================================================
--- pdfbox/src/main/java/org/apache/pdfbox/pdfparser/XrefTrailerResolver.java	(revision 1226367)
+++ pdfbox/src/main/java/org/apache/pdfbox/pdfparser/XrefTrailerResolver.java	(working copy)
@@ -19,8 +19,11 @@
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
+import java.util.Map.Entry;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -111,6 +114,13 @@
     }
 
     /**
+     * Returns the trailer last set by {@link #setTrailer(COSDictionary)}.
+     */
+    public COSDictionary getCurrentTrailer() {
+    		return curXrefTrailerObj.trailer;
+    }
+
+    /**
      * Sets the byte position of the first XRef
      * (has to be called after very last startxref was read).
      * This is used to resolve chain of active XRef/trailer.
@@ -203,8 +213,37 @@
      *  {@link #setStartxref(int)} was not called before.
      *
      */
     public Map<COSObjectKey, Long> getXrefTable()
     {
         return ( resolvedXrefTrailer == null ) ? null : resolvedXrefTrailer.xrefTable;
     }
+    
+    /** Returns object numbers which are referenced as contained
+     *  in object stream with specified object number.
+     *  
+     *  This will scan resolved xref table for all entries having negated
+     *  stream object number as value.
+     *
+     *  @param objstmObjNr  object number of object stream for which contained object numbers
+     *                      should be returned
+     *                       
+     *  @return set of object numbers referenced for given object stream
+     *          or <code>null</code> if {@link #setStartxref(long)} was not
+     *          called before so that no resolved xref table exists
+     */
+    public Set<Long> getContainedObjectNumbers( final int objstmObjNr ) 
+    {
+    		if ( resolvedXrefTrailer == null )
+    			return null;
+    		
+    		final Set<Long> refObjNrs = new HashSet<Long>();
+    		final int       cmpVal    = - objstmObjNr;
+    		
+    		for ( Entry<COSObjectKey,Long> xrefEntry : resolvedXrefTrailer.xrefTable.entrySet() ) {
+						if ( xrefEntry.getValue() == cmpVal )
+							refObjNrs.add( xrefEntry.getKey().getNumber() );
+				}
+    		
+    		return refObjNrs;
+    }
 }
Index: pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDDocument.java
===================================================================
--- pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDDocument.java	(revision 1226367)
+++ pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDDocument.java	(working copy)
@@ -47,6 +47,7 @@
 import org.apache.pdfbox.exceptions.InvalidPasswordException;
 import org.apache.pdfbox.exceptions.SignatureException;
 import org.apache.pdfbox.io.RandomAccess;
+import org.apache.pdfbox.pdfparser.NonSequentialPDFParser;
 import org.apache.pdfbox.pdfparser.PDFParser;
 import org.apache.pdfbox.pdfwriter.COSWriter;
 import org.apache.pdfbox.pdmodel.common.COSArrayList;
@@ -1090,6 +1091,24 @@
         return parser.getPDDocument();
     }
 
+
+    /**
+     * Parses PDF with non sequential parser.
+     *  
+     * @param file  file to be loaded
+     * @param scratchFile  location to store temp PDFBox data for this document
+     *
+     * @return loaded document
+     *
+     * @throws IOException  in case of a file reading or parsing error
+     */
+    public static PDDocument loadNonSeq( File file, RandomAccess scratchFile ) throws IOException
+    {
+    	  NonSequentialPDFParser parser = new NonSequentialPDFParser( file, scratchFile );
+        parser.parse();
+        return parser.getPDDocument();
+    }
+    
     /**
      * This will save this document to the filesystem.
      *
Index: pdfbox/src/main/java/org/apache/pdfbox/io/PushBackInputStream.java
===================================================================
--- pdfbox/src/main/java/org/apache/pdfbox/io/PushBackInputStream.java	(revision 1226367)
+++ pdfbox/src/main/java/org/apache/pdfbox/io/PushBackInputStream.java	(working copy)
@@ -198,4 +198,21 @@
         return data;
     }
 
+    /**
+     *  Signals this class that underlying {@link InputStream} seeked to a new
+     *  position. We set this position and clear push back buffer.
+     * 
+     *  @param newOffset  new offset of underlying stream
+     */
+    public void setNewInputStreamOffset( long newOffset ) throws IOException {
+    	
+    	// clear unread buffer by skipping over all bytes of buffer
+    	int unreadLength = buf.length - pos;
+    	if ( unreadLength > 0 ) {
+    		skip( unreadLength );
+    	}
+    	
+    	offset = newOffset;
+    }
+
 }
