Index: /Users/dario/Documents/tesi/workspace3/FOP/src/java/org/apache/fop/apps/FOUserAgent.java
===================================================================
--- /Users/dario/Documents/tesi/workspace3/FOP/src/java/org/apache/fop/apps/FOUserAgent.java	(revision 705986)
+++ /Users/dario/Documents/tesi/workspace3/FOP/src/java/org/apache/fop/apps/FOUserAgent.java	(working copy)
@@ -96,6 +96,7 @@
     private FOEventHandler foEventHandlerOverride = null;
     private boolean locatorEnabled = true; // true by default (for error messages).
     private EventBroadcaster eventBroadcaster = new FOPEventBroadcaster();
+    private boolean cachingEnabled = false;
 
     /** Producer:  Metadata element for the system/software that produces
      * the document. (Some renderers can store this in the document.)
@@ -577,5 +578,20 @@
 
     }
 
+    /**
+     * Tells which render model to use (cached or not)
+     * @return the cachingEnabled
+     */
+    public boolean isCachingEnabled() {
+        return cachingEnabled;
+    }
+
+    /**
+     * @param cachingEnabled the cachingEnabled to set
+     */
+    public void setCachingEnabled(boolean cachingEnabled) {
+        this.cachingEnabled = cachingEnabled;
+    }
+
 }
 
Index: /Users/dario/Documents/tesi/workspace3/FOP/src/java/org/apache/fop/area/AreaTreeHandler.java
===================================================================
--- /Users/dario/Documents/tesi/workspace3/FOP/src/java/org/apache/fop/area/AreaTreeHandler.java	(revision 705986)
+++ /Users/dario/Documents/tesi/workspace3/FOP/src/java/org/apache/fop/area/AreaTreeHandler.java	(working copy)
@@ -124,7 +124,11 @@
      */
     protected void setupModel(FOUserAgent userAgent, String outputFormat,
             OutputStream stream) throws FOPException {
-        model = new RenderPagesModel(userAgent, outputFormat, fontInfo, stream);
+        if (userAgent.isCachingEnabled()) {
+            model = new CachedRenderPagesModel(userAgent, outputFormat, fontInfo, stream);
+        } else {
+            model = new RenderPagesModel(userAgent, outputFormat, fontInfo, stream);
+        }
     }
 
     /**
Index: /Users/dario/Documents/tesi/workspace3/FOP/src/java/org/apache/fop/area/CachedRenderPagesModel.java
===================================================================
--- /Users/dario/Documents/tesi/workspace3/FOP/src/java/org/apache/fop/area/CachedRenderPagesModel.java	(revision 705986)
+++ /Users/dario/Documents/tesi/workspace3/FOP/src/java/org/apache/fop/area/CachedRenderPagesModel.java	(working copy)
@@ -129,7 +129,7 @@
         try {
             // save page to cache
             ObjectOutputStream tempstream;
-            String fname = "fop-page-" + page.toString() + ".ser";
+            String fname = "fop-page-" + page.getPageIndex() + ".ser";
             File tempFile = new File(baseDir, fname);
             tempFile.deleteOnExit();
             tempstream = new ObjectOutputStream(new BufferedOutputStream(
Index: /Users/dario/Documents/tesi/workspace3/FOP/src/java/org/apache/fop/area/inline/InlineArea.java
===================================================================
--- /Users/dario/Documents/tesi/workspace3/FOP/src/java/org/apache/fop/area/inline/InlineArea.java	(revision 705986)
+++ /Users/dario/Documents/tesi/workspace3/FOP/src/java/org/apache/fop/area/inline/InlineArea.java	(working copy)
@@ -19,6 +19,8 @@
 
 package org.apache.fop.area.inline;
 
+import java.io.Serializable;
+
 import org.apache.fop.area.Area;
 import org.apache.fop.area.LineArea;
 import org.apache.fop.area.Trait;
@@ -35,7 +37,7 @@
      * that can be used in order to re-compute adjustments when a
      * page-number or a page-number-citation is resolved
      */
-    protected class InlineAdjustingInfo {
+    protected class InlineAdjustingInfo implements Serializable {
         /** stretch of the inline area */
         protected int availableStretch;
         /** shrink of the inline area */
Index: /Users/dario/Documents/tesi/workspace3/FOP/src/java/org/apache/fop/cli/CommandLineOptions.java
===================================================================
--- /Users/dario/Documents/tesi/workspace3/FOP/src/java/org/apache/fop/cli/CommandLineOptions.java	(revision 705986)
+++ /Users/dario/Documents/tesi/workspace3/FOP/src/java/org/apache/fop/cli/CommandLineOptions.java	(working copy)
@@ -103,6 +103,8 @@
     private Map renderingOptions = new java.util.HashMap();
     /* target resolution (for the user agent) */
     private int targetResolution = 0;
+    /* enable area tree caching */
+    private boolean cachingEnabled = false;
 
     private FopFactory factory = FopFactory.newInstance();
     private FOUserAgent foUserAgent;
@@ -161,6 +163,7 @@
                 }
                 addXSLTParameter("fop-output-format", getOutputFormat());
                 addXSLTParameter("fop-version", Version.getVersion());
+                foUserAgent.setCachingEnabled(cachingEnabled);
             } else {
                 return false;
             }
@@ -254,6 +257,8 @@
                 setLogOption("debug", "debug");
             } else if (args[i].equals("-r")) {
                 factory.setStrictValidation(false);
+            } else if (args[i].equals("-cache")) {
+                cachingEnabled = true;
             } else if (args[i].equals("-dpi")) {
                 i = i + parseResolution(args, i);
             } else if (args[i].equals("-q") || args[i].equals("--quiet")) {
@@ -1059,6 +1064,7 @@
             + "  -r                relaxed/less strict validation (where available)\n"
             + "  -dpi xxx          target resolution in dots per inch (dpi) where xxx is a number\n"
             + "  -s                for area tree XML, down to block areas only\n"
+            + "  -cache            reduce memory usage when there are forward references\n"
             + "  -v                to show FOP version being used\n\n"
             + "  -o [password]     PDF file will be encrypted with option owner password\n"
             + "  -u [password]     PDF file will be encrypted with option user password\n"
Index: /Users/dario/Documents/tesi/workspace3/FOP/src/java/org/apache/fop/layoutmgr/AbstractLayoutManager.java
===================================================================
--- /Users/dario/Documents/tesi/workspace3/FOP/src/java/org/apache/fop/layoutmgr/AbstractLayoutManager.java	(revision 705986)
+++ /Users/dario/Documents/tesi/workspace3/FOP/src/java/org/apache/fop/layoutmgr/AbstractLayoutManager.java	(working copy)
@@ -377,6 +377,10 @@
         if (fobj != null) {
             getPSLM().notifyEndOfLayout(fobj.getId());
         }
+        // Free memory of the area tree
+        if (this instanceof BlockStackingLayoutManager) {
+            ((BlockStackingLayoutManager)this).parentArea = null;
+        }
     }
 
     /**
Index: /Users/dario/Documents/tesi/workspace3/FOP/src/java/org/apache/fop/layoutmgr/table/TableCellLayoutManager.java
===================================================================
--- /Users/dario/Documents/tesi/workspace3/FOP/src/java/org/apache/fop/layoutmgr/table/TableCellLayoutManager.java	(revision 705986)
+++ /Users/dario/Documents/tesi/workspace3/FOP/src/java/org/apache/fop/layoutmgr/table/TableCellLayoutManager.java	(working copy)
@@ -427,6 +427,9 @@
         flush();
 
         curBlockArea = null;
+        
+        // Needed for freeing the area tree
+        parentArea = null;
     }
 
     /** Adds background areas for the column, body and row, if any. */
