diff --git a/src/java/org/apache/fop/render/pdf/pdfbox/FOPPDFMultiByteFont.java b/src/java/org/apache/fop/render/pdf/pdfbox/FOPPDFMultiByteFont.java
index a1ce8c2..d4a339b 100644
--- a/src/java/org/apache/fop/render/pdf/pdfbox/FOPPDFMultiByteFont.java
+++ b/src/java/org/apache/fop/render/pdf/pdfbox/FOPPDFMultiByteFont.java
@@ -72,6 +72,7 @@
         readFontBBox(fontData);
         setFontName(name);
         addFont(fontData);
+        notifyMapOperation();
     }
 
     public String addFont(COSDictionary fontData) throws IOException {
diff --git a/test/java/org/apache/fop/render/pdf/FOPPDFSingleMultiByteFontTestCase.java b/test/java/org/apache/fop/render/pdf/FOPPDFSingleMultiByteFontTestCase.java
new file mode 100644
index 0000000..ba3d0dc
--- /dev/null
+++ b/test/java/org/apache/fop/render/pdf/FOPPDFSingleMultiByteFontTestCase.java
@@ -0,0 +1,163 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.fop.render.pdf;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Set;
+import java.util.TreeSet;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.fontbox.cff.CFFFont;
+import org.apache.fontbox.cff.CFFParser;
+import org.apache.fontbox.type1.Type1Font;
+import org.apache.pdfbox.cos.COSDictionary;
+import org.apache.pdfbox.cos.COSName;
+import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.pdfbox.pdmodel.PDPage;
+import org.apache.pdfbox.pdmodel.PDResources;
+
+import org.apache.fop.render.pdf.pdfbox.FOPPDFMultiByteFont;
+import org.apache.fop.render.pdf.pdfbox.FOPPDFSingleByteFont;
+
+public class FOPPDFSingleMultiByteFontTestCase {
+    private COSDictionary getFont(PDDocument doc, String internalname) throws IOException {
+        PDPage page = doc.getDocumentCatalog().getPages().get(0);
+        PDResources sourcePageResources = page.getResources();
+        COSDictionary fonts = (COSDictionary)sourcePageResources.getCOSObject().getDictionaryObject(COSName.FONT);
+        return (COSDictionary) fonts.getDictionaryObject(internalname);
+    }
+
+    @Test
+    public void testCFF() throws Exception {
+        PDDocument doc = PDDocument.load(new File(PDFBoxAdapterTestCase.CFF1));
+        FOPPDFSingleByteFont sbfont = new FOPPDFSingleByteFont(getFont(doc, "R11"),
+                "MyriadPro-Regular_Type1f0encstdcs");
+
+        Assert.assertTrue(Arrays.asList(sbfont.getEncoding().getCharNameMap()).contains("bracketright"));
+        Assert.assertTrue(!Arrays.asList(sbfont.getEncoding().getCharNameMap()).contains("A"));
+        Assert.assertTrue(!Arrays.toString(sbfont.getEncoding().getUnicodeCharMap()).contains("A"));
+        Assert.assertEquals(sbfont.mapChar('A'), 0);
+        Assert.assertEquals(sbfont.getWidths().length, 28);
+        Assert.assertEquals(sbfont.getFirstChar(), 87);
+        Assert.assertEquals(sbfont.getLastChar(), 114);
+
+        PDDocument doc2 = PDDocument.load(new File(PDFBoxAdapterTestCase.CFF2));
+        String name = sbfont.addFont(getFont(doc2, "R11"));
+        Assert.assertTrue(name.contains("MyriadPro"));
+
+        Assert.assertEquals(sbfont.getFontName(), "MyriadPro-Regular_Type1f0encstdcs");
+        Assert.assertEquals(sbfont.getEncodingName(), "WinAnsiEncoding");
+        Assert.assertEquals(sbfont.mapChar('W'), 'W');
+        String x = IOUtils.toString(sbfont.getInputStream());
+        Assert.assertTrue(x, x.contains("Adobe Systems"));
+        Assert.assertEquals(sbfont.getEncoding().getName(), "FOPPDFEncoding");
+        Assert.assertTrue(Arrays.asList(sbfont.getEncoding().getCharNameMap()).contains("A"));
+        Assert.assertEquals(sbfont.getWidths().length, 65);
+        Assert.assertEquals(sbfont.getFirstChar(), 50);
+        Assert.assertEquals(sbfont.getLastChar(), 114);
+
+        Assert.assertEquals(sbfont.addFont(getFont(doc2, "R13")), null);
+
+        doc.close();
+        doc2.close();
+    }
+
+    @Test
+    public void testCFF2() throws Exception {
+        PDDocument doc = PDDocument.load(new File(PDFBoxAdapterTestCase.CFF3));
+        FOPPDFSingleByteFont sbfont = new FOPPDFSingleByteFont(getFont(doc, "T1_0"),
+                "Myriad_Pro_Type1f0encf1cs");
+        Assert.assertTrue(Arrays.asList(sbfont.getEncoding().getCharNameMap()).contains("uni004E"));
+        Assert.assertEquals(sbfont.getFontName(), "Myriad_Pro_Type1f0encf1cs");
+        Assert.assertEquals(sbfont.getEncodingName(), null);
+        byte[] is = IOUtils.toByteArray(sbfont.getInputStream());
+
+        CFFParser p = new CFFParser();
+        CFFFont ff = p.parse(is).get(0);
+        Assert.assertEquals(ff.getName(), "MNEACN+Myriad_Pro");
+//        Assert.assertEquals(ff.getCharset().getEntries().get(0).getSID(), 391);
+
+        doc.close();
+    }
+
+    @Test
+    public void testTTCID() throws Exception {
+        PDDocument doc = PDDocument.load(new File(PDFBoxAdapterTestCase.TTCID1));
+        FOPPDFMultiByteFont mbfont = new FOPPDFMultiByteFont(getFont(doc, "C2_0"),
+                "ArialMT_Type0");
+        mbfont.addFont(getFont(doc, "C2_0"));
+        Assert.assertEquals(mbfont.mapChar('t'), 67);
+
+        PDDocument doc2 = PDDocument.load(new File(PDFBoxAdapterTestCase.TTCID2));
+        String name = mbfont.addFont(getFont(doc2, "C2_0"));
+        Assert.assertEquals(name, "ArialMT_Type0");
+        Assert.assertEquals(mbfont.getFontName(), "ArialMT_Type0");
+        byte[] is = IOUtils.toByteArray(mbfont.getInputStream());
+        Assert.assertEquals(is.length, 38640);
+        doc.close();
+        doc2.close();
+    }
+
+    @Test
+    public void testTTSubset() throws Exception {
+        PDDocument doc = PDDocument.load(new File(PDFBoxAdapterTestCase.TTSubset1));
+        FOPPDFSingleByteFont mbfont = new FOPPDFSingleByteFont(getFont(doc, "R9"),
+                "TimesNewRomanPSMT_TrueType");
+        mbfont.addFont(getFont(doc, "R9"));
+//        Assert.assertEquals(mbfont.mapChar('t'), 116);
+
+        PDDocument doc2 = PDDocument.load(new File(PDFBoxAdapterTestCase.TTSubset2));
+        String name = mbfont.addFont(getFont(doc2, "R9"));
+        Assert.assertEquals(name, "TimesNewRomanPSMT_TrueType");
+        Assert.assertEquals(mbfont.getFontName(), "TimesNewRomanPSMT_TrueType");
+        byte[] is = IOUtils.toByteArray(mbfont.getInputStream());
+        Assert.assertEquals(is.length, 41112);
+        doc.close();
+        doc2.close();
+    }
+
+    @Test
+    public void testType1Subset() throws Exception {
+        PDDocument doc = PDDocument.load(new File(PDFBoxAdapterTestCase.Type1Subset1));
+        FOPPDFSingleByteFont mbfont = new FOPPDFSingleByteFont(getFont(doc, "F15"), "");
+        mbfont.addFont(getFont(doc, "F15"));
+        PDDocument doc2 = PDDocument.load(new File(PDFBoxAdapterTestCase.Type1Subset2));
+        mbfont.addFont(getFont(doc2, "F15"));
+        Type1Font f = Type1Font.createWithPFB(mbfont.getInputStream());
+        Set<String> csDict = new TreeSet<String>(f.getCharStringsDict().keySet());
+        Assert.assertEquals(csDict.toString(), "[.notdef, a, d, e, hyphen, l, m, n, p, s, space, t, two, x]");
+        Assert.assertEquals(f.getSubrsArray().size(), 518);
+        Assert.assertEquals(f.getFamilyName(), "Verdana");
+        doc.close();
+        doc2.close();
+    }
+
+    @Test
+    public void testHadMappingOperations() throws IOException {
+        PDDocument pdf = PDDocument.load(new File(PDFBoxAdapterTestCase.TTCID1));
+        COSDictionary font = getFont(pdf, "C2_0");
+        font.removeItem(COSName.TO_UNICODE);
+        FOPPDFMultiByteFont multiByteFont = new FOPPDFMultiByteFont(font, null);
+        Assert.assertTrue(multiByteFont.hadMappingOperations());
+        pdf.close();
+    }
+}
diff --git a/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java b/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java
index ae63aba..54c460d 100644
--- a/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java
+++ b/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java
@@ -27,12 +27,9 @@
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.net.URI;
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
-import java.util.Set;
-import java.util.TreeSet;
 
 import org.junit.Test;
 
@@ -41,7 +38,6 @@
 import static org.mockito.Mockito.when;
 
 import org.apache.commons.io.IOUtils;
-import org.apache.fontbox.cff.CFFFont;
 import org.apache.fontbox.cff.CFFParser;
 import org.apache.fontbox.ttf.TTFParser;
 import org.apache.fontbox.type1.Type1Font;
@@ -52,7 +48,6 @@
 import org.apache.pdfbox.cos.COSObject;
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.pdmodel.PDPage;
-import org.apache.pdfbox.pdmodel.PDResources;
 
 import org.apache.xmlgraphics.image.loader.ImageException;
 import org.apache.xmlgraphics.image.loader.ImageInfo;
@@ -77,8 +72,6 @@
 import org.apache.fop.pdf.PDFPage;
 import org.apache.fop.pdf.PDFResources;
 import org.apache.fop.pdf.PDFStream;
-import org.apache.fop.render.pdf.pdfbox.FOPPDFMultiByteFont;
-import org.apache.fop.render.pdf.pdfbox.FOPPDFSingleByteFont;
 import org.apache.fop.render.pdf.pdfbox.ImageConverterPDF2G2D;
 import org.apache.fop.render.pdf.pdfbox.ImagePDF;
 import org.apache.fop.render.pdf.pdfbox.PDFBoxAdapter;
@@ -92,19 +85,19 @@
 
 public class PDFBoxAdapterTestCase {
     private Rectangle2D r = new Rectangle2D.Double();
-    private static final String CFF1 = "test/resources/2fonts.pdf";
-    private static final String CFF2 = "test/resources/2fonts2.pdf";
-    private static final String CFF3 = "test/resources/simpleh.pdf";
-    private static final String TTCID1 = "test/resources/ttcid1.pdf";
-    private static final String TTCID2 = "test/resources/ttcid2.pdf";
-    private static final String TTSubset1 = "test/resources/ttsubset.pdf";
-    private static final String TTSubset2 = "test/resources/ttsubset2.pdf";
+    protected static final String CFF1 = "test/resources/2fonts.pdf";
+    protected static final String CFF2 = "test/resources/2fonts2.pdf";
+    protected static final String CFF3 = "test/resources/simpleh.pdf";
+    protected static final String TTCID1 = "test/resources/ttcid1.pdf";
+    protected static final String TTCID2 = "test/resources/ttcid2.pdf";
+    protected static final String TTSubset1 = "test/resources/ttsubset.pdf";
+    protected static final String TTSubset2 = "test/resources/ttsubset2.pdf";
     private static final String TTSubset3 = "test/resources/ttsubset3.pdf";
     private static final String TTSubset5 = "test/resources/ttsubset5.pdf";
     private static final String CFFCID1 = "test/resources/cffcid1.pdf";
     private static final String CFFCID2 = "test/resources/cffcid2.pdf";
-    private static final String Type1Subset1 = "test/resources/t1subset.pdf";
-    private static final String Type1Subset2 = "test/resources/t1subset2.pdf";
+    protected static final String Type1Subset1 = "test/resources/t1subset.pdf";
+    protected static final String Type1Subset2 = "test/resources/t1subset2.pdf";
     private static final String Type1Subset3 = "test/resources/t1subset3.pdf";
     private static final String Type1Subset4 = "test/resources/t1subset4.pdf";
     protected static final String ROTATE = "test/resources/rotate.pdf";
@@ -193,118 +186,6 @@
         return c;
     }
 
-    private COSDictionary getFont(PDDocument doc, String internalname) throws IOException {
-        PDPage page = doc.getDocumentCatalog().getPages().get(0);
-        PDResources sourcePageResources = page.getResources();
-        COSDictionary fonts = (COSDictionary)sourcePageResources.getCOSObject().getDictionaryObject(COSName.FONT);
-        return (COSDictionary) fonts.getDictionaryObject(internalname);
-    }
-
-    @Test
-    public void testCFF() throws Exception {
-        PDDocument doc = PDDocument.load(new File(CFF1));
-        FOPPDFSingleByteFont sbfont = new FOPPDFSingleByteFont(getFont(doc, "R11"),
-                "MyriadPro-Regular_Type1f0encstdcs");
-
-        Assert.assertTrue(Arrays.asList(sbfont.getEncoding().getCharNameMap()).contains("bracketright"));
-        Assert.assertTrue(!Arrays.asList(sbfont.getEncoding().getCharNameMap()).contains("A"));
-        Assert.assertTrue(!Arrays.toString(sbfont.getEncoding().getUnicodeCharMap()).contains("A"));
-        Assert.assertEquals(sbfont.mapChar('A'), 0);
-        Assert.assertEquals(sbfont.getWidths().length, 28);
-        Assert.assertEquals(sbfont.getFirstChar(), 87);
-        Assert.assertEquals(sbfont.getLastChar(), 114);
-
-        PDDocument doc2 = PDDocument.load(new File(CFF2));
-        String name = sbfont.addFont(getFont(doc2, "R11"));
-        Assert.assertTrue(name.contains("MyriadPro"));
-
-        Assert.assertEquals(sbfont.getFontName(), "MyriadPro-Regular_Type1f0encstdcs");
-        Assert.assertEquals(sbfont.getEncodingName(), "WinAnsiEncoding");
-        Assert.assertEquals(sbfont.mapChar('W'), 'W');
-        String x = IOUtils.toString(sbfont.getInputStream());
-        Assert.assertTrue(x, x.contains("Adobe Systems"));
-        Assert.assertEquals(sbfont.getEncoding().getName(), "FOPPDFEncoding");
-        Assert.assertTrue(Arrays.asList(sbfont.getEncoding().getCharNameMap()).contains("A"));
-        Assert.assertEquals(sbfont.getWidths().length, 65);
-        Assert.assertEquals(sbfont.getFirstChar(), 50);
-        Assert.assertEquals(sbfont.getLastChar(), 114);
-
-        Assert.assertEquals(sbfont.addFont(getFont(doc2, "R13")), null);
-
-        doc.close();
-        doc2.close();
-    }
-
-    @Test
-    public void testCFF2() throws Exception {
-        PDDocument doc = PDDocument.load(new File(CFF3));
-        FOPPDFSingleByteFont sbfont = new FOPPDFSingleByteFont(getFont(doc, "T1_0"),
-                "Myriad_Pro_Type1f0encf1cs");
-        Assert.assertTrue(Arrays.asList(sbfont.getEncoding().getCharNameMap()).contains("uni004E"));
-        Assert.assertEquals(sbfont.getFontName(), "Myriad_Pro_Type1f0encf1cs");
-        Assert.assertEquals(sbfont.getEncodingName(), null);
-        byte[] is = IOUtils.toByteArray(sbfont.getInputStream());
-
-        CFFParser p = new CFFParser();
-        CFFFont ff = p.parse(is).get(0);
-        Assert.assertEquals(ff.getName(), "MNEACN+Myriad_Pro");
-//        Assert.assertEquals(ff.getCharset().getEntries().get(0).getSID(), 391);
-
-        doc.close();
-    }
-
-    @Test
-    public void testTTCID() throws Exception {
-        PDDocument doc = PDDocument.load(new File(TTCID1));
-        FOPPDFMultiByteFont mbfont = new FOPPDFMultiByteFont(getFont(doc, "C2_0"),
-                "ArialMT_Type0");
-        mbfont.addFont(getFont(doc, "C2_0"));
-        Assert.assertEquals(mbfont.mapChar('t'), 67);
-
-        PDDocument doc2 = PDDocument.load(new File(TTCID2));
-        String name = mbfont.addFont(getFont(doc2, "C2_0"));
-        Assert.assertEquals(name, "ArialMT_Type0");
-        Assert.assertEquals(mbfont.getFontName(), "ArialMT_Type0");
-        byte[] is = IOUtils.toByteArray(mbfont.getInputStream());
-        Assert.assertEquals(is.length, 38640);
-        doc.close();
-        doc2.close();
-    }
-
-    @Test
-    public void testTTSubset() throws Exception {
-        PDDocument doc = PDDocument.load(new File(TTSubset1));
-        FOPPDFSingleByteFont mbfont = new FOPPDFSingleByteFont(getFont(doc, "R9"),
-                "TimesNewRomanPSMT_TrueType");
-        mbfont.addFont(getFont(doc, "R9"));
-//        Assert.assertEquals(mbfont.mapChar('t'), 116);
-
-        PDDocument doc2 = PDDocument.load(new File(TTSubset2));
-        String name = mbfont.addFont(getFont(doc2, "R9"));
-        Assert.assertEquals(name, "TimesNewRomanPSMT_TrueType");
-        Assert.assertEquals(mbfont.getFontName(), "TimesNewRomanPSMT_TrueType");
-        byte[] is = IOUtils.toByteArray(mbfont.getInputStream());
-        Assert.assertEquals(is.length, 41112);
-        doc.close();
-        doc2.close();
-    }
-
-    @Test
-    public void testType1Subset() throws Exception {
-        PDDocument doc = PDDocument.load(new File(Type1Subset1));
-        FOPPDFSingleByteFont mbfont = new FOPPDFSingleByteFont(getFont(doc, "F15"), "");
-        mbfont.addFont(getFont(doc, "F15"));
-        PDDocument doc2 = PDDocument.load(new File(Type1Subset2));
-        mbfont.addFont(getFont(doc2, "F15"));
-        Type1Font f = Type1Font.createWithPFB(mbfont.getInputStream());
-        Set<String> csDict = new TreeSet<String>(f.getCharStringsDict().keySet());
-        Assert.assertEquals(csDict.toString(), "[.notdef, a, d, e, hyphen, l, m, n, p, s, space, t, two, x]");
-        Assert.assertEquals(f.getSubrsArray().size(), 518);
-        Assert.assertEquals(f.getFamilyName(), "Verdana");
-        doc.close();
-        doc2.close();
-    }
-
     @Test
     public void testStream() throws Exception {
         PDFDocument pdfdoc = new PDFDocument("");
