diff --git a/src/java/org/apache/fop/render/pdf/pdfbox/MergeCFFFonts.java b/src/java/org/apache/fop/render/pdf/pdfbox/MergeCFFFonts.java
index c3e6881..f44c9f1 100644
--- a/src/java/org/apache/fop/render/pdf/pdfbox/MergeCFFFonts.java
+++ b/src/java/org/apache/fop/render/pdf/pdfbox/MergeCFFFonts.java
@@ -44,6 +44,7 @@
 
 import org.apache.fop.fonts.cff.CFFDataReader;
 import org.apache.fop.fonts.truetype.FontFileReader;
+import org.apache.fop.pdf.PDFDocument;
 
 public class MergeCFFFonts extends OTFSubSetFile implements MergeFonts {
     protected List<Map<Integer, Integer>> subsetGlyphsList = new ArrayList<Map<Integer, Integer>>();
@@ -338,7 +339,7 @@
             } else {
                 String notice = (String)fileFont.getTopDict().get("Notice");
                 if (notice != null && !(fileFont instanceof CFFCIDFont)) {
-                    stringIndexData.add(notice.getBytes("ISO-8859-1"));
+                    stringIndexData.add(notice.getBytes(PDFDocument.ENCODING));
                 }
             }
             stringIndexData.add(embeddedName.getBytes("UTF-8"));
@@ -346,7 +347,8 @@
         } else {
             String notice = (String)fileFont.getTopDict().get("Notice");
             if (notice != null) {
-                writeIndex(Arrays.<byte[]>asList(notice.getBytes("ISO-8859-1"), embeddedName.getBytes("UTF-8")));
+                writeIndex(Arrays.<byte[]>asList(notice.getBytes(PDFDocument.ENCODING),
+                        embeddedName.getBytes("UTF-8")));
             } else {
                 List<byte[]> sindex = new ArrayList<byte[]>();
                 sindex.add(cffReader.getStringIndex().getData());
diff --git a/src/java/org/apache/fop/render/pdf/pdfbox/MergeFontsPDFWriter.java b/src/java/org/apache/fop/render/pdf/pdfbox/MergeFontsPDFWriter.java
index 25012ce..4024431 100644
--- a/src/java/org/apache/fop/render/pdf/pdfbox/MergeFontsPDFWriter.java
+++ b/src/java/org/apache/fop/render/pdf/pdfbox/MergeFontsPDFWriter.java
@@ -56,9 +56,9 @@
 import org.apache.fop.fonts.Typeface;
 import org.apache.fop.fonts.truetype.OTFSubSetFile;
 
+import org.apache.fop.pdf.PDFDocument;
 import org.apache.fop.pdf.PDFText;
 
-
 public class MergeFontsPDFWriter extends PDFWriter {
     protected static final Log log = LogFactory.getLog(MergeFontsPDFWriter.class);
     private COSDictionary fonts;
@@ -223,7 +223,7 @@
     }
 
     private String getString(COSString s) throws UnsupportedEncodingException {
-        String encoding = "ISO-8859-1";
+        String encoding = PDFDocument.ENCODING;
         byte[] data = s.getBytes();
         int start = 0;
         if (data.length > 2) {
diff --git a/src/java/org/apache/fop/render/pdf/pdfbox/PDFBoxAdapter.java b/src/java/org/apache/fop/render/pdf/pdfbox/PDFBoxAdapter.java
index a8ac934..e6d11f5 100644
--- a/src/java/org/apache/fop/render/pdf/pdfbox/PDFBoxAdapter.java
+++ b/src/java/org/apache/fop/render/pdf/pdfbox/PDFBoxAdapter.java
@@ -92,7 +92,8 @@
     private Map<Integer, PDFArray> pageNumbers;
     private Collection<String> parentFonts = new ArrayList<String>();
 
-    private int currentMCID;
+    protected int currentMCID;
+    protected UniqueName uniqueName;
 
     /**
      * Creates a new PDFBoxAdapter.
@@ -179,16 +180,16 @@
     public Object createStreamFromPDFBoxPage(PDDocument sourceDoc, PDPage page, String key,
                                                      AffineTransform atdoc, FontInfo fontinfo, Rectangle pos)
         throws IOException {
+        COSDictionary sourcePageResources = getResources(page);
+        uniqueName = new UniqueName(key, sourcePageResources, pdfDoc.isFormXObjectEnabled());
         handleAnnotations(sourceDoc, page, atdoc);
         if (pageNumbers.containsKey(targetPage.getPageIndex())) {
             pageNumbers.get(targetPage.getPageIndex()).set(0, targetPage.makeReference());
         }
-        COSDictionary sourcePageResources = getResources(page);
         PDStream pdStream = getContents(page);
 
         COSDictionary fonts = (COSDictionary)sourcePageResources.getDictionaryObject(COSName.FONT);
         COSDictionary fontsBackup = null;
-        UniqueName uniqueName = new UniqueName(key, sourcePageResources);
         String newStream = null;
         if (fonts != null && pdfDoc.isMergeFontsEnabled()) {
             fontsBackup = new COSDictionary(fonts);
@@ -298,6 +299,23 @@
         return pdStream;
     }
 
+    private void updateMergeFontInfo(PDFDictionary pageResources, FontInfo fontinfo) {
+        PDFDictionary fontDict = (PDFDictionary)pageResources.get("Font");
+        if (fontDict != null && pdfDoc.isMergeFontsEnabled()) {
+            for (Map.Entry<String, Typeface> fontEntry : fontinfo.getUsedFonts().entrySet()) {
+                Typeface font = fontEntry.getValue();
+                if (font instanceof FOPPDFFont) {
+                    FOPPDFFont pdfFont = (FOPPDFFont)font;
+                    if (pdfFont.getRef() == null) {
+                        pdfFont.setRef(new PDFDictionary());
+                        pdfDoc.assignObjectNumber(pdfFont.getRef());
+                    }
+                    fontDict.put(fontEntry.getKey(), pdfFont.getRef());
+                }
+            }
+        }
+    }
+
     private PDFFormXObject getFormXObject(PDFDictionary pageResources, PDFStream pageStream, String key, PDPage page)
         throws IOException {
         if (pdfDoc.isMergeFontsEnabled()) {
@@ -401,8 +419,8 @@
             PDFDictionary target = (PDFDictionary) pageResources.get("XObject");
             for (COSName entry : xobj.keySet()) {
                 if (newXObj.containsKey(entry)) {
-                    PDFStream s = (PDFStream) target.get(entry.getName());
-                    s.setData(newXObj.get(entry).getBytes("ISO-8859-1"));
+                    PDFStream s = (PDFStream) target.get(uniqueName.getName(entry));
+                    s.setData(newXObj.get(entry).getBytes(PDFDocument.ENCODING));
                     PDFDictionary xobjr = (PDFDictionary) s.get("Resources");
                     xobjr.put("Font", pageResources.get("Font"));
                 }
diff --git a/src/java/org/apache/fop/render/pdf/pdfbox/PDFCloner.java b/src/java/org/apache/fop/render/pdf/pdfbox/PDFCloner.java
index dae4738..52fb7c2 100644
--- a/src/java/org/apache/fop/render/pdf/pdfbox/PDFCloner.java
+++ b/src/java/org/apache/fop/render/pdf/pdfbox/PDFCloner.java
@@ -40,9 +40,11 @@
 import org.apache.pdfbox.cos.COSStream;
 import org.apache.pdfbox.cos.COSString;
 import org.apache.pdfbox.pdmodel.common.COSObjectable;
+import org.apache.pdfbox.pdmodel.common.PDStream;
 
 import org.apache.fop.pdf.PDFArray;
 import org.apache.fop.pdf.PDFDictionary;
+import org.apache.fop.pdf.PDFDocument;
 import org.apache.fop.pdf.PDFName;
 import org.apache.fop.pdf.PDFNumber;
 import org.apache.fop.pdf.PDFObject;
@@ -142,7 +144,11 @@
         cacheClonedObject(keyBase, newDict);
         for (Map.Entry<COSName, COSBase> e : dic.entrySet()) {
             if (!exclude.contains(e.getKey())) {
-                newDict.put(e.getKey().getName(), cloneForNewDocument(e.getValue(), e.getValue(), exclude));
+                String name = e.getKey().getName();
+                if (adapter.uniqueName != null) {
+                    name = adapter.uniqueName.getName(e.getKey());
+                }
+                newDict.put(name, cloneForNewDocument(e.getValue(), e.getValue(), exclude));
             }
         }
         return newDict;
@@ -179,7 +185,23 @@
         }
         PDFStream stream = new PDFStream();
         OutputStream out = stream.getBufferOutputStream();
-        IOUtils.copyLarge(in, out);
+        if (originalStream.getItem(COSName.SUBTYPE) == COSName.FORM && adapter.uniqueName != null) {
+            PDFWriter writer = new PDFWriter(adapter.uniqueName, adapter.currentMCID);
+            try {
+                String newStream = writer.writeText(new PDStream(originalStream));
+                if (writer.keyUsed) {
+                    filter = adapter.FILTER_FILTER;
+                    out.write(newStream.getBytes(PDFDocument.ENCODING));
+                    out.close();
+                    in = null;
+                }
+            } catch (IOException e) {
+                //ignore
+            }
+        }
+        if (in != null) {
+            IOUtils.copyLarge(in, out);
+        }
         adapter.transferDict(originalStream, stream, filter);
         return cacheClonedObject(keyBase, stream);
     }
diff --git a/src/java/org/apache/fop/render/pdf/pdfbox/PDFString.java b/src/java/org/apache/fop/render/pdf/pdfbox/PDFString.java
index dbee9de..32cfa76 100644
--- a/src/java/org/apache/fop/render/pdf/pdfbox/PDFString.java
+++ b/src/java/org/apache/fop/render/pdf/pdfbox/PDFString.java
@@ -59,7 +59,7 @@
      */
     public String getString() {
         if (this.text == null) {
-            String encoding = "ISO-8859-1";
+            String encoding = PDFDocument.ENCODING;
             int start = 0;
             if (this.binary.length > 2) {
                 if (this.binary[0] == (byte)0xFF && this.binary[1] == (byte)0xFE) {
@@ -103,7 +103,7 @@
                     binary[1] = (byte)0xFF;
                     System.arraycopy(data, 0, binary, 2, data.length);
                 } else {
-                    byte[] data = this.text.getBytes("ISO-8859-1");
+                    byte[] data = this.text.getBytes(PDFDocument.ENCODING);
                     binary = new byte[data.length];
                     System.arraycopy(data, 0, binary, 0, data.length);
                 }
diff --git a/src/java/org/apache/fop/render/pdf/pdfbox/PDFWriter.java b/src/java/org/apache/fop/render/pdf/pdfbox/PDFWriter.java
index e96bdb3..50502fd 100644
--- a/src/java/org/apache/fop/render/pdf/pdfbox/PDFWriter.java
+++ b/src/java/org/apache/fop/render/pdf/pdfbox/PDFWriter.java
@@ -39,6 +39,7 @@
 import org.apache.pdfbox.pdfparser.PDFStreamParser;
 import org.apache.pdfbox.pdmodel.common.PDStream;
 
+import org.apache.fop.pdf.PDFDocument;
 
 public class PDFWriter {
     private DecimalFormat df = new DecimalFormat("#.####", new DecimalFormatSymbols(Locale.US));
@@ -46,6 +47,7 @@
     protected StringBuilder s = new StringBuilder();
     protected UniqueName key;
     private int currentMCID;
+    protected boolean keyUsed;
 
     public PDFWriter(UniqueName key, int currentMCID) {
         this.key = key;
@@ -69,7 +71,7 @@
                         arguments.add(cn.getValue());
                     }
                     readPDFArguments(op, arguments);
-                    s.append("ID " + new String(op.getImageData(), "ISO-8859-1"));
+                    s.append("ID " + new String(op.getImageData(), PDFDocument.ENCODING));
                     arguments.clear();
                     s.append("EI\n");
                 }
@@ -102,8 +104,12 @@
             }
         } else if (c instanceof COSName) {
             COSName cn = (COSName)c;
-            s.append("/" + key.getName(cn));
+            String name = key.getName(cn);
+            s.append("/" + name);
             s.append(" ");
+            if (!name.equals(cn.getName())) {
+                keyUsed = true;
+            }
         } else if (c instanceof COSString) {
             s.append("<" + ((COSString) c).toHexString() + ">");
         } else if (c instanceof COSArray) {
diff --git a/src/java/org/apache/fop/render/pdf/pdfbox/UniqueName.java b/src/java/org/apache/fop/render/pdf/pdfbox/UniqueName.java
index 4bd61b6..c55b716 100644
--- a/src/java/org/apache/fop/render/pdf/pdfbox/UniqueName.java
+++ b/src/java/org/apache/fop/render/pdf/pdfbox/UniqueName.java
@@ -19,6 +19,7 @@
 package org.apache.fop.render.pdf.pdfbox;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 import org.apache.pdfbox.cos.COSBase;
@@ -30,9 +31,14 @@
     private String key;
     private List<COSName> resourceNames;
 
-    public UniqueName(String key, COSDictionary sourcePageResources) {
-        this.key = Integer.toString(key.hashCode());
-        resourceNames = getResourceNames(sourcePageResources);
+    public UniqueName(String key, COSDictionary sourcePageResources, boolean disable) {
+        if (disable) {
+            resourceNames = Collections.emptyList();
+        } else {
+            key = key.split("#")[0];
+            this.key = Integer.toString(key.hashCode());
+            resourceNames = getResourceNames(sourcePageResources);
+        }
     }
 
     protected String getName(COSName cn) {
diff --git a/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java b/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java
index 29e961f..84f36f4 100644
--- a/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java
+++ b/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java
@@ -28,10 +28,12 @@
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.net.URI;
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
+import java.util.List;
 import java.util.Map;
 
 import org.junit.Assert;
@@ -657,4 +659,27 @@
         formXObject.output(bos);
         Assert.assertTrue(bos.toString("UTF-8").contains("/Type /XObject"));
     }
+
+    @Test
+    public void testRewriteOfForms() throws Exception {
+        PDFDocument pdfdoc = new PDFDocument("");
+        PDFPage pdfpage = getPDFPage(pdfdoc);
+        pdfpage.setDocument(pdfdoc);
+        pdfpage.setObjectNumber(1);
+        PDFBoxAdapter adapter = new PDFBoxAdapter(pdfpage, new HashMap(), new HashMap<Integer, PDFArray>());
+        PDDocument doc = PDDocument.load(new File(ACCESSIBLERADIOBUTTONS));
+        PDPage page = doc.getPage(0);
+        AffineTransform at = new AffineTransform();
+        Rectangle r = new Rectangle(0, 1650, 842000, 595000);
+        adapter.createStreamFromPDFBoxPage(doc, page, "key", at, null, r);
+        ByteArrayOutputStream os = new ByteArrayOutputStream();
+        Map<String, List<String>> filterMap = new HashMap<String, List<String>>();
+        List<String> filterList = new ArrayList<String>();
+        filterList.add("null");
+        filterMap.put("default", filterList);
+        pdfdoc.setFilterMap(filterMap);
+        pdfdoc.output(os);
+        Assert.assertTrue(os.toString("UTF-8").contains("/F15106079 12 Tf"));
+        doc.close();
+    }
 }
