diff --git a/examples/plan/src/org/apache/fop/plan/PreloaderPlan.java b/examples/plan/src/org/apache/fop/plan/PreloaderPlan.java
index 8544ce5..d88658c 100644
--- a/examples/plan/src/org/apache/fop/plan/PreloaderPlan.java
+++ b/examples/plan/src/org/apache/fop/plan/PreloaderPlan.java
@@ -43,6 +43,7 @@
 import org.apache.xmlgraphics.image.loader.impl.AbstractImagePreloader;
 import org.apache.xmlgraphics.image.loader.impl.ImageXMLDOM;
 import org.apache.xmlgraphics.image.loader.util.ImageUtil;
+import org.apache.xmlgraphics.io.XmlSourceUtil;
 
 import org.apache.fop.util.DefaultErrorListener;
 import org.apache.fop.util.UnclosableInputStream;
diff --git a/src/java/org/apache/fop/afp/AFPStreamer.java b/src/java/org/apache/fop/afp/AFPStreamer.java
index fb2b282..5e6b5a7 100644
--- a/src/java/org/apache/fop/afp/AFPStreamer.java
+++ b/src/java/org/apache/fop/afp/AFPStreamer.java
@@ -32,10 +32,11 @@
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
+import org.apache.xmlgraphics.io.TempResourceURIGenerator;
+
 import org.apache.fop.afp.modca.ResourceGroup;
 import org.apache.fop.afp.modca.StreamedResourceGroup;
 import org.apache.fop.apps.io.InternalResourceResolver;
-import org.apache.fop.apps.io.TempResourceURIGenerator;
 
 /**
  * Manages the streaming of the AFP output
diff --git a/src/java/org/apache/fop/apps/EnvironmentProfile.java b/src/java/org/apache/fop/apps/EnvironmentProfile.java
index c964120..1a58535 100644
--- a/src/java/org/apache/fop/apps/EnvironmentProfile.java
+++ b/src/java/org/apache/fop/apps/EnvironmentProfile.java
@@ -21,7 +21,9 @@
 
 import java.net.URI;
 
-import org.apache.fop.apps.io.ResourceResolver;
+import org.apache.xmlgraphics.image.loader.impl.AbstractImageSessionContext.FallbackResolver;
+import org.apache.xmlgraphics.io.ResourceResolver;
+
 import org.apache.fop.fonts.FontManager;
 
 /**
@@ -52,4 +54,7 @@
      * @return the default base URI
      */
     URI getDefaultBaseURI();
+
+    /** @see FopFactoryConfig#getFallbackResolver() */
+    FallbackResolver getFallbackResolver();
 }
diff --git a/src/java/org/apache/fop/apps/EnvironmentalProfileFactory.java b/src/java/org/apache/fop/apps/EnvironmentalProfileFactory.java
index 9ba7632..922ecff 100644
--- a/src/java/org/apache/fop/apps/EnvironmentalProfileFactory.java
+++ b/src/java/org/apache/fop/apps/EnvironmentalProfileFactory.java
@@ -21,8 +21,12 @@
 
 import java.net.URI;
 
+import org.apache.xmlgraphics.image.loader.impl.AbstractImageSessionContext.FallbackResolver;
+import org.apache.xmlgraphics.image.loader.impl.AbstractImageSessionContext.RestrictedFallbackResolver;
+import org.apache.xmlgraphics.image.loader.impl.AbstractImageSessionContext.UnrestrictedFallbackResolver;
+import org.apache.xmlgraphics.io.ResourceResolver;
+
 import org.apache.fop.apps.io.InternalResourceResolver;
-import org.apache.fop.apps.io.ResourceResolver;
 import org.apache.fop.apps.io.ResourceResolverFactory;
 import org.apache.fop.fonts.FontCacheManager;
 import org.apache.fop.fonts.FontCacheManagerFactory;
@@ -51,7 +55,8 @@
         return new Profile(defaultBaseUri, resourceResolver,
                 createFontManager(defaultBaseUri, resourceResolver,
                         FontDetectorFactory.createDefault(),
-                        FontCacheManagerFactory.createDefault()));
+                        FontCacheManagerFactory.createDefault()),
+                new UnrestrictedFallbackResolver());
     }
 
     /**
@@ -67,7 +72,8 @@
         return new Profile(defaultBaseUri, resourceResolver,
                 createFontManager(defaultBaseUri, resourceResolver,
                         FontDetectorFactory.createDisabled(),
-                        FontCacheManagerFactory.createDisabled()));
+                        FontCacheManagerFactory.createDisabled()),
+                new RestrictedFallbackResolver());
     }
 
     private static final class Profile implements EnvironmentProfile {
@@ -78,8 +84,10 @@
 
         private final URI defaultBaseURI;
 
+        private final FallbackResolver fallbackResolver;
+
         private Profile(URI defaultBaseURI, ResourceResolver resourceResolver,
-                FontManager fontManager) {
+                FontManager fontManager, FallbackResolver fallbackResolver) {
             if (defaultBaseURI == null) {
                 throw new IllegalArgumentException("Default base URI must not be null");
             }
@@ -92,6 +100,7 @@
             this.defaultBaseURI = defaultBaseURI;
             this.resourceResolver = resourceResolver;
             this.fontManager = fontManager;
+            this.fallbackResolver = fallbackResolver;
         }
 
         public ResourceResolver getResourceResolver() {
@@ -105,6 +114,10 @@
         public URI getDefaultBaseURI() {
             return defaultBaseURI;
         }
+
+        public FallbackResolver getFallbackResolver() {
+            return fallbackResolver;
+        }
     }
 
     private static FontManager createFontManager(URI defaultBaseUri, ResourceResolver resourceResolver,
diff --git a/src/java/org/apache/fop/apps/FOUserAgent.java b/src/java/org/apache/fop/apps/FOUserAgent.java
index 0ed5b72..6806434 100644
--- a/src/java/org/apache/fop/apps/FOUserAgent.java
+++ b/src/java/org/apache/fop/apps/FOUserAgent.java
@@ -131,21 +131,7 @@
     /** Set of keywords applicable to this document. */
     protected String keywords = null;
 
-    private ImageSessionContext imageSessionContext = new AbstractImageSessionContext() {
-
-        public ImageContext getParentContext() {
-            return factory;
-        }
-
-        public float getTargetResolution() {
-            return FOUserAgent.this.getTargetResolution();
-        }
-
-        public Source resolveURI(String uri) {
-            return FOUserAgent.this.resolveURI(uri);
-        }
-
-    };
+    private final ImageSessionContext imageSessionContext;
 
     /**
      * Main constructor. <b>This constructor should not be called directly. Please use the
@@ -154,11 +140,25 @@
      * @param resourceResolver the resolver used to acquire resources
      * @see org.apache.fop.apps.FopFactory
      */
-    FOUserAgent(FopFactory factory, InternalResourceResolver resourceResolver) {
+    FOUserAgent(final FopFactory factory, InternalResourceResolver resourceResolver) {
         this.factory = factory;
         this.resourceResolver = resourceResolver;
         setTargetResolution(factory.getTargetResolution());
         setAccessibility(factory.isAccessibilityEnabled());
+        imageSessionContext = new AbstractImageSessionContext(factory.getFallbackResolver()) {
+
+            public ImageContext getParentContext() {
+                return factory;
+            }
+
+            public float getTargetResolution() {
+                return FOUserAgent.this.getTargetResolution();
+            }
+
+            public Source resolveURI(String uri) {
+                return FOUserAgent.this.resolveURI(uri);
+            }
+        };
     }
 
     /**
diff --git a/src/java/org/apache/fop/apps/FopConfParser.java b/src/java/org/apache/fop/apps/FopConfParser.java
index c6e3dbd..b4918ef 100644
--- a/src/java/org/apache/fop/apps/FopConfParser.java
+++ b/src/java/org/apache/fop/apps/FopConfParser.java
@@ -39,9 +39,9 @@
 
 import org.apache.xmlgraphics.image.loader.spi.ImageImplRegistry;
 import org.apache.xmlgraphics.image.loader.util.Penalty;
+import org.apache.xmlgraphics.io.ResourceResolver;
 
 import org.apache.fop.apps.io.InternalResourceResolver;
-import org.apache.fop.apps.io.ResourceResolver;
 import org.apache.fop.apps.io.ResourceResolverFactory;
 import org.apache.fop.fonts.FontManagerConfigurator;
 import org.apache.fop.hyphenation.HyphenationTreeCache;
diff --git a/src/java/org/apache/fop/apps/FopFactory.java b/src/java/org/apache/fop/apps/FopFactory.java
index 80c957f..6bc744b 100644
--- a/src/java/org/apache/fop/apps/FopFactory.java
+++ b/src/java/org/apache/fop/apps/FopFactory.java
@@ -36,6 +36,7 @@
 
 import org.apache.xmlgraphics.image.loader.ImageContext;
 import org.apache.xmlgraphics.image.loader.ImageManager;
+import org.apache.xmlgraphics.image.loader.impl.AbstractImageSessionContext.FallbackResolver;
 import org.apache.xmlgraphics.util.UnitConv;
 
 import org.apache.fop.apps.io.InternalResourceResolver;
@@ -418,6 +419,11 @@
         return config.getFontManager();
     }
 
+    /** @see FopFactoryConfig#getFallbackResolver() */
+    FallbackResolver getFallbackResolver() {
+        return config.getFallbackResolver();
+    }
+
     /**
      * Returns the color space cache for this instance.
      * <p>
diff --git a/src/java/org/apache/fop/apps/FopFactoryBuilder.java b/src/java/org/apache/fop/apps/FopFactoryBuilder.java
index cfc4749..b1fd5e9 100644
--- a/src/java/org/apache/fop/apps/FopFactoryBuilder.java
+++ b/src/java/org/apache/fop/apps/FopFactoryBuilder.java
@@ -30,8 +30,9 @@
 
 import org.apache.xmlgraphics.image.loader.ImageContext;
 import org.apache.xmlgraphics.image.loader.ImageManager;
+import org.apache.xmlgraphics.image.loader.impl.AbstractImageSessionContext.FallbackResolver;
+import org.apache.xmlgraphics.io.ResourceResolver;
 
-import org.apache.fop.apps.io.ResourceResolver;
 import org.apache.fop.apps.io.ResourceResolverFactory;
 import org.apache.fop.fonts.FontManager;
 import org.apache.fop.layoutmgr.LayoutManagerMaker;
@@ -464,6 +465,10 @@
         public Map<String, String> getHyphenationPatternNames() {
             return hyphPatNames;
         }
+
+        public FallbackResolver getFallbackResolver() {
+            return enviro.getFallbackResolver();
+        }
     }
 
     private interface FopFactoryConfigBuilder {
diff --git a/src/java/org/apache/fop/apps/FopFactoryConfig.java b/src/java/org/apache/fop/apps/FopFactoryConfig.java
index 60e8d98..d3ea312 100644
--- a/src/java/org/apache/fop/apps/FopFactoryConfig.java
+++ b/src/java/org/apache/fop/apps/FopFactoryConfig.java
@@ -26,8 +26,9 @@
 import org.apache.avalon.framework.configuration.Configuration;
 
 import org.apache.xmlgraphics.image.loader.ImageManager;
+import org.apache.xmlgraphics.image.loader.impl.AbstractImageSessionContext.FallbackResolver;
+import org.apache.xmlgraphics.io.ResourceResolver;
 
-import org.apache.fop.apps.io.ResourceResolver;
 import org.apache.fop.fonts.FontManager;
 import org.apache.fop.layoutmgr.LayoutManagerMaker;
 
@@ -163,4 +164,11 @@
 
     /** @return the hyphenation pattern names */
     Map<String, String> getHyphenationPatternNames();
+
+    /**
+     * Controls the mechanisms that are used in the event that {@link javax.xml.transform.Source}
+     * used for resources couldn't be read.
+     * @return the fallback resolver
+     */
+    FallbackResolver getFallbackResolver();
 }
diff --git a/src/java/org/apache/fop/apps/io/InternalResourceResolver.java b/src/java/org/apache/fop/apps/io/InternalResourceResolver.java
index 4d664c8..af0a264 100644
--- a/src/java/org/apache/fop/apps/io/InternalResourceResolver.java
+++ b/src/java/org/apache/fop/apps/io/InternalResourceResolver.java
@@ -29,12 +29,14 @@
 import javax.xml.transform.TransformerException;
 import javax.xml.transform.stream.StreamSource;
 
+import org.apache.xmlgraphics.io.Resource;
+import org.apache.xmlgraphics.io.ResourceResolver;
 import org.apache.xmlgraphics.util.uri.DataURIResolver;
 
 /**
  * This object holds the base URI from which to resolve URIs against as well as the resolver for
  * resource acquisition. It also does some URI sanitization of common URI syntactical errors. This
- * class takes in a {@link org.apache.fop.apps.io.ResourceResolver} and delegates all relevant
+ * class takes in a {@link org.apache.xmlgraphics.io.ResourceResolver} and delegates all relevant
  * URIs to it.
  */
 public class InternalResourceResolver {
diff --git a/src/java/org/apache/fop/apps/io/Resource.java b/src/java/org/apache/fop/apps/io/Resource.java
deleted file mode 100644
index 0a8b8c2..0000000
--- a/src/java/org/apache/fop/apps/io/Resource.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * 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.apps.io;
-
-import java.io.FilterInputStream;
-import java.io.InputStream;
-
-/**
- * This class represents a resolved resource.  The type property is used by FOP to identify the resource
- *  content.
- *
- */
-public class Resource extends FilterInputStream {
-
-    private final String type;
-
-    /**
-     * @param type resource type
-     * @param inputStream input stream of the resource
-     */
-    public Resource(String type, InputStream inputStream) {
-        super(inputStream);
-        this.type = type;
-    }
-
-    /**
-     * Constructs a resource of 'unknown' type.
-     *
-     * @param inputStream input stream of the resource
-     */
-    public Resource(InputStream inputStream) {
-        this("unknown", inputStream);
-    }
-
-    /**
-     * @return the resource type
-     */
-    public String getType() {
-        return this.type;
-    }
-
-}
diff --git a/src/java/org/apache/fop/apps/io/ResourceResolver.java b/src/java/org/apache/fop/apps/io/ResourceResolver.java
deleted file mode 100644
index a3a9cf0..0000000
--- a/src/java/org/apache/fop/apps/io/ResourceResolver.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * 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.apps.io;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.net.URI;
-
-/**
- * Implementations of this resource resolver allow FOP users to control the URI resolution
- * mechanism. All resource and output stream acquisition goes through this when its implementation
- * is given to the {@link org.apache.fop.apps.EnvironmentProfile}.
- */
-public interface ResourceResolver {
-
-    /**
-     * Get a resource given the URI pointing to said resource.
-     *
-     * @param uri the resource URI
-     * @return the resource
-     * @throws IOException if an I/O error occured during resource acquisition
-     */
-    Resource getResource(URI uri) throws IOException;
-
-    /**
-     * Gets an output stream of a given URI.
-     *
-     * @param uri the output stream URI
-     * @return the output stream
-     * @throws IOException if an I/O error occured while creating an output stream
-     */
-    OutputStream getOutputStream(URI uri) throws IOException;
-
-}
diff --git a/src/java/org/apache/fop/apps/io/ResourceResolverFactory.java b/src/java/org/apache/fop/apps/io/ResourceResolverFactory.java
index 72eac45..cdc9438 100644
--- a/src/java/org/apache/fop/apps/io/ResourceResolverFactory.java
+++ b/src/java/org/apache/fop/apps/io/ResourceResolverFactory.java
@@ -28,6 +28,11 @@
 import java.util.HashMap;
 import java.util.Map;
 
+import org.apache.xmlgraphics.io.Resource;
+import org.apache.xmlgraphics.io.ResourceResolver;
+import org.apache.xmlgraphics.io.TempResourceResolver;
+import org.apache.xmlgraphics.io.TempResourceURIGenerator;
+
 /**
  * A factory class for {@link ResourceResolver}s.
  */
@@ -70,10 +75,10 @@
     }
 
     /**
-     * Creates a temporary-resource-schema aware resource resolver. Temporary resource URIs are
+     * Creates a temporary-resource-scheme aware resource resolver. Temporary resource URIs are
      * created by {@link TempResourceURIGenerator}.
      *
-     * @param tempResourceResolver the temporary-resource-schema resolver to use
+     * @param tempResourceResolver the temporary-resource-scheme resolver to use
      * @param defaultResourceResolver the default resource resolver to use
      * @return the ressource resolver
      */
@@ -84,17 +89,17 @@
     }
 
     /**
-     * This creates the builder class for binding URI schemas to implementations of
-     * {@link ResourceResolver}. This allows users to define their own URI schemas such that they
+     * This creates the builder class for binding URI schemes to implementations of
+     * {@link ResourceResolver}. This allows users to define their own URI schemes such that they
      * have finer control over the acquisition of resources.
      *
      * @param defaultResolver the default resource resolver that should be used in the event that
-     * none of the other registered resolvers match the schema
-     * @return the schema aware {@link ResourceResolver} builder
+     * none of the other registered resolvers match the scheme
+     * @return the scheme aware {@link ResourceResolver} builder
      */
-    public static SchemaAwareResourceResolverBuilder createSchemaAwareResourceResolverBuilder(
+    public static SchemeAwareResourceResolverBuilder createSchemeAwareResourceResolverBuilder(
             ResourceResolver defaultResolver) {
-        return new SchemaAwareResourceResolverBuilderImpl(defaultResolver);
+        return new SchemeAwareResourceResolverBuilderImpl(defaultResolver);
     }
 
     private static final class DefaultResourceResolver implements ResourceResolver {
@@ -132,13 +137,13 @@
             this.defaultResourceResolver = defaultResourceResolver;
         }
 
-        private static boolean isTempUri(URI uri) {
-            return TempResourceURIGenerator.isTempUri(uri);
+        private static boolean isTempURI(URI uri) {
+            return TempResourceURIGenerator.isTempURI(uri);
         }
 
         /** {@inheritDoc} */
         public Resource getResource(URI uri) throws IOException {
-            if (isTempUri(uri)) {
+            if (isTempURI(uri)) {
                 return tempResourceResolver.getResource(uri.getPath());
             } else {
                 return defaultResourceResolver.getResource(uri);
@@ -147,7 +152,7 @@
 
         /** {@inheritDoc} */
         public OutputStream getOutputStream(URI uri) throws IOException {
-            if (isTempUri(uri)) {
+            if (isTempURI(uri)) {
                 return tempResourceResolver.getOutputStream(uri.getPath());
             } else {
                 return defaultResourceResolver.getOutputStream(uri);
@@ -188,23 +193,23 @@
         }
     }
 
-    private static final class SchemaAwareResourceResolver implements ResourceResolver {
+    private static final class SchemeAwareResourceResolver implements ResourceResolver {
 
-        private final Map<String, ResourceResolver> schemaHandlingResourceResolvers;
+        private final Map<String, ResourceResolver> schemeHandlingResourceResolvers;
 
         private final ResourceResolver defaultResolver;
 
-        private SchemaAwareResourceResolver(
-                Map<String, ResourceResolver> schemaHandlingResourceResolvers,
+        private SchemeAwareResourceResolver(
+                Map<String, ResourceResolver> schemEHandlingResourceResolvers,
                 ResourceResolver defaultResolver) {
-            this.schemaHandlingResourceResolvers = schemaHandlingResourceResolvers;
+            this.schemeHandlingResourceResolvers = schemEHandlingResourceResolvers;
             this.defaultResolver = defaultResolver;
         }
 
-        private ResourceResolver getResourceResolverForSchema(URI uri) {
-            String schema = uri.getScheme();
-            if (schemaHandlingResourceResolvers.containsKey(schema)) {
-                return schemaHandlingResourceResolvers.get(schema);
+        private ResourceResolver getResourceResolverForScheme(URI uri) {
+            String scheme = uri.getScheme();
+            if (schemeHandlingResourceResolvers.containsKey(scheme)) {
+                return schemeHandlingResourceResolvers.get(scheme);
             } else {
                 return defaultResolver;
             }
@@ -212,58 +217,58 @@
 
         /** {@inheritDoc} */
         public Resource getResource(URI uri) throws IOException {
-            return getResourceResolverForSchema(uri).getResource(uri);
+            return getResourceResolverForScheme(uri).getResource(uri);
         }
 
         /** {@inheritDoc} */
         public OutputStream getOutputStream(URI uri) throws IOException {
-            return getResourceResolverForSchema(uri).getOutputStream(uri);
+            return getResourceResolverForScheme(uri).getOutputStream(uri);
         }
     }
 
     /**
      * Implementations of this interface will be builders for {@link ResourceResolver}, they bind
-     * URI schemas to their respective resolver. This gives users more control over the mechanisms
+     * URI schemes to their respective resolver. This gives users more control over the mechanisms
      * by which URIs are resolved.
      * <p>
      * Here is an example of how this could be used:
      * </p>
      * <p><code>
-     * SchemaAwareResourceResolverBuilder builder
-     *      = ResourceResolverFactory.createSchemaAwareResourceResolverBuilder(defaultResolver);
-     * builder.registerResourceResolverForSchema("test", testResolver);
-     * builder.registerResourceResolverForSchema("anotherTest", test2Resolver);
+     * SchemeAwareResourceResolverBuilder builder
+     *      = ResourceResolverFactory.createSchemeAwareResourceResolverBuilder(defaultResolver);
+     * builder.registerResourceResolverForScheme("test", testResolver);
+     * builder.registerResourceResolverForScheme("anotherTest", test2Resolver);
      * ResourceResolver resolver = builder.build();
      * </code></p>
      * This will result in all URIs for the form "test:///..." will be resolved using the
      * <code>testResolver</code> object; URIs of the form "anotherTest:///..." will be resolved
      * using <code>test2Resolver</code>; all other URIs will be resolved from the defaultResolver.
      */
-    public interface SchemaAwareResourceResolverBuilder {
+    public interface SchemeAwareResourceResolverBuilder {
 
         /**
-         * Register a schema with its respective {@link ResourceResolver}. This resolver will be
-         * used as the only resolver for the specified schema.
+         * Register a scheme with its respective {@link ResourceResolver}. This resolver will be
+         * used as the only resolver for the specified scheme.
          *
-         * @param schema the schema to be used with the given resolver
+         * @param scheme the scheme to be used with the given resolver
          * @param resourceResolver the resource resolver
          */
-        void registerResourceResolverForSchema(String schema, ResourceResolver resourceResolver);
+        void registerResourceResolverForScheme(String scheme, ResourceResolver resourceResolver);
 
         /**
          * Builds a {@link ResourceResolver} that will delegate to the respective resource resolver
-         * when a registered URI schema is given
+         * when a registered URI scheme is given
          *
-         * @return a resolver that delegates to the appropriate schema resolver
+         * @return a resolver that delegates to the appropriate scheme resolver
          */
         ResourceResolver build();
     }
 
-    private static final class CompletedSchemaAwareResourceResolverBuilder
-            implements SchemaAwareResourceResolverBuilder {
+    private static final class CompletedSchemeAwareResourceResolverBuilder
+            implements SchemeAwareResourceResolverBuilder {
 
-        private static final SchemaAwareResourceResolverBuilder INSTANCE
-                = new CompletedSchemaAwareResourceResolverBuilder();
+        private static final SchemeAwareResourceResolverBuilder INSTANCE
+                = new CompletedSchemeAwareResourceResolverBuilder();
 
         /** {@inheritDoc} */
         public ResourceResolver build() {
@@ -271,59 +276,58 @@
         }
 
         /** {@inheritDoc} */
-        public void registerResourceResolverForSchema(String schema,
+        public void registerResourceResolverForScheme(String scheme,
                 ResourceResolver resourceResolver) {
             throw new IllegalStateException("Resource resolver already built");
         }
     }
 
-    private static final class ActiveSchemaAwareResourceResolverBuilder
-            implements SchemaAwareResourceResolverBuilder {
+    private static final class ActiveSchemeAwareResourceResolverBuilder
+            implements SchemeAwareResourceResolverBuilder {
 
-        private final Map<String, ResourceResolver> schemaHandlingResourceResolvers
+        private final Map<String, ResourceResolver> schemeHandlingResourceResolvers
                 = new HashMap<String, ResourceResolver>();
 
         private final ResourceResolver defaultResolver;
 
-        private ActiveSchemaAwareResourceResolverBuilder(ResourceResolver defaultResolver) {
+        private ActiveSchemeAwareResourceResolverBuilder(ResourceResolver defaultResolver) {
             this.defaultResolver = defaultResolver;
         }
 
         /** {@inheritDoc} */
-        public void registerResourceResolverForSchema(String schema,
+        public void registerResourceResolverForScheme(String scheme,
                 ResourceResolver resourceResolver) {
-            schemaHandlingResourceResolvers.put(schema, resourceResolver);
+            schemeHandlingResourceResolvers.put(scheme, resourceResolver);
         }
 
         /** {@inheritDoc} */
         public ResourceResolver build() {
-            return new SchemaAwareResourceResolver(
-                    Collections.unmodifiableMap(schemaHandlingResourceResolvers), defaultResolver);
+            return new SchemeAwareResourceResolver(
+                    Collections.unmodifiableMap(schemeHandlingResourceResolvers), defaultResolver);
         }
 
     }
 
-    private static final class SchemaAwareResourceResolverBuilderImpl
-            implements SchemaAwareResourceResolverBuilder {
+    private static final class SchemeAwareResourceResolverBuilderImpl
+            implements SchemeAwareResourceResolverBuilder {
 
-        private SchemaAwareResourceResolverBuilder delegate;
+        private SchemeAwareResourceResolverBuilder delegate;
 
-        private SchemaAwareResourceResolverBuilderImpl(ResourceResolver defaultResolver) {
-            this.delegate = new ActiveSchemaAwareResourceResolverBuilder(defaultResolver);
+        private SchemeAwareResourceResolverBuilderImpl(ResourceResolver defaultResolver) {
+            this.delegate = new ActiveSchemeAwareResourceResolverBuilder(defaultResolver);
         }
 
         /** {@inheritDoc} */
-        public void registerResourceResolverForSchema(String schema,
+        public void registerResourceResolverForScheme(String scheme,
                 ResourceResolver resourceResolver) {
-            delegate.registerResourceResolverForSchema(schema, resourceResolver);
+            delegate.registerResourceResolverForScheme(scheme, resourceResolver);
         }
 
         /** {@inheritDoc} */
         public ResourceResolver build() {
             ResourceResolver resourceResolver = delegate.build();
-            delegate = CompletedSchemaAwareResourceResolverBuilder.INSTANCE;
+            delegate = CompletedSchemeAwareResourceResolverBuilder.INSTANCE;
             return resourceResolver;
         }
     }
-
 }
diff --git a/src/java/org/apache/fop/apps/io/TempResourceResolver.java b/src/java/org/apache/fop/apps/io/TempResourceResolver.java
deleted file mode 100644
index cf307fa..0000000
--- a/src/java/org/apache/fop/apps/io/TempResourceResolver.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * 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.apps.io;
-
-import java.io.IOException;
-import java.io.OutputStream;
-
-/**
- * Implementations of this interface resolve URIs for temporary files used by FOP. The temporary-
- * resource URI scheme comes from {@link TempResourceURIGenerator#TMP_SCHEMA}.
- */
-public interface TempResourceResolver {
-
-    /**
-     * Get a temporary-resource given the URI pointing to said resource.
-     *
-     * @param uri the resource URI
-     * @return the resource
-     * @throws IOException if an I/O error occured during resource acquisition
-     */
-    Resource getResource(String uri) throws IOException;
-
-    /**
-     * Gets an temporary-output stream of a given URI.
-     *
-     * @param uri the output stream URI
-     * @return the output stream
-     * @throws IOException if an I/O error occured while creating an output stream
-     */
-    OutputStream getOutputStream(String uri) throws IOException;
-}
diff --git a/src/java/org/apache/fop/apps/io/TempResourceURIGenerator.java b/src/java/org/apache/fop/apps/io/TempResourceURIGenerator.java
deleted file mode 100644
index 8e6c360..0000000
--- a/src/java/org/apache/fop/apps/io/TempResourceURIGenerator.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * 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.apps.io;
-
-import java.net.URI;
-import java.util.concurrent.atomic.AtomicLong;
-
-/**
- * Creates a URI for any temporary resource used within FOP.
- */
-public final class TempResourceURIGenerator {
-
-    public static final String TMP_SCHEMA = "tmp";
-
-    private final String tempURIPrefix;
-
-    private final AtomicLong counter;
-
-    /**
-     * @param uriPrefix a prefix used to name the unique URI
-     */
-    public TempResourceURIGenerator(String uriPrefix) {
-        counter = new AtomicLong();
-        tempURIPrefix = URI.create(TMP_SCHEMA + ":///" + uriPrefix).toASCIIString();
-    }
-
-    /**
-     * Generate a unique URI for a temporary resource
-     * @return the URI
-     */
-    public URI generate() {
-        return URI.create(tempURIPrefix + getUniqueId());
-    }
-
-    private String getUniqueId() {
-        return Long.toHexString(counter.getAndIncrement());
-    }
-
-    public static boolean isTempUri(URI uri) {
-        return TMP_SCHEMA.equals(uri.getScheme());
-    }
-}
diff --git a/src/java/org/apache/fop/area/CachedRenderPagesModel.java b/src/java/org/apache/fop/area/CachedRenderPagesModel.java
index fcc82cd..0837e5a 100644
--- a/src/java/org/apache/fop/area/CachedRenderPagesModel.java
+++ b/src/java/org/apache/fop/area/CachedRenderPagesModel.java
@@ -35,9 +35,10 @@
 
 import org.apache.commons.io.IOUtils;
 
+import org.apache.xmlgraphics.io.TempResourceURIGenerator;
+
 import org.apache.fop.apps.FOPException;
 import org.apache.fop.apps.FOUserAgent;
-import org.apache.fop.apps.io.TempResourceURIGenerator;
 import org.apache.fop.fonts.FontInfo;
 
 /**
diff --git a/src/java/org/apache/fop/fonts/FontManagerConfigurator.java b/src/java/org/apache/fop/fonts/FontManagerConfigurator.java
index cf92968..fc2ce06 100644
--- a/src/java/org/apache/fop/fonts/FontManagerConfigurator.java
+++ b/src/java/org/apache/fop/fonts/FontManagerConfigurator.java
@@ -29,9 +29,10 @@
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
+import org.apache.xmlgraphics.io.ResourceResolver;
+
 import org.apache.fop.apps.FOPException;
 import org.apache.fop.apps.io.InternalResourceResolver;
-import org.apache.fop.apps.io.ResourceResolver;
 import org.apache.fop.apps.io.ResourceResolverFactory;
 import org.apache.fop.fonts.substitute.FontSubstitutions;
 import org.apache.fop.fonts.substitute.FontSubstitutionsConfigurator;
diff --git a/src/java/org/apache/fop/image/loader/batik/PreloaderSVG.java b/src/java/org/apache/fop/image/loader/batik/PreloaderSVG.java
index 022ff46..3aa340a 100644
--- a/src/java/org/apache/fop/image/loader/batik/PreloaderSVG.java
+++ b/src/java/org/apache/fop/image/loader/batik/PreloaderSVG.java
@@ -45,6 +45,7 @@
 import org.apache.xmlgraphics.image.loader.impl.AbstractImagePreloader;
 import org.apache.xmlgraphics.image.loader.impl.ImageXMLDOM;
 import org.apache.xmlgraphics.image.loader.util.ImageUtil;
+import org.apache.xmlgraphics.io.XmlSourceUtil;
 import org.apache.xmlgraphics.util.MimeConstants;
 import org.apache.xmlgraphics.util.UnitConv;
 
@@ -79,7 +80,7 @@
             }
         }
         if (info != null) {
-            ImageUtil.closeQuietly(src); //Image is fully read
+            XmlSourceUtil.closeQuietly(src); //Image is fully read
         }
         return info;
     }
@@ -119,7 +120,7 @@
                     DOMSource domSrc = (DOMSource)src;
                     doc = (SVGDocument)domSrc.getNode();
                 } else {
-                    in = new UnclosableInputStream(ImageUtil.needInputStream(src));
+                    in = new UnclosableInputStream(XmlSourceUtil.needInputStream(src));
                     int length = in.available();
                     in.mark(length + 1);
                     SAXSVGDocumentFactory factory = new SAXSVGDocumentFactory(
diff --git a/src/java/org/apache/fop/image/loader/batik/PreloaderWMF.java b/src/java/org/apache/fop/image/loader/batik/PreloaderWMF.java
index 3bef0f4..43341cb 100644
--- a/src/java/org/apache/fop/image/loader/batik/PreloaderWMF.java
+++ b/src/java/org/apache/fop/image/loader/batik/PreloaderWMF.java
@@ -38,6 +38,7 @@
 import org.apache.xmlgraphics.image.loader.ImageSize;
 import org.apache.xmlgraphics.image.loader.impl.AbstractImagePreloader;
 import org.apache.xmlgraphics.image.loader.util.ImageUtil;
+import org.apache.xmlgraphics.io.XmlSourceUtil;
 
 import org.apache.fop.util.UnclosableInputStream;
 
@@ -69,7 +70,7 @@
             }
         }
         if (info != null) {
-            ImageUtil.closeQuietly(src); //Image is fully read
+            XmlSourceUtil.closeQuietly(src); //Image is fully read
         }
         return info;
     }
@@ -88,7 +89,7 @@
                 ImageContext context) {
             // parse document and get the size attributes of the svg element
 
-            InputStream in = new UnclosableInputStream(ImageUtil.needInputStream(src));
+            InputStream in = new UnclosableInputStream(XmlSourceUtil.needInputStream(src));
             try {
                 in.mark(4 + 1);
 
diff --git a/src/java/org/apache/fop/render/ps/PSDocumentHandler.java b/src/java/org/apache/fop/render/ps/PSDocumentHandler.java
index 0ec5fdd..897ed8f 100644
--- a/src/java/org/apache/fop/render/ps/PSDocumentHandler.java
+++ b/src/java/org/apache/fop/render/ps/PSDocumentHandler.java
@@ -39,6 +39,7 @@
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
+import org.apache.xmlgraphics.io.TempResourceURIGenerator;
 import org.apache.xmlgraphics.java2d.Dimension2DDouble;
 import org.apache.xmlgraphics.ps.DSCConstants;
 import org.apache.xmlgraphics.ps.PSDictionary;
@@ -53,7 +54,6 @@
 import org.apache.xmlgraphics.ps.dsc.events.DSCCommentHiResBoundingBox;
 
 import org.apache.fop.apps.MimeConstants;
-import org.apache.fop.apps.io.TempResourceURIGenerator;
 import org.apache.fop.render.intermediate.AbstractBinaryWritingIFDocumentHandler;
 import org.apache.fop.render.intermediate.IFContext;
 import org.apache.fop.render.intermediate.IFDocumentHandlerConfigurator;
diff --git a/src/java/org/apache/fop/servlet/FopServlet.java b/src/java/org/apache/fop/servlet/FopServlet.java
index 9dcf10a..c65b6af 100644
--- a/src/java/org/apache/fop/servlet/FopServlet.java
+++ b/src/java/org/apache/fop/servlet/FopServlet.java
@@ -41,14 +41,15 @@
 
 import org.apache.commons.io.output.ByteArrayOutputStream;
 
+import org.apache.xmlgraphics.io.Resource;
+import org.apache.xmlgraphics.io.ResourceResolver;
+
 import org.apache.fop.apps.FOPException;
 import org.apache.fop.apps.FOUserAgent;
 import org.apache.fop.apps.Fop;
 import org.apache.fop.apps.FopFactory;
 import org.apache.fop.apps.FopFactoryBuilder;
 import org.apache.fop.apps.MimeConstants;
-import org.apache.fop.apps.io.Resource;
-import org.apache.fop.apps.io.ResourceResolver;
 
 /**
  * Example servlet to generate a PDF from a servlet.
diff --git a/test/java/org/apache/fop/URIResolutionTestCase.java b/test/java/org/apache/fop/URIResolutionTestCase.java
index f1dd897..e101530 100644
--- a/test/java/org/apache/fop/URIResolutionTestCase.java
+++ b/test/java/org/apache/fop/URIResolutionTestCase.java
@@ -46,14 +46,15 @@
 import org.apache.xpath.XPathAPI;
 import org.apache.xpath.objects.XObject;
 
+import org.apache.xmlgraphics.io.Resource;
+import org.apache.xmlgraphics.io.ResourceResolver;
+
 import org.apache.fop.apps.FOPException;
 import org.apache.fop.apps.FOUserAgent;
 import org.apache.fop.apps.Fop;
 import org.apache.fop.apps.FopFactory;
 import org.apache.fop.apps.FopFactoryBuilder;
 import org.apache.fop.apps.MimeConstants;
-import org.apache.fop.apps.io.Resource;
-import org.apache.fop.apps.io.ResourceResolver;
 import org.apache.fop.apps.io.ResourceResolverFactory;
 import org.apache.fop.render.xml.XMLRenderer;
 
diff --git a/test/java/org/apache/fop/apps/EnvironmentalProfileFactoryTestCase.java b/test/java/org/apache/fop/apps/EnvironmentalProfileFactoryTestCase.java
index 7b03396..e94403e 100644
--- a/test/java/org/apache/fop/apps/EnvironmentalProfileFactoryTestCase.java
+++ b/test/java/org/apache/fop/apps/EnvironmentalProfileFactoryTestCase.java
@@ -21,11 +21,12 @@
 
 import org.junit.Test;
 
-import org.apache.fop.apps.io.ResourceResolver;
 
 import static org.junit.Assert.assertEquals;
 import static org.mockito.Mockito.mock;
 
+import org.apache.xmlgraphics.io.ResourceResolver;
+
 public class EnvironmentalProfileFactoryTestCase {
 
     private final URI testURI = URI.create("this.is.purely.for.test.purposes");
diff --git a/test/java/org/apache/fop/apps/MutableConfig.java b/test/java/org/apache/fop/apps/MutableConfig.java
index 79f038f..3ff3c10 100644
--- a/test/java/org/apache/fop/apps/MutableConfig.java
+++ b/test/java/org/apache/fop/apps/MutableConfig.java
@@ -24,8 +24,9 @@
 import org.apache.avalon.framework.configuration.Configuration;
 
 import org.apache.xmlgraphics.image.loader.ImageManager;
+import org.apache.xmlgraphics.image.loader.impl.AbstractImageSessionContext.FallbackResolver;
+import org.apache.xmlgraphics.io.ResourceResolver;
 
-import org.apache.fop.apps.io.ResourceResolver;
 import org.apache.fop.fonts.FontManager;
 import org.apache.fop.layoutmgr.LayoutManagerMaker;
 
@@ -130,4 +131,8 @@
     public Map<String, String> getHyphenationPatternNames() {
         return delegate.getHyphenationPatternNames();
     }
+
+    public FallbackResolver getFallbackResolver() {
+        return delegate.getFallbackResolver();
+    }
 }
diff --git a/test/java/org/apache/fop/apps/io/BaseURIResolutionTest.java b/test/java/org/apache/fop/apps/io/BaseURIResolutionTest.java
index ee337c3..2131407 100644
--- a/test/java/org/apache/fop/apps/io/BaseURIResolutionTest.java
+++ b/test/java/org/apache/fop/apps/io/BaseURIResolutionTest.java
@@ -37,6 +37,8 @@
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.io.output.ByteArrayOutputStream;
 
+import org.apache.xmlgraphics.io.ResourceResolver;
+
 import org.apache.fop.apps.FOPException;
 import org.apache.fop.apps.FOUserAgent;
 import org.apache.fop.apps.Fop;
diff --git a/test/java/org/apache/fop/apps/io/FontURIResolver.java b/test/java/org/apache/fop/apps/io/FontURIResolver.java
index d6f8367..40d6c74 100644
--- a/test/java/org/apache/fop/apps/io/FontURIResolver.java
+++ b/test/java/org/apache/fop/apps/io/FontURIResolver.java
@@ -39,6 +39,8 @@
 
 import static org.junit.Assert.assertTrue;
 
+import org.apache.xmlgraphics.io.Resource;
+
 public class FontURIResolver extends BaseURIResolutionTest {
 
     public enum Event {
diff --git a/test/java/org/apache/fop/apps/io/ResourceResolverFactoryTestCase.java b/test/java/org/apache/fop/apps/io/ResourceResolverFactoryTestCase.java
index b6b2eea..6ae34b4 100644
--- a/test/java/org/apache/fop/apps/io/ResourceResolverFactoryTestCase.java
+++ b/test/java/org/apache/fop/apps/io/ResourceResolverFactoryTestCase.java
@@ -36,6 +36,10 @@
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 
+import org.apache.xmlgraphics.io.Resource;
+import org.apache.xmlgraphics.io.ResourceResolver;
+import org.apache.xmlgraphics.io.TempResourceResolver;
+
 public class ResourceResolverFactoryTestCase {
 
     private static final byte[] DATA = new byte[]{(byte) 0, (byte) 1, (byte) 2};
@@ -193,10 +197,10 @@
         final ResourceResolver sut;
 
         TestCreateSchemaAwareResourceResolverBuilderHelper() {
-            ResourceResolverFactory.SchemaAwareResourceResolverBuilder builder
-                    = ResourceResolverFactory.createSchemaAwareResourceResolverBuilder(
+            ResourceResolverFactory.SchemeAwareResourceResolverBuilder builder
+                    = ResourceResolverFactory.createSchemeAwareResourceResolverBuilder(
                             defaultResourceResolver);
-            builder.registerResourceResolverForSchema(SCHEMA, registedResourceResolver);
+            builder.registerResourceResolverForScheme(SCHEMA, registedResourceResolver);
             sut = builder.build();
 
         }
diff --git a/test/java/org/apache/fop/apps/io/TestingResourceResolver.java b/test/java/org/apache/fop/apps/io/TestingResourceResolver.java
index 5323533..f1cd061 100644
--- a/test/java/org/apache/fop/apps/io/TestingResourceResolver.java
+++ b/test/java/org/apache/fop/apps/io/TestingResourceResolver.java
@@ -24,6 +24,8 @@
 import java.util.HashMap;
 import java.util.Map;
 
+import org.apache.xmlgraphics.io.ResourceResolver;
+
 abstract class TestingResourceResolver implements ResourceResolver {
 
     private final Map<URI, Object> checker;
diff --git a/test/java/org/apache/fop/apps/io/URIResolverWrapperTestCase.java b/test/java/org/apache/fop/apps/io/URIResolverWrapperTestCase.java
index 440b16a..b2044e3 100644
--- a/test/java/org/apache/fop/apps/io/URIResolverWrapperTestCase.java
+++ b/test/java/org/apache/fop/apps/io/URIResolverWrapperTestCase.java
@@ -35,6 +35,8 @@
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 
+import org.apache.xmlgraphics.io.ResourceResolver;
+
 public class URIResolverWrapperTestCase {
 
     private static final List<String> BASE_URIS = Collections.unmodifiableList(Arrays.asList(
diff --git a/test/java/org/apache/fop/intermediate/TestAssistant.java b/test/java/org/apache/fop/intermediate/TestAssistant.java
index 2be41dc..2b138de 100644
--- a/test/java/org/apache/fop/intermediate/TestAssistant.java
+++ b/test/java/org/apache/fop/intermediate/TestAssistant.java
@@ -42,8 +42,11 @@
 import org.apache.xpath.XPathAPI;
 import org.apache.xpath.objects.XObject;
 
+import org.apache.fop.apps.EnvironmentProfile;
+import org.apache.fop.apps.EnvironmentalProfileFactory;
 import org.apache.fop.apps.FopFactory;
 import org.apache.fop.apps.FopFactoryBuilder;
+import org.apache.fop.apps.io.ResourceResolverFactory;
 
 /**
  * Helper class for running FOP tests.
@@ -115,7 +118,10 @@
     public FopFactory getFopFactory(Document testDoc) {
         boolean base14KerningEnabled = isBase14KerningEnabled(testDoc);
         boolean strictValidation = isStrictValidation(testDoc);
-        FopFactoryBuilder builder = new FopFactoryBuilder(testDir.getParentFile().toURI());
+        EnvironmentProfile envProfile = EnvironmentalProfileFactory.createRestrictedIO(
+                testDir.getParentFile().toURI(),
+                ResourceResolverFactory.createDefaultResourceResolver());
+        FopFactoryBuilder builder = new FopFactoryBuilder(envProfile);
         builder.setStrictFOValidation(strictValidation);
         builder.getFontManager().setBase14KerningEnabled(base14KerningEnabled);
         return builder.build();
diff --git a/test/java/org/apache/fop/pdf/PDFFactoryTestCase.java b/test/java/org/apache/fop/pdf/PDFFactoryTestCase.java
index 971471f..5e4b9e2 100644
--- a/test/java/org/apache/fop/pdf/PDFFactoryTestCase.java
+++ b/test/java/org/apache/fop/pdf/PDFFactoryTestCase.java
@@ -26,8 +26,9 @@
 
 import static org.junit.Assert.assertEquals;
 
+import org.apache.xmlgraphics.io.ResourceResolver;
+
 import org.apache.fop.apps.io.InternalResourceResolver;
-import org.apache.fop.apps.io.ResourceResolver;
 import org.apache.fop.apps.io.ResourceResolverFactory;
 import org.apache.fop.fonts.CIDSet;
 import org.apache.fop.fonts.CIDSubset;
