Index: test/java/org/apache/fop/fonts/truetype/GlyfTableTestCase.java
===================================================================
--- test/java/org/apache/fop/fonts/truetype/GlyfTableTestCase.java	(revision 1207292)
+++ test/java/org/apache/fop/fonts/truetype/GlyfTableTestCase.java	(working copy)
@@ -20,6 +20,7 @@
 package org.apache.fop.fonts.truetype;
 
 import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
 
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
@@ -31,6 +32,8 @@
 import org.junit.Before;
 import org.junit.Test;
 
+import org.apache.fop.fonts.FontEventListener;
+
 /**
  * Tests {@link GlyfTable}.
  */
@@ -140,7 +143,8 @@
     }
 
     private void setupSubsetReader(Map<Integer, Integer> glyphs) throws IOException {
-        TTFSubSetFile fontFile = new TTFSubSetFile();
+        FontEventListener listener = mock(FontEventListener.class);
+        TTFSubSetFile fontFile = new TTFSubSetFile(listener);
         byte[] subsetFont = fontFile.readFont(originalFontReader, "Deja", glyphs);
         InputStream intputStream = new ByteArrayInputStream(subsetFont);
         subsetReader = new FontFileReader(intputStream);
Index: test/java/org/apache/fop/fonts/truetype/TTFFontLoaderTestCase.java
===================================================================
--- test/java/org/apache/fop/fonts/truetype/TTFFontLoaderTestCase.java	(revision 1207292)
+++ test/java/org/apache/fop/fonts/truetype/TTFFontLoaderTestCase.java	(working copy)
@@ -1,57 +1,60 @@
-/*
- * 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.
- */
-
-/* $Id$ */
-
-package org.apache.fop.fonts.truetype;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import java.io.File;
-import java.io.IOException;
-
-import org.junit.Test;
-
-import org.apache.fop.fonts.EncodingMode;
-import org.apache.fop.fonts.FontManager;
-import org.apache.fop.fonts.FontResolver;
-
-/**
- * Test case for {@link TTFFontLoader}.
- */
-public class TTFFontLoaderTestCase {
-
-    @Test
-    public void testUseKerning() throws IOException {
-        File file = new File("test/resources/fonts/ttf/DejaVuLGCSerif.ttf");
-        String absoluteFilePath = file.toURL().toExternalForm();
-        FontResolver resolver = FontManager.createMinimalFontResolver();
-        String fontName = "Deja Vu";
-        boolean embedded = false;
-        boolean useKerning = true;
-
-        TTFFontLoader fontLoader = new TTFFontLoader(absoluteFilePath, fontName, embedded,
-                EncodingMode.AUTO, useKerning, resolver);
-        assertTrue(fontLoader.getFont().hasKerningInfo());
-        useKerning = false;
-
-        fontLoader = new TTFFontLoader(absoluteFilePath, fontName, embedded, EncodingMode.AUTO,
-                useKerning, resolver);
-        assertFalse(fontLoader.getFont().hasKerningInfo());
-    }
-}
+/*
+ * 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.
+ */
+
+/* $Id$ */
+
+package org.apache.fop.fonts.truetype;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.junit.Test;
+
+import org.apache.fop.fonts.EncodingMode;
+import org.apache.fop.fonts.FontEventListener;
+import org.apache.fop.fonts.FontManager;
+import org.apache.fop.fonts.FontResolver;
+
+/**
+ * Test case for {@link TTFFontLoader}.
+ */
+public class TTFFontLoaderTestCase {
+
+    @Test
+    public void testUseKerning() throws IOException {
+        File file = new File("test/resources/fonts/ttf/DejaVuLGCSerif.ttf");
+        String absoluteFilePath = file.toURL().toExternalForm();
+        FontResolver resolver = FontManager.createMinimalFontResolver();
+        String fontName = "Deja Vu";
+        boolean embedded = false;
+        boolean useKerning = true;
+
+        FontEventListener listener = mock(FontEventListener.class);
+        TTFFontLoader fontLoader = new TTFFontLoader(absoluteFilePath, fontName, embedded,
+                EncodingMode.AUTO, useKerning, resolver, listener);
+        assertTrue(fontLoader.getFont().hasKerningInfo());
+        useKerning = false;
+
+        fontLoader = new TTFFontLoader(absoluteFilePath, fontName, embedded, EncodingMode.AUTO,
+                useKerning, resolver, listener);
+        assertFalse(fontLoader.getFont().hasKerningInfo());
+    }
+}
Index: test/java/org/apache/fop/fonts/FontEventProcessingTestCase.java
===================================================================
--- test/java/org/apache/fop/fonts/FontEventProcessingTestCase.java	(revision 1207292)
+++ test/java/org/apache/fop/fonts/FontEventProcessingTestCase.java	(working copy)
@@ -30,6 +30,7 @@
 import org.apache.xmlgraphics.util.MimeConstants;
 
 import org.apache.fop.apps.FOPException;
+import org.apache.fop.events.EventChecker;
 import org.apache.fop.events.EventProcessingTestCase;
 
 /**
@@ -57,4 +58,19 @@
                 MimeConstants.MIME_PDF);
     }
 
+    @Test
+    public void testFontWithoutUnicodeCmap() throws FOPException, TransformerException,
+            IOException, SAXException {
+        EventChecker eventChecker = new EventChecker(FontEventProducer.class.getName()
+                + ".unicodeCmapNotFound");
+        try {
+            InputStream inStream = getClass().getResourceAsStream("substituted-font.fo");
+            eventsTests.doTest(inStream, CONFIG_BASE_DIR + "font_without_unicode_cmap.xconf",
+                    eventChecker, MimeConstants.MIME_PDF);
+        } catch (RuntimeException e) {
+            // Expected
+        }
+        eventChecker.end();
+    }
+
 }
Index: test/java/org/apache/fop/fonts/DejaVuLGCSerifTestCase.java
===================================================================
--- test/java/org/apache/fop/fonts/DejaVuLGCSerifTestCase.java	(revision 1207292)
+++ test/java/org/apache/fop/fonts/DejaVuLGCSerifTestCase.java	(working copy)
@@ -20,6 +20,7 @@
 package org.apache.fop.fonts;
 
 import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.mock;
 
 import java.io.File;
 
@@ -43,7 +44,8 @@
     @Before
     public void setUp() throws Exception {
         File file = new File("test/resources/fonts/ttf/DejaVuLGCSerif.ttf");
-        font = FontLoader.loadFont(file, "", true, EncodingMode.AUTO, fontResolver);
+        FontEventListener listener = mock(FontEventListener.class);
+        font = FontLoader.loadFont(file, "", true, EncodingMode.AUTO, fontResolver, listener);
     }
 
     /**
Index: test/java/org/apache/fop/layoutengine/LayoutEngineTestCase.java
===================================================================
--- test/java/org/apache/fop/layoutengine/LayoutEngineTestCase.java	(revision 1207292)
+++ test/java/org/apache/fop/layoutengine/LayoutEngineTestCase.java	(working copy)
@@ -54,6 +54,8 @@
 import org.apache.fop.area.AreaTreeParser;
 import org.apache.fop.area.RenderPagesModel;
 import org.apache.fop.events.model.EventSeverity;
+import org.apache.fop.fonts.FontEventAdapter;
+import org.apache.fop.fonts.FontEventListener;
 import org.apache.fop.fonts.FontInfo;
 import org.apache.fop.intermediate.IFTester;
 import org.apache.fop.intermediate.TestAssistant;
@@ -218,7 +220,8 @@
             ifRenderer.setDocumentHandler(serializer);
 
             ua.setRendererOverride(ifRenderer);
-            FontInfo fontInfo = new FontInfo();
+            FontEventListener eventListener = new FontEventAdapter(ua.getEventBroadcaster());
+            FontInfo fontInfo = new FontInfo(eventListener);
             //Construct the AreaTreeModel that will received the individual pages
             final AreaTreeModel treeModel = new RenderPagesModel(ua,
                     null, fontInfo, null);
Index: test/java/org/apache/fop/events/EventChecker.java
===================================================================
--- test/java/org/apache/fop/events/EventChecker.java	(revision 1207292)
+++ test/java/org/apache/fop/events/EventChecker.java	(working copy)
@@ -24,13 +24,13 @@
 /**
  * Class that checks that an expected event is produced, and only this one.
  */
-class EventChecker implements EventListener {
+public class EventChecker implements EventListener {
 
     private final String expectedEventID;
 
     private boolean eventReceived;
 
-    EventChecker(String expectedEventID) {
+    public EventChecker(String expectedEventID) {
         this.expectedEventID = expectedEventID;
     }
 
@@ -42,7 +42,7 @@
         }
     }
 
-    void end() {
+    public void end() {
         if (!eventReceived) {
             fail("Did not received expected event: " + expectedEventID);
         }
Index: test/java/org/apache/fop/events/EventProcessingTestCase.java
===================================================================
--- test/java/org/apache/fop/events/EventProcessingTestCase.java	(revision 1207292)
+++ test/java/org/apache/fop/events/EventProcessingTestCase.java	(working copy)
@@ -66,6 +66,12 @@
     public void doTest(InputStream inStream, String fopConf, String expectedEventID, String mimeType)
             throws FOPException, TransformerException, IOException, SAXException {
         EventChecker eventChecker = new EventChecker(expectedEventID);
+        doTest(inStream, fopConf, eventChecker, mimeType);
+        eventChecker.end();
+    }
+
+    public void doTest(InputStream inStream, String fopConf, EventChecker eventChecker,
+            String mimeType) throws FOPException, TransformerException, IOException, SAXException {
         if (fopConf != null) {
             fopFactory.setUserConfig(fopConf);
         }
@@ -76,7 +82,6 @@
         Source src = new StreamSource(inStream);
         Result res = new SAXResult(fop.getDefaultHandler());
         transformer.transform(src, res);
-        eventChecker.end();
     }
 
     public void doTest(String filename, String expectedEventID) throws
Index: test/java/org/apache/fop/intermediate/AreaTreeParserTestCase.java
===================================================================
--- test/java/org/apache/fop/intermediate/AreaTreeParserTestCase.java	(revision 1207292)
+++ test/java/org/apache/fop/intermediate/AreaTreeParserTestCase.java	(working copy)
@@ -39,6 +39,7 @@
 import org.apache.fop.area.AreaTreeModel;
 import org.apache.fop.area.AreaTreeParser;
 import org.apache.fop.area.RenderPagesModel;
+import org.apache.fop.fonts.FontEventAdapter;
 import org.apache.fop.fonts.FontInfo;
 import org.apache.fop.layoutengine.LayoutEngineTestUtils;
 import org.apache.fop.render.Renderer;
@@ -116,7 +117,7 @@
         AreaTreeParser parser = new AreaTreeParser();
 
         FOUserAgent userAgent = createUserAgent();
-        FontInfo fontInfo = new FontInfo();
+        FontInfo fontInfo = new FontInfo(new FontEventAdapter(userAgent.getEventBroadcaster()));
         AreaTreeModel treeModel = new RenderPagesModel(userAgent,
                 getTargetMIME(), fontInfo, out);
         parser.parse(src, treeModel, userAgent);
@@ -138,7 +139,7 @@
         userAgent.setRendererOverride(renderer);
         renderer.setUserAgent(userAgent);
 
-        FontInfo fontInfo = new FontInfo();
+        FontInfo fontInfo = new FontInfo(new FontEventAdapter(userAgent.getEventBroadcaster()));
         AreaTreeModel treeModel = new RenderPagesModel(userAgent,
                 MimeConstants.MIME_FOP_AREA_TREE, fontInfo, null);
         parser.parse(src, treeModel, userAgent);
Index: test/java/org/apache/fop/intermediate/IFParserTestCase.java
===================================================================
--- test/java/org/apache/fop/intermediate/IFParserTestCase.java	(revision 1207292)
+++ test/java/org/apache/fop/intermediate/IFParserTestCase.java	(working copy)
@@ -35,6 +35,7 @@
 import org.w3c.dom.Document;
 
 import org.apache.fop.apps.FOUserAgent;
+import org.apache.fop.fonts.FontEventAdapter;
 import org.apache.fop.fonts.FontInfo;
 import org.apache.fop.layoutengine.LayoutEngineTestUtils;
 import org.apache.fop.render.intermediate.IFContext;
@@ -78,7 +79,8 @@
         IFDocumentHandler documentHandler = userAgent.getRendererFactory().createDocumentHandler(
                 userAgent, getTargetMIME());
         documentHandler.setResult(new StreamResult(out));
-        documentHandler.setDefaultFontInfo(new FontInfo());
+        FontInfo fontInfo = new FontInfo(new FontEventAdapter(userAgent.getEventBroadcaster()));
+        documentHandler.setDefaultFontInfo(fontInfo);
         parser.parse(src, documentHandler, userAgent);
     }
 
Index: test/java/org/apache/fop/config/FontsSubstitutionTestCase.java
===================================================================
--- test/java/org/apache/fop/config/FontsSubstitutionTestCase.java	(revision 1207292)
+++ test/java/org/apache/fop/config/FontsSubstitutionTestCase.java	(working copy)
@@ -26,6 +26,8 @@
 import org.apache.fop.fonts.CustomFontCollection;
 import org.apache.fop.fonts.Font;
 import org.apache.fop.fonts.FontCollection;
+import org.apache.fop.fonts.FontEventAdapter;
+import org.apache.fop.fonts.FontEventListener;
 import org.apache.fop.fonts.FontInfo;
 import org.apache.fop.fonts.FontManager;
 import org.apache.fop.fonts.FontTriplet;
@@ -43,12 +45,13 @@
             throws Exception {
         PrintRenderer renderer = (PrintRenderer) ua.getRendererFactory()
                 .createRenderer(ua, MimeConstants.MIME_PDF);
-        FontInfo fontInfo = new FontInfo();
+        FontEventListener eventListener = new FontEventAdapter(ua.getEventBroadcaster());
+        FontInfo fontInfo = new FontInfo(eventListener);
         renderer.setupFontInfo(fontInfo);
         FontManager fontManager = ua.getFactory().getFontManager();
         FontCollection[] fontCollections = new FontCollection[] {
                 new Base14FontCollection(fontManager.isBase14KerningEnabled()),
-                new CustomFontCollection(renderer.getFontResolver(), renderer.getFontList())
+                new CustomFontCollection(renderer.getFontResolver(), renderer.getFontList(), eventListener)
         };
         fontManager.setup(fontInfo, fontCollections);
         FontTriplet triplet = new FontTriplet("Times", "italic",
Index: test/java/org/apache/fop/pdf/PDFFactoryTestCase.java
===================================================================
--- test/java/org/apache/fop/pdf/PDFFactoryTestCase.java	(revision 1207292)
+++ test/java/org/apache/fop/pdf/PDFFactoryTestCase.java	(working copy)
@@ -20,10 +20,13 @@
 package org.apache.fop.pdf;
 
 import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.mock;
 
+import org.junit.Test;
+
 import org.apache.fop.fonts.CIDSubset;
+import org.apache.fop.fonts.FontEventListener;
 import org.apache.fop.fonts.MultiByteFont;
-import org.junit.Test;
 
 /**
  * Test case for {@link PDFFactory}.
@@ -51,10 +54,11 @@
         PDFFactory pdfFactory = new PDFFactory(doc);
         MockedFont font = new MockedFont();
 
-        PDFFont pdfDejaVu = pdfFactory.makeFont("DejaVu", "DejaVu", "TTF", font, font);
+        FontEventListener listener = mock(FontEventListener.class);
+        PDFFont pdfDejaVu = pdfFactory.makeFont("DejaVu", "DejaVu", "TTF", font, font, listener);
         assertEquals("/EAAAAA+DejaVu", pdfDejaVu.getBaseFont().toString());
 
-        PDFFont pdfArial = pdfFactory.makeFont("Arial", "Arial", "TTF", font, font);
+        PDFFont pdfArial = pdfFactory.makeFont("Arial", "Arial", "TTF", font, font, listener);
         assertEquals("/EAAAAB+Arial", pdfArial.getBaseFont().toString());
     }
 }
Index: test/config/font_without_unicode_cmap.xconf
===================================================================
--- test/config/font_without_unicode_cmap.xconf	(revision 0)
+++ test/config/font_without_unicode_cmap.xconf	(revision 0)
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<fop version="1.0">
+  <strict-configuration>true</strict-configuration>
+  <base>./</base>
+  <font-base>./</font-base>
+  <renderers>
+    <renderer mime="application/pdf">
+      <fonts>
+        <font embed-url="test/resources/fonts/ttf/no_unicode_cmap.ttf">
+          <font-triplet name="blah" style="normal" weight="normal"/>
+        </font>
+      </fonts>
+    </renderer>
+  </renderers>
+</fop>

Property changes on: test/config/font_without_unicode_cmap.xconf
___________________________________________________________________
Added: svn:eol-style
   + native

Index: test/resources/fonts/ttf/no_unicode_cmap.ttf
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: test/resources/fonts/ttf/no_unicode_cmap.ttf
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: src/java/org/apache/fop/render/PrintRendererConfigurator.java
===================================================================
--- src/java/org/apache/fop/render/PrintRendererConfigurator.java	(revision 1207292)
+++ src/java/org/apache/fop/render/PrintRendererConfigurator.java	(working copy)
@@ -128,7 +128,7 @@
             FontEventListener listener = new FontEventAdapter(
                     userAgent.getEventBroadcaster());
             List<EmbedFontInfo> fontList = buildFontList(cfg, fontResolver, listener);
-            fontCollections.add(new CustomFontCollection(fontResolver, fontList));
+            fontCollections.add(new CustomFontCollection(fontResolver, fontList, listener));
         }
 
         fontManager.setup(fontInfo,
Index: src/java/org/apache/fop/render/PrintRenderer.java
===================================================================
--- src/java/org/apache/fop/render/PrintRenderer.java	(revision 1207292)
+++ src/java/org/apache/fop/render/PrintRenderer.java	(working copy)
@@ -83,7 +83,8 @@
         FontManager fontManager = userAgent.getFactory().getFontManager();
         FontCollection[] fontCollections = new FontCollection[] {
                 new Base14FontCollection(fontManager.isBase14KerningEnabled()),
-                new CustomFontCollection(getFontResolver(), getFontList())
+                new CustomFontCollection(getFontResolver(), getFontList(),
+                        fontInfo.getEventListener())
         };
         fontManager.setup(getFontInfo(), fontCollections);
     }
Index: src/java/org/apache/fop/render/intermediate/AbstractBinaryWritingIFDocumentHandler.java
===================================================================
--- src/java/org/apache/fop/render/intermediate/AbstractBinaryWritingIFDocumentHandler.java	(revision 1207292)
+++ src/java/org/apache/fop/render/intermediate/AbstractBinaryWritingIFDocumentHandler.java	(working copy)
@@ -32,6 +32,7 @@
 
 import org.apache.fop.fonts.FontCollection;
 import org.apache.fop.fonts.FontEventAdapter;
+import org.apache.fop.fonts.FontEventListener;
 import org.apache.fop.fonts.FontInfo;
 import org.apache.fop.fonts.FontManager;
 import org.apache.fop.fonts.base14.Base14FontCollection;
@@ -100,8 +101,9 @@
                 new Base14FontCollection(fontManager.isBase14KerningEnabled())
         };
 
-        FontInfo fi = (fontInfo != null ? fontInfo : new FontInfo());
-        fi.setEventListener(new FontEventAdapter(getUserAgent().getEventBroadcaster()));
+        FontEventListener eventListener = new FontEventAdapter(getUserAgent().getEventBroadcaster());
+        FontInfo fi = (fontInfo != null ? fontInfo : new FontInfo(eventListener));
+
         fontManager.setup(fi, fontCollections);
         setFontInfo(fi);
     }
Index: src/java/org/apache/fop/render/intermediate/IFUtil.java
===================================================================
--- src/java/org/apache/fop/render/intermediate/IFUtil.java	(revision 1207292)
+++ src/java/org/apache/fop/render/intermediate/IFUtil.java	(working copy)
@@ -24,6 +24,9 @@
 
 import org.apache.fop.apps.FOPException;
 import org.apache.fop.apps.FopFactory;
+import org.apache.fop.events.DefaultEventBroadcaster;
+import org.apache.fop.fonts.FontEventAdapter;
+import org.apache.fop.fonts.FontEventListener;
 import org.apache.fop.fonts.FontInfo;
 import org.apache.fop.util.DecimalFormatCache;
 
@@ -154,7 +157,8 @@
     public static void setupFonts(IFDocumentHandler documentHandler, FontInfo fontInfo)
                 throws FOPException {
         if (fontInfo == null) {
-            fontInfo = new FontInfo();
+            FontEventListener eventListener = new FontEventAdapter(new DefaultEventBroadcaster());
+            fontInfo = new FontInfo(eventListener);
         }
         if (documentHandler instanceof IFSerializer) {
             IFSerializer serializer = (IFSerializer)documentHandler;
Index: src/java/org/apache/fop/render/bitmap/BitmapRendererConfigurator.java
===================================================================
--- src/java/org/apache/fop/render/bitmap/BitmapRendererConfigurator.java	(revision 1207292)
+++ src/java/org/apache/fop/render/bitmap/BitmapRendererConfigurator.java	(working copy)
@@ -19,7 +19,6 @@
 
 package org.apache.fop.render.bitmap;
 
-import java.awt.Graphics2D;
 import java.awt.image.BufferedImage;
 import java.util.List;
 
@@ -129,7 +128,7 @@
             FontEventListener listener = new FontEventAdapter(
                     userAgent.getEventBroadcaster());
             List fontList = buildFontList(cfg, fontResolver, listener);
-            fontCollections.add(new ConfiguredFontCollection(fontResolver, fontList));
+            fontCollections.add(new ConfiguredFontCollection(fontResolver, fontList, listener));
         }
 
         fontManager.setup(fontInfo,
Index: src/java/org/apache/fop/render/pcl/PCLRendererConfigurator.java
===================================================================
--- src/java/org/apache/fop/render/pcl/PCLRendererConfigurator.java	(revision 1207292)
+++ src/java/org/apache/fop/render/pcl/PCLRendererConfigurator.java	(working copy)
@@ -19,7 +19,6 @@
 
 package org.apache.fop.render.pcl;
 
-import java.awt.Graphics2D;
 import java.util.List;
 
 import org.apache.avalon.framework.configuration.Configuration;
@@ -119,7 +118,7 @@
             FontEventListener listener = new FontEventAdapter(
                     userAgent.getEventBroadcaster());
             List fontList = buildFontList(cfg, fontResolver, listener);
-            fontCollections.add(new ConfiguredFontCollection(fontResolver, fontList));
+            fontCollections.add(new ConfiguredFontCollection(fontResolver, fontList, listener));
         }
 
         fontManager.setup(fontInfo,
Index: src/java/org/apache/fop/render/ps/NativeTextHandler.java
===================================================================
--- src/java/org/apache/fop/render/ps/NativeTextHandler.java	(revision 1207292)
+++ src/java/org/apache/fop/render/ps/NativeTextHandler.java	(working copy)
@@ -28,7 +28,10 @@
 import org.apache.xmlgraphics.java2d.ps.PSTextHandler;
 import org.apache.xmlgraphics.ps.PSGenerator;
 
+import org.apache.fop.events.DefaultEventBroadcaster;
 import org.apache.fop.fonts.Font;
+import org.apache.fop.fonts.FontEventAdapter;
+import org.apache.fop.fonts.FontEventListener;
 import org.apache.fop.fonts.FontInfo;
 import org.apache.fop.fonts.FontSetup;
 import org.apache.fop.fonts.FontTriplet;
@@ -72,7 +75,8 @@
 
     private void setupFontInfo() {
         //Sets up a FontInfo with default fonts
-        fontInfo = new FontInfo();
+        FontEventListener eventListener = new FontEventAdapter(new DefaultEventBroadcaster());
+        fontInfo = new FontInfo(eventListener);
         FontSetup.setup(fontInfo);
     }
 
Index: src/java/org/apache/fop/render/afp/AFPDocumentHandler.java
===================================================================
--- src/java/org/apache/fop/render/afp/AFPDocumentHandler.java	(revision 1207292)
+++ src/java/org/apache/fop/render/afp/AFPDocumentHandler.java	(working copy)
@@ -43,6 +43,7 @@
 import org.apache.fop.apps.MimeConstants;
 import org.apache.fop.fonts.FontCollection;
 import org.apache.fop.fonts.FontEventAdapter;
+import org.apache.fop.fonts.FontEventListener;
 import org.apache.fop.fonts.FontInfo;
 import org.apache.fop.fonts.FontManager;
 import org.apache.fop.render.afp.extensions.AFPElementMapping;
@@ -128,8 +129,8 @@
             new AFPFontCollection(getUserAgent().getEventBroadcaster(), null)
         };
 
-        FontInfo fi = (fontInfo != null ? fontInfo : new FontInfo());
-        fi.setEventListener(new FontEventAdapter(getUserAgent().getEventBroadcaster()));
+        FontEventListener eventListener = new FontEventAdapter(getUserAgent().getEventBroadcaster());
+        FontInfo fi = (fontInfo != null ? fontInfo : new FontInfo(eventListener));
         fontManager.setup(fi, fontCollections);
         setFontInfo(fi);
     }
Index: src/java/org/apache/fop/render/java2d/Java2DUtil.java
===================================================================
--- src/java/org/apache/fop/render/java2d/Java2DUtil.java	(revision 1207292)
+++ src/java/org/apache/fop/render/java2d/Java2DUtil.java	(working copy)
@@ -19,11 +19,10 @@
 
 package org.apache.fop.render.java2d;
 
-import java.awt.Graphics2D;
-
 import org.apache.fop.apps.FOUserAgent;
 import org.apache.fop.fonts.FontCollection;
 import org.apache.fop.fonts.FontEventAdapter;
+import org.apache.fop.fonts.FontEventListener;
 import org.apache.fop.fonts.FontInfo;
 import org.apache.fop.fonts.FontManager;
 
@@ -52,8 +51,9 @@
                 new InstalledFontCollection(java2DFontMetrics)
         };
 
-        FontInfo fi = (fontInfo != null ? fontInfo : new FontInfo());
-        fi.setEventListener(new FontEventAdapter(userAgent.getEventBroadcaster()));
+        FontEventListener eventListener = new FontEventAdapter(userAgent.getEventBroadcaster());
+        FontInfo fi = (fontInfo != null ? fontInfo : new FontInfo(eventListener));
+
         fontManager.setup(fi, fontCollections);
         return fi;
     }
Index: src/java/org/apache/fop/render/java2d/ConfiguredFontCollection.java
===================================================================
--- src/java/org/apache/fop/render/java2d/ConfiguredFontCollection.java	(revision 1207292)
+++ src/java/org/apache/fop/render/java2d/ConfiguredFontCollection.java	(working copy)
@@ -30,6 +30,7 @@
 import org.apache.fop.fonts.EmbedFontInfo;
 import org.apache.fop.fonts.EncodingMode;
 import org.apache.fop.fonts.FontCollection;
+import org.apache.fop.fonts.FontEventListener;
 import org.apache.fop.fonts.FontInfo;
 import org.apache.fop.fonts.FontLoader;
 import org.apache.fop.fonts.FontManager;
@@ -46,20 +47,23 @@
 
     private FontResolver fontResolver;
     private List/*<EmbedFontInfo>*/ embedFontInfoList;
+    private final FontEventListener eventListener;
 
     /**
      * Main constructor
      * @param fontResolver a font resolver
      * @param customFonts the list of custom fonts
+     * @param eventListener for handling font related events
      */
     public ConfiguredFontCollection(FontResolver fontResolver,
-            List/*<EmbedFontInfo>*/ customFonts) {
+            List/*<EmbedFontInfo>*/customFonts, FontEventListener eventListener) {
         this.fontResolver = fontResolver;
         if (this.fontResolver == null) {
             //Ensure that we have minimal font resolution capabilities
             this.fontResolver = FontManager.createMinimalFontResolver();
         }
         this.embedFontInfoList = customFonts;
+        this.eventListener = eventListener;
     }
 
     /** {@inheritDoc} */
@@ -83,13 +87,13 @@
                 // If the user specified an XML-based metrics file, we'll use it
                 // Otherwise, calculate metrics directly from the font file.
                 if (metricsUrl != null) {
-                    LazyFont fontMetrics = new LazyFont(configFontInfo, fontResolver);
+                    LazyFont fontMetrics = new LazyFont(configFontInfo, fontResolver, eventListener);
                     Source fontSource = fontResolver.resolve(configFontInfo.getEmbedFile());
                     font = new CustomFontMetricsMapper(fontMetrics, fontSource);
                 } else {
-                    CustomFont fontMetrics = FontLoader.loadFont(
-                            fontFile, null, true, EncodingMode.AUTO,
-                            configFontInfo.getKerning(), fontResolver);
+                    CustomFont fontMetrics = FontLoader.loadFont(fontFile, null, true,
+                            EncodingMode.AUTO, configFontInfo.getKerning(), fontResolver,
+                            eventListener);
                     font = new CustomFontMetricsMapper(fontMetrics);
                 }
 
Index: src/java/org/apache/fop/render/java2d/Java2DRenderer.java
===================================================================
--- src/java/org/apache/fop/render/java2d/Java2DRenderer.java	(revision 1207292)
+++ src/java/org/apache/fop/render/java2d/Java2DRenderer.java	(working copy)
@@ -72,6 +72,8 @@
 import org.apache.fop.fo.Constants;
 import org.apache.fop.fonts.Font;
 import org.apache.fop.fonts.FontCollection;
+import org.apache.fop.fonts.FontEventAdapter;
+import org.apache.fop.fonts.FontEventListener;
 import org.apache.fop.fonts.FontInfo;
 import org.apache.fop.fonts.Typeface;
 import org.apache.fop.render.AbstractPathOrientedRenderer;
@@ -173,10 +175,12 @@
         this.fontInfo = inFontInfo;
         final Java2DFontMetrics java2DFontMetrics = new Java2DFontMetrics();
 
+        FontEventListener eventListener = new FontEventAdapter(userAgent.getEventBroadcaster());
+
         FontCollection[] fontCollections = new FontCollection[] {
                 new Base14FontCollection(java2DFontMetrics),
                 new InstalledFontCollection(java2DFontMetrics),
-                new ConfiguredFontCollection(getFontResolver(), getFontList())
+                new ConfiguredFontCollection(getFontResolver(), getFontList(), eventListener)
         };
         userAgent.getFactory().getFontManager().setup(
                 getFontInfo(), fontCollections);
Index: src/java/org/apache/fop/fonts/FontEventAdapter.java
===================================================================
--- src/java/org/apache/fop/fonts/FontEventAdapter.java	(revision 1207292)
+++ src/java/org/apache/fop/fonts/FontEventAdapter.java	(working copy)
@@ -66,4 +66,9 @@
         getEventProducer().fontDirectoryNotFound(source, dir);
     }
 
+    /** {@inheritDoc} */
+    public void unicodeCmapNotFound(Object source, String name) {
+        getEventProducer().unicodeCmapNotFound(source, name);
+    }
+
 }
Index: src/java/org/apache/fop/fonts/FontEventProducer.java
===================================================================
--- src/java/org/apache/fop/fonts/FontEventProducer.java	(revision 1207292)
+++ src/java/org/apache/fop/fonts/FontEventProducer.java	(working copy)
@@ -73,10 +73,17 @@
 
     /**
      * An error occurred trying to find the font directory specified in the config file.
-     * @param source the event sourece
+     * @param source the event source
      * @param dir the directory in the config file
      * @event.severity WARN
      */
     void fontDirectoryNotFound(Object source, String dir);
 
+    /**
+     * The font provided does not have a Unicode cmap table.
+     * @param source the event source
+     * @param name the name of the font
+     * @event.severity ERROR
+     */
+    void unicodeCmapNotFound(Object source, String name);
 }
Index: src/java/org/apache/fop/fonts/FontEventListener.java
===================================================================
--- src/java/org/apache/fop/fonts/FontEventListener.java	(revision 1207292)
+++ src/java/org/apache/fop/fonts/FontEventListener.java	(working copy)
@@ -54,4 +54,11 @@
      * @param dir the directory in the config file
      */
     void fontDirectoryNotFound(Object source, String dir);
+
+    /**
+     * The font provided does not have a Unicode cmap table.
+     * @param source the event source
+     * @param name the font name
+     */
+    void unicodeCmapNotFound(Object source, String name);
 }
Index: src/java/org/apache/fop/fonts/apps/TTFReader.java
===================================================================
--- src/java/org/apache/fop/fonts/apps/TTFReader.java	(revision 1207292)
+++ src/java/org/apache/fop/fonts/apps/TTFReader.java	(working copy)
@@ -26,17 +26,22 @@
 
 import javax.xml.parsers.DocumentBuilderFactory;
 
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
 import org.apache.commons.logging.LogFactory;
+
 import org.apache.fop.Version;
+import org.apache.fop.events.DefaultEventBroadcaster;
+import org.apache.fop.fonts.FontEventAdapter;
+import org.apache.fop.fonts.FontEventListener;
 import org.apache.fop.fonts.FontUtil;
 import org.apache.fop.fonts.truetype.FontFileReader;
 import org.apache.fop.fonts.truetype.TTFCmapEntry;
 import org.apache.fop.fonts.truetype.TTFFile;
 import org.apache.fop.util.CommandLineLogger;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.xml.sax.Attributes;
-import org.xml.sax.SAXException;
 
 /**
  * A tool which reads TTF files and generates
@@ -161,7 +166,8 @@
         } else {
             try {
                 log.info("Parsing font...");
-                TTFFile ttf = app.loadTTF(arguments[0], ttcName);
+                FontEventListener eventListener = new FontEventAdapter(new DefaultEventBroadcaster());
+                TTFFile ttf = app.loadTTF(arguments[0], ttcName, eventListener);
                 if (ttf != null) {
                     org.w3c.dom.Document doc = app.constructFontXML(ttf,
                             fontName, className, embResource, embFile, isCid,
@@ -196,13 +202,15 @@
     /**
      * Read a TTF file and returns it as an object.
      *
-     * @param  fileName The filename of the TTF file.
-     * @param  fontName The name of the font
+     * @param fileName The filename of the TTF file.
+     * @param fontName The name of the font
+     * @param eventListener for handling font related events
      * @return The TTF as an object, null if the font is incompatible.
      * @throws IOException In case of an I/O problem
      */
-    public TTFFile loadTTF(String fileName, String fontName) throws IOException {
-        TTFFile ttfFile = new TTFFile();
+    public TTFFile loadTTF(String fileName, String fontName, FontEventListener eventListener)
+            throws IOException {
+        TTFFile ttfFile = new TTFFile(eventListener);
         log.info("Reading " + fileName + "...");
 
         FontFileReader reader = new FontFileReader(fileName);
Index: src/java/org/apache/fop/fonts/FontSetup.java
===================================================================
--- src/java/org/apache/fop/fonts/FontSetup.java	(revision 1207292)
+++ src/java/org/apache/fop/fonts/FontSetup.java	(working copy)
@@ -207,7 +207,7 @@
             internalName = "F" + num;
             num++;
 
-            LazyFont font = new LazyFont(embedFontInfo, resolver);
+            LazyFont font = new LazyFont(embedFontInfo, resolver, fontInfo.getEventListener());
             fontInfo.addMetrics(internalName, font);
 
             List<FontTriplet> triplets = embedFontInfo.getFontTriplets();
Index: src/java/org/apache/fop/fonts/truetype/TTFSubSetFile.java
===================================================================
--- src/java/org/apache/fop/fonts/truetype/TTFSubSetFile.java	(revision 1207292)
+++ src/java/org/apache/fop/fonts/truetype/TTFSubSetFile.java	(working copy)
@@ -24,7 +24,9 @@
 import java.util.Map;
 import java.util.Set;
 
+import org.apache.fop.fonts.FontEventListener;
 
+
 /**
  * Reads a TrueType file and generates a subset
  * that can be used to embed a TrueType CID font.
@@ -35,6 +37,13 @@
  */
 public class TTFSubSetFile extends TTFFile {
 
+    /**
+     * @param eventListener for handling font related events
+     */
+    public TTFSubSetFile(FontEventListener eventListener) {
+        super(eventListener);
+    }
+
     private byte[] output = null;
     private int realSize = 0;
     private int currentPos = 0;
Index: src/java/org/apache/fop/fonts/truetype/TTFFontLoader.java
===================================================================
--- src/java/org/apache/fop/fonts/truetype/TTFFontLoader.java	(revision 1207292)
+++ src/java/org/apache/fop/fonts/truetype/TTFFontLoader.java	(working copy)
@@ -27,16 +27,19 @@
 import java.util.Set;
 
 import org.apache.commons.io.IOUtils;
+
+import org.apache.xmlgraphics.fonts.Glyphs;
+
 import org.apache.fop.fonts.BFEntry;
 import org.apache.fop.fonts.CIDFontType;
 import org.apache.fop.fonts.EncodingMode;
+import org.apache.fop.fonts.FontEventListener;
 import org.apache.fop.fonts.FontLoader;
 import org.apache.fop.fonts.FontResolver;
 import org.apache.fop.fonts.FontType;
 import org.apache.fop.fonts.MultiByteFont;
 import org.apache.fop.fonts.NamedCharacter;
 import org.apache.fop.fonts.SingleByteFont;
-import org.apache.xmlgraphics.fonts.Glyphs;
 
 /**
  * Loads a TrueType font into memory directly from the original font file.
@@ -52,9 +55,11 @@
      * Default constructor
      * @param fontFileURI the URI representing the font file
      * @param resolver the FontResolver for font URI resolution
+     * @param eventListener for handling font related events
      */
-    public TTFFontLoader(String fontFileURI, FontResolver resolver) {
-        this(fontFileURI, null, true, EncodingMode.AUTO, true, resolver);
+    public TTFFontLoader(String fontFileURI, FontResolver resolver,
+            FontEventListener eventListener) {
+        this(fontFileURI, null, true, EncodingMode.AUTO, true, resolver, eventListener);
     }
 
     /**
@@ -66,11 +71,12 @@
      * @param encodingMode the requested encoding mode
      * @param useKerning true to enable loading kerning info if available, false to disable
      * @param resolver the FontResolver for font URI resolution
+     * @param eventListener for handling font related events
      */
-    public TTFFontLoader(String fontFileURI, String subFontName,
-                boolean embedded, EncodingMode encodingMode, boolean useKerning,
-                FontResolver resolver) {
-        super(fontFileURI, embedded, useKerning, resolver);
+    public TTFFontLoader(String fontFileURI, String subFontName, boolean embedded,
+            EncodingMode encodingMode, boolean useKerning, FontResolver resolver,
+            FontEventListener eventListener) {
+        super(fontFileURI, embedded, useKerning, resolver, eventListener);
         this.subFontName = subFontName;
         this.encodingMode = encodingMode;
         if (this.encodingMode == EncodingMode.AUTO) {
@@ -93,7 +99,7 @@
     private void read(String ttcFontName) throws IOException {
         InputStream in = openFontUri(resolver, this.fontFileURI);
         try {
-            TTFFile ttf = new TTFFile();
+            TTFFile ttf = new TTFFile(eventListener);
             FontFileReader reader = new FontFileReader(in);
             boolean supported = ttf.readFont(reader, ttcFontName);
             if (!supported) {
Index: src/java/org/apache/fop/fonts/truetype/TTFFile.java
===================================================================
--- src/java/org/apache/fop/fonts/truetype/TTFFile.java	(revision 1207292)
+++ src/java/org/apache/fop/fonts/truetype/TTFFile.java	(working copy)
@@ -28,9 +28,14 @@
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.apache.fop.fonts.FontUtil;
+
 import org.apache.xmlgraphics.fonts.Glyphs;
 
+import org.apache.fop.events.DefaultEventBroadcaster;
+import org.apache.fop.fonts.FontEventAdapter;
+import org.apache.fop.fonts.FontEventListener;
+import org.apache.fop.fonts.FontUtil;
+
 /**
  * Reads a TrueType file or a TrueType Collection.
  * The TrueType spec can be found at the Microsoft.
@@ -125,7 +130,16 @@
      */
     protected Log log = LogFactory.getLog(TTFFile.class);
 
+    protected final FontEventListener eventListener;
+
     /**
+     * @param eventListener for handling font related events
+     */
+    public TTFFile(FontEventListener eventListener) {
+        this.eventListener = eventListener;
+    }
+
+    /**
      * Key-value helper class
      */
     class UnicodeMapping {
@@ -237,8 +251,7 @@
         } else if (symbolMapOffset > 0) {
             return readUnicodeCmap(in, symbolMapOffset, 0);
         } else {
-            log.fatal("Unsupported TrueType font: No Unicode or Symbol cmap table"
-                    + " not present. Aborting");
+            eventListener.unicodeCmapNotFound(this, fullName);
             return false;
         }
     }
@@ -1696,7 +1709,8 @@
      */
     public static void main(String[] args) {
         try {
-            TTFFile ttfFile = new TTFFile();
+            FontEventListener eventListener = new FontEventAdapter(new DefaultEventBroadcaster());
+            TTFFile ttfFile = new TTFFile(eventListener);
 
             FontFileReader reader = new FontFileReader(args[0]);
 
@@ -1713,4 +1727,4 @@
             ioe.printStackTrace(System.err);
         }
     }
-}
\ No newline at end of file
+}
Index: src/java/org/apache/fop/fonts/FontInfoConfigurator.java
===================================================================
--- src/java/org/apache/fop/fonts/FontInfoConfigurator.java	(revision 1207292)
+++ src/java/org/apache/fop/fonts/FontInfoConfigurator.java	(working copy)
@@ -237,8 +237,7 @@
                 LogUtil.handleException(log, e, strict);
             }
             if (fontFile != null) {
-                FontInfoFinder finder = new FontInfoFinder();
-                finder.setEventListener(listener);
+                FontInfoFinder finder = new FontInfoFinder(listener);
                 EmbedFontInfo[] infos = finder.find(fontURL, fontResolver, fontCache);
                 return infos[0]; //When subFont is set, only one font is returned
             } else {
Index: src/java/org/apache/fop/fonts/FontAdder.java
===================================================================
--- src/java/org/apache/fop/fonts/FontAdder.java	(revision 1207292)
+++ src/java/org/apache/fop/fonts/FontAdder.java	(working copy)
@@ -51,8 +51,7 @@
      */
     public void add(List<URL> fontURLList, List<EmbedFontInfo> fontInfoList) {
         FontCache cache = manager.getFontCache();
-        FontInfoFinder finder = new FontInfoFinder();
-        finder.setEventListener(listener);
+        FontInfoFinder finder = new FontInfoFinder(listener);
 
         for (URL fontURL : fontURLList) {
             EmbedFontInfo[] embedFontInfos = finder.find(fontURL, resolver, cache);
Index: src/java/org/apache/fop/fonts/LazyFont.java
===================================================================
--- src/java/org/apache/fop/fonts/LazyFont.java	(revision 1207292)
+++ src/java/org/apache/fop/fonts/LazyFont.java	(working copy)
@@ -27,10 +27,12 @@
 import javax.xml.transform.Source;
 import javax.xml.transform.stream.StreamSource;
 
+import org.xml.sax.InputSource;
+
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+
 import org.apache.fop.apps.FOPException;
-import org.xml.sax.InputSource;
 
 /**
  * This class is used to defer the loading of a font until it is really used.
@@ -51,13 +53,15 @@
     private FontDescriptor realFontDescriptor = null;
 
     private FontResolver resolver = null;
+    private final FontEventListener eventListener;
 
     /**
      * Main constructor
      * @param fontInfo  the font info to embed
      * @param resolver the font resolver to handle font URIs
+     * @param eventListener for handling font related events
      */
-    public LazyFont(EmbedFontInfo fontInfo, FontResolver resolver) {
+    public LazyFont(EmbedFontInfo fontInfo, FontResolver resolver, FontEventListener eventListener) {
 
         this.metricsFileName = fontInfo.getMetricsFile();
         this.fontEmbedPath = fontInfo.getEmbedFile();
@@ -66,6 +70,7 @@
         this.subFontName = fontInfo.getSubFontName();
         this.embedded = fontInfo.isEmbedded();
         this.resolver = resolver;
+        this.eventListener = eventListener;
     }
 
     /** {@inheritDoc} */
@@ -130,7 +135,7 @@
                         throw new RuntimeException("Cannot load font. No font URIs available.");
                     }
                     realFont = FontLoader.loadFont(fontEmbedPath, this.subFontName,
-                            this.embedded, this.encodingMode, useKerning, resolver);
+                            this.embedded, this.encodingMode, useKerning, resolver, eventListener);
                 }
                 if (realFont instanceof FontDescriptor) {
                     realFontDescriptor = (FontDescriptor) realFont;
@@ -141,7 +146,6 @@
                     throw new RuntimeException(fopex.getMessage());
                 }
             } catch (IOException ioex) {
-                log.error("Failed to read font metrics file " + metricsFileName, ioex);
                 if (fail) {
                     throw new RuntimeException(ioex.getMessage());
                 }
Index: src/java/org/apache/fop/fonts/CustomFontCollection.java
===================================================================
--- src/java/org/apache/fop/fonts/CustomFontCollection.java	(revision 1207292)
+++ src/java/org/apache/fop/fonts/CustomFontCollection.java	(working copy)
@@ -28,20 +28,23 @@
 
     private FontResolver fontResolver;
     private final List<EmbedFontInfo> embedFontInfoList;
+    private final FontEventListener eventListener;
 
     /**
      * Main constructor.
      * @param fontResolver a font resolver
      * @param customFonts the list of custom fonts
+     * @param eventListener for handling font related events
      */
     public CustomFontCollection(FontResolver fontResolver,
-            List<EmbedFontInfo> customFonts) {
+            List<EmbedFontInfo> customFonts, FontEventListener eventListener) {
         this.fontResolver = fontResolver;
         if (this.fontResolver == null) {
             //Ensure that we have minimal font resolution capabilities
             this.fontResolver = FontManager.createMinimalFontResolver();
         }
         this.embedFontInfoList = customFonts;
+        this.eventListener = eventListener;
     }
 
     /** {@inheritDoc} */
@@ -66,7 +69,7 @@
             fontInfo.addMetrics(internalName, reader.getFont());
             */
 
-            LazyFont font = new LazyFont(embedFontInfo, this.fontResolver);
+            LazyFont font = new LazyFont(embedFontInfo, this.fontResolver, eventListener);
             fontInfo.addMetrics(internalName, font);
 
             List<FontTriplet> triplets = embedFontInfo.getFontTriplets();
Index: src/java/org/apache/fop/fonts/autodetect/FontInfoFinder.java
===================================================================
--- src/java/org/apache/fop/fonts/autodetect/FontInfoFinder.java	(revision 1207292)
+++ src/java/org/apache/fop/fonts/autodetect/FontInfoFinder.java	(working copy)
@@ -29,6 +29,7 @@
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+
 import org.apache.fop.fonts.CustomFont;
 import org.apache.fop.fonts.EmbedFontInfo;
 import org.apache.fop.fonts.EncodingMode;
@@ -52,17 +53,16 @@
     /** logging instance */
     private final Log log = LogFactory.getLog(FontInfoFinder.class);
 
-    private FontEventListener eventListener;
+    private final FontEventListener eventListener;
 
     /**
-     * Sets the font event listener that can be used to receive events about particular events
-     * in this class.
-     * @param listener the font event listener
+     * @param eventListener for handling font related events
      */
-    public void setEventListener(FontEventListener listener) {
-        this.eventListener = listener;
+    public FontInfoFinder(FontEventListener eventListener) {
+        this.eventListener = eventListener;
     }
 
+
     /**
      * Attempts to determine FontTriplets from a given CustomFont.
      * It seems to be fairly accurate but will probably require some tweaking over time
@@ -197,7 +197,7 @@
             InputStream in = null;
             try {
                 in = FontLoader.openFontUri(resolver, fontFileURL);
-                TTFFile ttf = new TTFFile();
+                TTFFile ttf = new TTFFile(eventListener);
                 FontFileReader reader = new FontFileReader(in);
                 ttcNames = ttf.getTTCnames(reader);
             } catch (Exception e) {
@@ -217,8 +217,8 @@
                     log.debug("Loading " + fontName);
                 }
                 try {
-                    TTFFontLoader ttfLoader = new TTFFontLoader(
-                            fontFileURL, fontName, true, EncodingMode.AUTO, true, resolver);
+                    TTFFontLoader ttfLoader = new TTFFontLoader(fontFileURL, fontName, true,
+                            EncodingMode.AUTO, true, resolver, eventListener);
                     customFont = ttfLoader.getFont();
                     if (this.eventListener != null) {
                         customFont.setEventListener(this.eventListener);
@@ -242,7 +242,8 @@
         } else {
             // The normal case
             try {
-                customFont = FontLoader.loadFont(fontURL, null, true, EncodingMode.AUTO, resolver);
+                customFont = FontLoader.loadFont(fontURL, null, true, EncodingMode.AUTO, resolver,
+                        eventListener);
                 if (this.eventListener != null) {
                     customFont.setEventListener(this.eventListener);
                 }
Index: src/java/org/apache/fop/fonts/type1/Type1FontLoader.java
===================================================================
--- src/java/org/apache/fop/fonts/type1/Type1FontLoader.java	(revision 1207292)
+++ src/java/org/apache/fop/fonts/type1/Type1FontLoader.java	(working copy)
@@ -29,6 +29,7 @@
 import org.apache.commons.io.IOUtils;
 
 import org.apache.fop.fonts.CodePointMapping;
+import org.apache.fop.fonts.FontEventListener;
 import org.apache.fop.fonts.FontLoader;
 import org.apache.fop.fonts.FontResolver;
 import org.apache.fop.fonts.FontType;
@@ -48,11 +49,12 @@
      * @param embedded indicates whether the font is embedded or referenced
      * @param useKerning indicates whether to load kerning information if available
      * @param resolver the font resolver used to resolve URIs
+     * @param eventListener for handling font related events
      * @throws IOException In case of an I/O error
      */
     public Type1FontLoader(String fontFileURI, boolean embedded, boolean useKerning,
-            FontResolver resolver) throws IOException {
-        super(fontFileURI, embedded, useKerning, resolver);
+            FontResolver resolver, FontEventListener eventListener) throws IOException {
+        super(fontFileURI, embedded, useKerning, resolver, eventListener);
     }
 
     private String getPFMURI(String pfbURI) {
Index: src/java/org/apache/fop/fonts/FontInfo.java
===================================================================
--- src/java/org/apache/fop/fonts/FontInfo.java	(revision 1207292)
+++ src/java/org/apache/fop/fonts/FontInfo.java	(working copy)
@@ -69,25 +69,26 @@
     private Map<FontTriplet, Map<Integer, Font>> fontInstanceCache = null;
 
     /** Event listener for font events */
-    private FontEventListener eventListener = null;
+    private final FontEventListener eventListener;
 
     /**
      * Main constructor
+     *
+     * @param eventListener for handling font related events
      */
-    public FontInfo() {
+    public FontInfo(FontEventListener eventListener) {
         this.triplets = new HashMap<FontTriplet, String>();
         this.tripletPriorities = new HashMap<FontTriplet, Integer>();
         this.fonts = new HashMap<String, Typeface>();
         this.usedFonts = new HashMap<String, Typeface>();
+        this.eventListener = eventListener;
     }
 
     /**
-     * Sets the font event listener that can be used to receive events about particular events
-     * in this class.
-     * @param listener the font event listener
+     * Returns the font event listener.
      */
-    public void setEventListener(FontEventListener listener) {
-        this.eventListener = listener;
+    public FontEventListener getEventListener() {
+        return eventListener;
     }
 
     /**
Index: src/java/org/apache/fop/fonts/FontEventProducer.xml
===================================================================
--- src/java/org/apache/fop/fonts/FontEventProducer.xml	(revision 1207292)
+++ src/java/org/apache/fop/fonts/FontEventProducer.xml	(working copy)
@@ -21,4 +21,5 @@
   <message key="fontLoadingErrorAtAutoDetection">Unable to load font file: {fontURL}.[ Reason: {e}]</message>
   <message key="glyphNotAvailable">Glyph "{ch}" (0x{ch,hex}[, {ch,glyph-name}]) not available in font "{fontName}".</message>
   <message key="fontDirectoryNotFound">'{dir}' does not exist or is not a directory.</message>
+  <message key="unicodeCmapNotFound">The font '{name}' does not have a Unicode 'cmap' table.</message>
 </catalogue>
Index: src/java/org/apache/fop/fonts/FontLoader.java
===================================================================
--- src/java/org/apache/fop/fonts/FontLoader.java	(revision 1207292)
+++ src/java/org/apache/fop/fonts/FontLoader.java	(working copy)
@@ -56,19 +56,23 @@
     /** true if kerning information shall be loaded if available. */
     protected boolean useKerning = true;
 
+    protected final FontEventListener eventListener;
+
     /**
      * Default constructor.
      * @param fontFileURI the URI to the PFB file of a Type 1 font
      * @param embedded indicates whether the font is embedded or referenced
      * @param useKerning indicates whether kerning information shall be loaded if available
      * @param resolver the font resolver used to resolve URIs
+     * @param eventListener for handling font related events
      */
     public FontLoader(String fontFileURI, boolean embedded, boolean useKerning,
-            FontResolver resolver) {
+            FontResolver resolver, FontEventListener eventListener) {
         this.fontFileURI = fontFileURI;
         this.embedded = embedded;
         this.useKerning = useKerning;
         this.resolver = resolver;
+        this.eventListener = eventListener;
     }
 
     private static boolean isType1(String fontURI) {
@@ -82,13 +86,15 @@
      * @param embedded indicates whether the font is embedded or referenced
      * @param encodingMode the requested encoding mode
      * @param resolver the font resolver to use when resolving URIs
+     * @param eventListener for handling font related events
      * @return the newly loaded font
      * @throws IOException In case of an I/O error
      */
-    public static CustomFont loadFont(File fontFile, String subFontName,
-            boolean embedded, EncodingMode encodingMode, FontResolver resolver) throws IOException {
-        return loadFont(fontFile.toURI().toURL(), subFontName,
-                embedded, encodingMode, resolver);
+    public static CustomFont loadFont(File fontFile, String subFontName, boolean embedded,
+            EncodingMode encodingMode, FontResolver resolver, FontEventListener eventListener)
+            throws IOException {
+        return loadFont(fontFile.toURI().toURL(), subFontName, embedded, encodingMode, resolver,
+                eventListener);
     }
 
     /**
@@ -98,15 +104,15 @@
      * @param embedded indicates whether the font is embedded or referenced
      * @param encodingMode the requested encoding mode
      * @param resolver the font resolver to use when resolving URIs
+     * @param eventListener for handling font related events
      * @return the newly loaded font
      * @throws IOException In case of an I/O error
      */
     public static CustomFont loadFont(URL fontUrl, String subFontName,
             boolean embedded, EncodingMode encodingMode,
-            FontResolver resolver) throws IOException {
-        return loadFont(fontUrl.toExternalForm(), subFontName,
-                embedded, encodingMode, true,
-                resolver);
+            FontResolver resolver, FontEventListener eventListener) throws IOException {
+        return loadFont(fontUrl.toExternalForm(), subFontName, embedded, encodingMode, true,
+                resolver, eventListener);
     }
 
     /**
@@ -117,12 +123,13 @@
      * @param encodingMode the requested encoding mode
      * @param useKerning indicates whether kerning information should be loaded if available
      * @param resolver the font resolver to use when resolving URIs
+     * @param eventListener for handling font related events
      * @return the newly loaded font
      * @throws IOException In case of an I/O error
      */
     public static CustomFont loadFont(String fontFileURI, String subFontName,
             boolean embedded, EncodingMode encodingMode, boolean useKerning,
-            FontResolver resolver) throws IOException {
+            FontResolver resolver, FontEventListener eventListener) throws IOException {
         fontFileURI = fontFileURI.trim();
         boolean type1 = isType1(fontFileURI);
         FontLoader loader;
@@ -131,10 +138,10 @@
                 throw new IllegalArgumentException(
                         "CID encoding mode not supported for Type 1 fonts");
             }
-            loader = new Type1FontLoader(fontFileURI, embedded, useKerning, resolver);
+            loader = new Type1FontLoader(fontFileURI, embedded, useKerning, resolver, eventListener);
         } else {
-            loader = new TTFFontLoader(fontFileURI, subFontName,
-                    embedded, encodingMode, useKerning, resolver);
+            loader = new TTFFontLoader(fontFileURI, subFontName, embedded, encodingMode, useKerning,
+                    resolver, eventListener);
         }
         return loader.getFont();
     }
Index: src/java/org/apache/fop/svg/PDFGraphics2D.java
===================================================================
--- src/java/org/apache/fop/svg/PDFGraphics2D.java	(revision 1207292)
+++ src/java/org/apache/fop/svg/PDFGraphics2D.java	(working copy)
@@ -69,7 +69,10 @@
 import org.apache.xmlgraphics.java2d.AbstractGraphics2D;
 import org.apache.xmlgraphics.java2d.GraphicContext;
 
+import org.apache.fop.events.DefaultEventBroadcaster;
 import org.apache.fop.fonts.Font;
+import org.apache.fop.fonts.FontEventAdapter;
+import org.apache.fop.fonts.FontEventListener;
 import org.apache.fop.fonts.FontInfo;
 import org.apache.fop.fonts.FontSetup;
 import org.apache.fop.pdf.BitmapImage;
@@ -964,7 +967,8 @@
     private boolean createPattern(PatternPaint pp, boolean fill) {
         preparePainting();
 
-        FontInfo specialFontInfo = new FontInfo();
+        FontEventListener eventListener = new FontEventAdapter(new DefaultEventBroadcaster());
+        FontInfo specialFontInfo = new FontInfo(eventListener);
         FontSetup.setup(specialFontInfo);
 
         PDFResources res = pdfDoc.getFactory().makeResources();
Index: src/java/org/apache/fop/svg/PDFDocumentGraphics2DConfigurator.java
===================================================================
--- src/java/org/apache/fop/svg/PDFDocumentGraphics2DConfigurator.java	(revision 1207292)
+++ src/java/org/apache/fop/svg/PDFDocumentGraphics2DConfigurator.java	(working copy)
@@ -25,8 +25,10 @@
 import org.apache.avalon.framework.configuration.ConfigurationException;
 
 import org.apache.fop.apps.FOPException;
+import org.apache.fop.events.DefaultEventBroadcaster;
 import org.apache.fop.fonts.CustomFontCollection;
 import org.apache.fop.fonts.FontCollection;
+import org.apache.fop.fonts.FontEventAdapter;
 import org.apache.fop.fonts.FontEventListener;
 import org.apache.fop.fonts.FontInfo;
 import org.apache.fop.fonts.FontInfoConfigurator;
@@ -72,7 +74,8 @@
      * @throws FOPException if an error occurs while setting up the fonts
      */
     public static FontInfo createFontInfo(Configuration cfg) throws FOPException {
-        FontInfo fontInfo = new FontInfo();
+        FontEventListener eventListener = new FontEventAdapter(new DefaultEventBroadcaster());
+        FontInfo fontInfo = new FontInfo(eventListener);
         final boolean strict = false;
         FontResolver fontResolver = FontManager.createMinimalFontResolver();
         //TODO The following could be optimized by retaining the FontManager somewhere
@@ -92,7 +95,8 @@
                 = new FontInfoConfigurator(cfg, fontManager, fontResolver, listener, strict);
             List/*<EmbedFontInfo>*/ fontInfoList = new java.util.ArrayList/*<EmbedFontInfo>*/();
             fontInfoConfigurator.configure(fontInfoList);
-            fontCollections.add(new CustomFontCollection(fontResolver, fontInfoList));
+            fontCollections.add(new CustomFontCollection(fontResolver, fontInfoList,
+                    eventListener));
         }
         fontManager.setup(fontInfo,
                 (FontCollection[])fontCollections.toArray(
Index: src/java/org/apache/fop/svg/PDFDocumentGraphics2D.java
===================================================================
--- src/java/org/apache/fop/svg/PDFDocumentGraphics2D.java	(revision 1207292)
+++ src/java/org/apache/fop/svg/PDFDocumentGraphics2D.java	(working copy)
@@ -33,6 +33,9 @@
 import org.apache.xmlgraphics.image.GraphicsConstants;
 
 import org.apache.fop.Version;
+import org.apache.fop.events.DefaultEventBroadcaster;
+import org.apache.fop.fonts.FontEventAdapter;
+import org.apache.fop.fonts.FontEventListener;
 import org.apache.fop.fonts.FontInfo;
 import org.apache.fop.fonts.FontSetup;
 import org.apache.fop.pdf.PDFAnnotList;
@@ -158,7 +161,8 @@
     public void setupDefaultFontInfo() {
         if (fontInfo == null) {
             //Default minimal fonts
-            FontInfo fontInfo = new FontInfo();
+            FontEventListener eventListener = new FontEventAdapter(new DefaultEventBroadcaster());
+            FontInfo fontInfo = new FontInfo(eventListener);
             FontSetup.setup(fontInfo);
             setFontInfo(fontInfo);
         }
Index: src/java/org/apache/fop/tools/fontlist/FontListMain.java
===================================================================
--- src/java/org/apache/fop/tools/fontlist/FontListMain.java	(revision 1207292)
+++ src/java/org/apache/fop/tools/fontlist/FontListMain.java	(working copy)
@@ -147,6 +147,10 @@
                 //ignore
             }
 
+            public void unicodeCmapNotFound(Object source, String name) {
+                //ignore
+            }
+
         };
 
         FontListGenerator listGenerator = new FontListGenerator();
Index: src/java/org/apache/fop/tools/fontlist/FontListGenerator.java
===================================================================
--- src/java/org/apache/fop/tools/fontlist/FontListGenerator.java	(revision 1207292)
+++ src/java/org/apache/fop/tools/fontlist/FontListGenerator.java	(working copy)
@@ -67,7 +67,7 @@
             = fopFactory.getRendererFactory().createDocumentHandler(userAgent, mime);
         IFDocumentHandlerConfigurator configurator = documentHandler.getConfigurator();
 
-        FontInfo fontInfo = new FontInfo();
+        FontInfo fontInfo = new FontInfo(listener);
         configurator.setupFontInfo(documentHandler, fontInfo);
         return fontInfo;
     }
Index: src/java/org/apache/fop/fo/FOEventHandler.java
===================================================================
--- src/java/org/apache/fop/fo/FOEventHandler.java	(revision 1207292)
+++ src/java/org/apache/fop/fo/FOEventHandler.java	(working copy)
@@ -79,8 +79,7 @@
      */
     public FOEventHandler(FOUserAgent foUserAgent) {
         this.foUserAgent = foUserAgent;
-        this.fontInfo = new FontInfo();
-        this.fontInfo.setEventListener(new FontEventAdapter(foUserAgent.getEventBroadcaster()));
+        this.fontInfo = new FontInfo(new FontEventAdapter(foUserAgent.getEventBroadcaster()));
     }
 
     /**
Index: src/java/org/apache/fop/cli/AreaTreeInputHandler.java
===================================================================
--- src/java/org/apache/fop/cli/AreaTreeInputHandler.java	(revision 1207292)
+++ src/java/org/apache/fop/cli/AreaTreeInputHandler.java	(working copy)
@@ -33,6 +33,7 @@
 import org.apache.fop.area.AreaTreeModel;
 import org.apache.fop.area.AreaTreeParser;
 import org.apache.fop.area.RenderPagesModel;
+import org.apache.fop.fonts.FontEventAdapter;
 import org.apache.fop.fonts.FontInfo;
 
 /**
@@ -62,7 +63,7 @@
     /** {@inheritDoc} */
     public void renderTo(FOUserAgent userAgent, String outputFormat, OutputStream out)
                 throws FOPException {
-        FontInfo fontInfo = new FontInfo();
+        FontInfo fontInfo = new FontInfo(new FontEventAdapter(userAgent.getEventBroadcaster()));
         AreaTreeModel treeModel = new RenderPagesModel(userAgent,
                 outputFormat, fontInfo, out);
 
Index: src/java/org/apache/fop/cli/IFInputHandler.java
===================================================================
--- src/java/org/apache/fop/cli/IFInputHandler.java	(revision 1207292)
+++ src/java/org/apache/fop/cli/IFInputHandler.java	(working copy)
@@ -29,6 +29,8 @@
 
 import org.apache.fop.apps.FOPException;
 import org.apache.fop.apps.FOUserAgent;
+import org.apache.fop.fonts.FontEventAdapter;
+import org.apache.fop.fonts.FontInfo;
 import org.apache.fop.render.intermediate.IFDocumentHandler;
 import org.apache.fop.render.intermediate.IFException;
 import org.apache.fop.render.intermediate.IFParser;
@@ -66,7 +68,8 @@
                     userAgent, outputFormat);
         try {
             documentHandler.setResult(new StreamResult(out));
-            IFUtil.setupFonts(documentHandler);
+            FontInfo fontInfo = new FontInfo(new FontEventAdapter(userAgent.getEventBroadcaster()));
+            IFUtil.setupFonts(documentHandler, fontInfo);
 
             //Create IF parser
             IFParser parser = new IFParser();
Index: src/java/org/apache/fop/pdf/PDFResources.java
===================================================================
--- src/java/org/apache/fop/pdf/PDFResources.java	(revision 1207292)
+++ src/java/org/apache/fop/pdf/PDFResources.java	(working copy)
@@ -115,8 +115,8 @@
                 if (font instanceof Symbol || font instanceof ZapfDingbats) {
                     encoding = null; //Symbolic fonts shouldn't specify an encoding value in PDF
                 }
-                addFont(doc.getFactory().makeFont(
-                    f, font.getEmbedFontName(), encoding, font, desc));
+                addFont(doc.getFactory().makeFont(f, font.getEmbedFontName(), encoding, font, desc,
+                        fontInfo.getEventListener()));
             }
         }
     }
Index: src/java/org/apache/fop/pdf/PDFFactory.java
===================================================================
--- src/java/org/apache/fop/pdf/PDFFactory.java	(revision 1207292)
+++ src/java/org/apache/fop/pdf/PDFFactory.java	(working copy)
@@ -52,6 +52,7 @@
 import org.apache.fop.fonts.CodePointMapping;
 import org.apache.fop.fonts.CustomFont;
 import org.apache.fop.fonts.FontDescriptor;
+import org.apache.fop.fonts.FontEventListener;
 import org.apache.fop.fonts.FontMetrics;
 import org.apache.fop.fonts.FontType;
 import org.apache.fop.fonts.LazyFont;
@@ -1349,11 +1350,11 @@
      * @param encoding character encoding scheme used by the font
      * @param metrics additional information about the font
      * @param descriptor additional information about the font
+     * @param eventListener for handling font related events
      * @return the created /Font object
      */
-    public PDFFont makeFont(String fontname, String basefont,
-                            String encoding, FontMetrics metrics,
-                            FontDescriptor descriptor) {
+    public PDFFont makeFont(String fontname, String basefont, String encoding, FontMetrics metrics,
+            FontDescriptor descriptor, FontEventListener eventListener) {
         PDFFont preRegisteredfont = getDocument().findFont(fontname);
         if (preRegisteredfont != null) {
             return preRegisteredfont;
@@ -1384,7 +1385,7 @@
 
             String subsetFontName = fontPrefix + basefont;
 
-            PDFFontDescriptor pdfdesc = makeFontDescriptor(descriptor, fontPrefix);
+            PDFFontDescriptor pdfdesc = makeFontDescriptor(descriptor, fontPrefix, eventListener);
 
             PDFFont font = null;
 
@@ -1578,9 +1579,11 @@
      *
      * @param desc the font descriptor
      * @param fontPrefix the String with which to prefix the font name
+     * @param eventListener for handling font related events
      * @return the new PDF font descriptor
      */
-    private PDFFontDescriptor makeFontDescriptor(FontDescriptor desc, String fontPrefix) {
+    private PDFFontDescriptor makeFontDescriptor(FontDescriptor desc, String fontPrefix,
+            FontEventListener eventListener) {
         PDFFontDescriptor descriptor = null;
 
         if (desc.getFontType() == FontType.TYPE0) {
@@ -1606,7 +1609,7 @@
 
         // Check if the font is embeddable
         if (desc.isEmbeddable()) {
-            AbstractPDFStream stream = makeFontFile(desc);
+            AbstractPDFStream stream = makeFontFile(desc, eventListener);
             if (stream != null) {
                 descriptor.setFontFile(desc.getFontType(), stream);
                 getDocument().registerObject(stream);
@@ -1650,9 +1653,10 @@
     /**
      * Embeds a font.
      * @param desc FontDescriptor of the font.
+     * @param eventListener for handling font related events
      * @return PDFStream The embedded font file
      */
-    public AbstractPDFStream makeFontFile(FontDescriptor desc) {
+    public AbstractPDFStream makeFontFile(FontDescriptor desc, FontEventListener eventListener) {
         if (desc.getFontType() == FontType.OTHER) {
             throw new IllegalArgumentException("Trying to embed unsupported font type: "
                                                 + desc.getFontType());
@@ -1699,7 +1703,7 @@
                         MultiByteFont mbfont = (MultiByteFont)font;
                         FontFileReader reader = new FontFileReader(in);
 
-                        TTFSubSetFile subset = new TTFSubSetFile();
+                        TTFSubSetFile subset = new TTFSubSetFile(eventListener);
                         byte[] subsetFont = subset.readFont(reader,
                                              mbfont.getTTCName(), mbfont.getUsedGlyphs());
                         // Only TrueType CID fonts are supported now
Index: build.xml
===================================================================
--- build.xml	(revision 1207292)
+++ build.xml	(working copy)
@@ -554,6 +554,7 @@
       <include name="org/apache/fop/fo/FOTreeBuilder.class"/>
       <include name="org/apache/fop/area/AreaTreeControl*"/>
       <include name="org/apache/fop/svg/**"/>
+      <include name="org/apache/fop/events/**"/>
       <include name="org/apache/fop/fonts/**"/>
       <include name="org/apache/fop/image/loader/batik/BatikImageFlavors*.class"/>
       <include name="org/apache/fop/util/CMYKColorSpace*.class"/>
@@ -564,6 +565,7 @@
       <include name="org/apache/fop/util/Finalizable.class"/>
       <include name="org/apache/fop/util/CharUtilities.class"/>
       <include name="org/apache/fop/util/DecimalFormatCache*.class"/>
+      <include name="org/apache/fop/util/DefaultErrorListener.class"/>
     </patternset>
 <!-- PDF transcoder -->
     <patternset>
Index: examples/embedding/java/embedding/atxml/ExampleStamp.java
===================================================================
--- examples/embedding/java/embedding/atxml/ExampleStamp.java	(revision 1207292)
+++ examples/embedding/java/embedding/atxml/ExampleStamp.java	(working copy)
@@ -38,6 +38,7 @@
 import org.apache.fop.area.AreaTreeModel;
 import org.apache.fop.area.AreaTreeParser;
 import org.apache.fop.area.RenderPagesModel;
+import org.apache.fop.fonts.FontEventAdapter;
 import org.apache.fop.fonts.FontInfo;
 
 import embedding.ExampleObj2XML;
@@ -68,8 +69,8 @@
         out = new java.io.BufferedOutputStream(out);
         try {
             //Setup fonts and user agent
-            FontInfo fontInfo = new FontInfo();
             FOUserAgent userAgent = fopFactory.newFOUserAgent();
+            FontInfo fontInfo = new FontInfo(new FontEventAdapter(userAgent.getEventBroadcaster()));
 
             //Construct the AreaTreeModel that will received the individual pages
             AreaTreeModel treeModel = new RenderPagesModel(userAgent,
Index: examples/embedding/java/embedding/atxml/ExampleConcat.java
===================================================================
--- examples/embedding/java/embedding/atxml/ExampleConcat.java	(revision 1207292)
+++ examples/embedding/java/embedding/atxml/ExampleConcat.java	(working copy)
@@ -41,6 +41,7 @@
 import org.apache.fop.area.AreaTreeModel;
 import org.apache.fop.area.AreaTreeParser;
 import org.apache.fop.area.RenderPagesModel;
+import org.apache.fop.fonts.FontEventAdapter;
 import org.apache.fop.fonts.FontInfo;
 import org.apache.fop.render.Renderer;
 import org.apache.fop.render.xml.XMLRenderer;
@@ -144,8 +145,8 @@
         out = new java.io.BufferedOutputStream(out);
         try {
             //Setup fonts and user agent
-            FontInfo fontInfo = new FontInfo();
             FOUserAgent userAgent = fopFactory.newFOUserAgent();
+            FontInfo fontInfo = new FontInfo(new FontEventAdapter(userAgent.getEventBroadcaster()));
 
             //Construct the AreaTreeModel that will received the individual pages
             AreaTreeModel treeModel = new RenderPagesModel(userAgent,
