diff --git a/itests/jpa-container-itest/src/test/java/org/apache/aries/jpa/blueprint/aries/itest/BlueprintTest.java b/itests/jpa-container-itest/src/test/java/org/apache/aries/jpa/blueprint/aries/itest/BlueprintTest.java
index dacdcc0..f37ac34 100644
--- a/itests/jpa-container-itest/src/test/java/org/apache/aries/jpa/blueprint/aries/itest/BlueprintTest.java
+++ b/itests/jpa-container-itest/src/test/java/org/apache/aries/jpa/blueprint/aries/itest/BlueprintTest.java
@@ -61,7 +61,7 @@
             } finally {
                 coordination.end();
             }
-            carService.deleteCar(BLUE_CAR_PLATE);
+            carService.deleteCar(BLUE_PLATE);
             Assert.assertEquals(0, carService.getCars().size());
         }
     }
@@ -132,22 +132,22 @@
     private void carLifecycle(CarService carService) {
         assertNoCoordination();
         if (carService.getCar(BLACK_CAR_PLATE) != null) {
-            carService.deleteCar(BLUE_CAR_PLATE);
+            carService.deleteCar(BLUE_PLATE);
         }
         carService.addCar(createBlueCar());
-        assertBlueCar(carService.getCar(BLUE_CAR_PLATE));
-        carService.deleteCar(BLUE_CAR_PLATE);
+        assertBlueCar(carService.getCar(BLUE_PLATE));
+        carService.deleteCar(BLUE_PLATE);
     }
     
     private void carRealTransactionalLifecycle(CarService carService) throws IllegalStateException, SystemException, NotSupportedException {
         assertNoCoordination();
         if (carService.getCar(BLACK_CAR_PLATE) != null) {
-            carService.deleteCar(BLUE_CAR_PLATE);
+            carService.deleteCar(BLUE_PLATE);
         }
         ut.begin();
         carService.addCar(createBlueCar());
         ut.rollback();
-        Assert.assertNull(carService.getCar(BLUE_CAR_PLATE));
+        Assert.assertNull(carService.getCar(BLUE_PLATE));
     }
 
     private void assertNoCoordination() {
diff --git a/itests/jpa-container-itest/src/test/java/org/apache/aries/jpa/container/itest/JPAContainerTest.java b/itests/jpa-container-itest/src/test/java/org/apache/aries/jpa/container/itest/JPAContainerTest.java
index 73c12f6..7ba38fe 100644
--- a/itests/jpa-container-itest/src/test/java/org/apache/aries/jpa/container/itest/JPAContainerTest.java
+++ b/itests/jpa-container-itest/src/test/java/org/apache/aries/jpa/container/itest/JPAContainerTest.java
@@ -57,25 +57,49 @@
     public void testCarEMF() throws Exception {
         carLifecycleRL(getEMF(TEST_UNIT).createEntityManager());
     }
+
+    @Test
+    public void testTruckEMF() throws Exception {
+    	truckLifecycleRL(getEMF(TEST_UNIT).createEntityManager());
+    }
     
     @Test
-    public void testEMFXA() throws Exception {
+    public void testCarEMFXA() throws Exception {
         EntityManager em = getEMF(XA_TEST_UNIT).createEntityManager();
         carLifecycleXA(ut, em);
         em.close();
     }
 
     @Test
-    public void testDataSourceFactoryLifecycle() throws Exception {
+    public void testTruckEMFXA() throws Exception {
+    	EntityManager em = getEMF(XA_TEST_UNIT).createEntityManager();
+    	truckLifecycleXA(ut, em);
+    	em.close();
+    }
+
+    @Test
+    public void testCarDataSourceFactoryLifecycle() throws Exception {
         carLifecycleRL(getEMF(DSF_TEST_UNIT).createEntityManager());
     }
 
     @Test
-    public void testDataSourceFactoryXALifecycle() throws Exception {
+    public void testTruckDataSourceFactoryLifecycle() throws Exception {
+    	truckLifecycleRL(getEMF(DSF_TEST_UNIT).createEntityManager());
+    }
+
+    @Test
+    public void testCarDataSourceFactoryXALifecycle() throws Exception {
         EntityManager em = getEMF(DSF_XA_TEST_UNIT).createEntityManager();
         carLifecycleXA(ut, em);
         em.close();
     }
+
+    @Test
+    public void testTruckDataSourceFactoryXALifecycle() throws Exception {
+    	EntityManager em = getEMF(DSF_XA_TEST_UNIT).createEntityManager();
+    	truckLifecycleXA(ut, em);
+    	em.close();
+    }
     
 
     @Test
@@ -106,7 +130,7 @@
 
             ut.begin();
             em.joinTransaction();
-            changeToRed(em.find(Car.class, BLUE_CAR_PLATE));
+            changeToRed(em.find(Car.class, BLUE_PLATE));
             em.remove(em.find(Car.class, GREEN_CAR_PLATE));
             em.persist(createBlackCar());
             ut.commit();
@@ -133,8 +157,8 @@
     private void cleanup(EntityManager em) throws Exception {
         ut.begin();
         em.joinTransaction();
-        delete(em, BLACK_CAR_PLATE);
-        delete(em, BLUE_CAR_PLATE);
+        delete(em, Car.class, BLACK_CAR_PLATE);
+        delete(em, Car.class, BLUE_PLATE);
         ut.commit();
     }
 
@@ -142,7 +166,7 @@
         assertEquals(2, car.getNumberOfSeats());
         assertEquals(2000, car.getEngineSize());
         assertEquals("red", car.getColour());
-        assertEquals(BLUE_CAR_PLATE, car.getNumberPlate());
+        assertEquals(BLUE_PLATE, car.getNumberPlate());
     }
 
     @Test
@@ -165,6 +189,25 @@
     }
 
     @Test
+    public void testTruckEMFBuilderExternalDS() throws Exception {
+    	DataSourceFactory dsf = getService(DataSourceFactory.class, 
+    			"(" + OSGI_JDBC_DRIVER_CLASS + "=org.apache.derby.jdbc.EmbeddedDriver)");
+    	
+    	EntityManagerFactoryBuilder emfBuilder = getService(EntityManagerFactoryBuilder.class,
+    			"(osgi.unit.name=" + EXTERNAL_TEST_UNIT + ")");
+    	
+    	Properties jdbcProps = new Properties();
+    	jdbcProps.setProperty("url", "jdbc:derby:memory:DSFTEST;create=true");
+    	
+    	Map<String, Object> props = new HashMap<String, Object>();
+    	props.put("javax.persistence.nonJtaDataSource", dsf.createDataSource(jdbcProps));
+    	props.put("javax.persistence.transactionType", RESOURCE_LOCAL.name());
+    	
+    	EntityManagerFactory emf = emfBuilder.createEntityManagerFactory(props);
+    	truckLifecycleRL(emf.createEntityManager());
+    }
+
+    @Test
     public void testCarEMFBuilderExternalDSXA() throws Exception {
     	EntityManagerFactoryBuilder emfBuilder = getService(EntityManagerFactoryBuilder.class,
     			"(osgi.unit.name=" + EXTERNAL_TEST_UNIT + ")");
@@ -177,6 +220,20 @@
     	EntityManagerFactory emf = emfBuilder.createEntityManagerFactory(props);
     	carLifecycleXA(ut, emf.createEntityManager());
     }
+
+    @Test
+    public void testTruckEMFBuilderExternalDSXA() throws Exception {
+    	EntityManagerFactoryBuilder emfBuilder = getService(EntityManagerFactoryBuilder.class,
+    			"(osgi.unit.name=" + EXTERNAL_TEST_UNIT + ")");
+    	
+    	Map<String, Object> props = new HashMap<String, Object>();
+    	props.put("javax.persistence.jtaDataSource", ds);
+    	props.put("javax.persistence.transactionType", JTA.name());
+    	//EclipseLink also needs a non-jta-datasource
+    	props.put("javax.persistence.nonJtaDataSource", ds);
+    	EntityManagerFactory emf = emfBuilder.createEntityManagerFactory(props);
+    	truckLifecycleXA(ut, emf.createEntityManager());
+    }
     
     @Test
     public void testCarEMFBuilderNoNonJTADataSource() throws Exception {
@@ -187,9 +244,25 @@
         Properties jdbcProps = new Properties();
         jdbcProps.setProperty("url", "jdbc:derby:memory:TESTNOJTA;create=true");
         props.put("javax.persistence.dataSource", dsf.createDataSource(jdbcProps));
+        props.put("javax.persistence.transactionType", RESOURCE_LOCAL.name());
         
         EntityManagerFactory emf = emfBuilder.createEntityManagerFactory(props);
         carLifecycleRL(emf.createEntityManager());
     }
+    
+    @Test
+    public void testTruckEMFBuilderNoNonJTADataSource() throws Exception {
+    	EntityManagerFactoryBuilder emfBuilder = getService(EntityManagerFactoryBuilder.class,
+    			"(osgi.unit.name=" + EXTERNAL_TEST_UNIT + ")");
+    	
+    	Map<String, Object> props = new HashMap<String, Object>();
+    	Properties jdbcProps = new Properties();
+    	jdbcProps.setProperty("url", "jdbc:derby:memory:TESTNOJTA;create=true");
+    	props.put("javax.persistence.dataSource", dsf.createDataSource(jdbcProps));
+    	props.put("javax.persistence.transactionType", RESOURCE_LOCAL.name());
+    	
+    	EntityManagerFactory emf = emfBuilder.createEntityManagerFactory(props);
+    	truckLifecycleRL(emf.createEntityManager());
+    }
 
 }
diff --git a/itests/jpa-container-itest/src/test/java/org/apache/aries/jpa/itest/AbstractCarJPAITest.java b/itests/jpa-container-itest/src/test/java/org/apache/aries/jpa/itest/AbstractCarJPAITest.java
index df36b7b..e81af3a 100644
--- a/itests/jpa-container-itest/src/test/java/org/apache/aries/jpa/itest/AbstractCarJPAITest.java
+++ b/itests/jpa-container-itest/src/test/java/org/apache/aries/jpa/itest/AbstractCarJPAITest.java
@@ -21,11 +21,12 @@
 import javax.transaction.UserTransaction;
 
 import org.apache.aries.jpa.container.itest.entities.Car;
+import org.apache.aries.jpa.container.itest.entities.mapped.Truck;
 import org.junit.Assert;
 import org.osgi.framework.BundleException;
 
 public abstract class AbstractCarJPAITest extends AbstractJPAItest {
-    protected static final String BLUE_CAR_PLATE = "A1AAA";
+    protected static final String BLUE_PLATE = "A1AAA";
     protected static final String GREEN_CAR_PLATE = "B2BBB";
     protected static final String BLACK_CAR_PLATE = "C3CCC";
 
@@ -34,10 +35,19 @@
         car.setNumberOfSeats(5);
         car.setEngineSize(1200);
         car.setColour("blue");
-        car.setNumberPlate(BLUE_CAR_PLATE);
+        car.setNumberPlate(BLUE_PLATE);
         return car;
     }
 
+    protected Truck createBlueTruck() {
+    	Truck truck = new Truck();
+    	truck.setMaxLoad(5000.0d);
+    	truck.setEngineSize(1200);
+    	truck.setColour("blue");
+    	truck.setNumberPlate(BLUE_PLATE);
+    	return truck;
+    }
+
     protected Car createGreenCar() {
         Car car;
         car = new Car();
@@ -64,7 +74,15 @@
         assertEquals(5, car.getNumberOfSeats());
         assertEquals(1200, car.getEngineSize());
         assertEquals("blue", car.getColour());
-        assertEquals(BLUE_CAR_PLATE, car.getNumberPlate());
+        assertEquals(BLUE_PLATE, car.getNumberPlate());
+    }
+    
+    protected void assertBlueTruck(Truck truck) {
+    	Assert.assertNotNull("Blue car not found (null)", truck);
+    	assertEquals(5000.0d, truck.getMaxLoad(), 0.0d);
+    	assertEquals(1200, truck.getEngineSize());
+    	assertEquals("blue", truck.getColour());
+    	assertEquals(BLUE_PLATE, truck.getNumberPlate());
     }
 
     protected void assertGreenCar(Car car) {
@@ -92,7 +110,7 @@
         em.persist(car);
         em.getTransaction().commit();
 
-        Car car2 = em.find(Car.class, BLUE_CAR_PLATE);
+        Car car2 = em.find(Car.class, BLUE_PLATE);
         assertBlueCar(car2);
         em.getTransaction().begin();
         em.remove(car2);
@@ -101,6 +119,25 @@
     }
 
     /**
+     * Create, find and delete truck using resource local transactions
+     * @param emf
+     * @throws BundleException
+     */
+    protected void truckLifecycleRL(EntityManager em) throws BundleException {
+    	em.getTransaction().begin();
+    	Truck truck = createBlueTruck();
+    	em.persist(truck);
+    	em.getTransaction().commit();
+    	
+    	Truck truck2 = em.find(Truck.class, BLUE_PLATE);
+    	assertBlueTruck(truck2);
+    	em.getTransaction().begin();
+    	em.remove(truck2);
+    	em.getTransaction().commit();
+    	em.close();
+    }
+
+    /**
      * Create, find and delete car using XA Transactions
      * @param ut
      * @param em
@@ -109,23 +146,45 @@
     protected void carLifecycleXA(UserTransaction ut, EntityManager em) throws Exception {
         ut.begin();
         em.joinTransaction();
-        delete(em, BLUE_CAR_PLATE);
+        delete(em, Car.class, BLUE_PLATE);
         em.persist(createBlueCar());
         ut.commit();
 
-        Car c = em.find(Car.class, BLUE_CAR_PLATE);
+        Car c = em.find(Car.class, BLUE_PLATE);
         assertBlueCar(c);
 
         ut.begin();
         em.joinTransaction();
-        delete(em, BLUE_CAR_PLATE);
+        delete(em, Car.class, BLUE_PLATE);
         ut.commit();
     }
 
-    protected void delete(EntityManager em, String plateId) {
-        Car car = em.find(Car.class, plateId);
-        if (car != null) {
-            em.remove(car);
+    /**
+     * Create, find and delete car using XA Transactions
+     * @param ut
+     * @param em
+     * @throws Exception
+     */
+    protected void truckLifecycleXA(UserTransaction ut, EntityManager em) throws Exception {
+    	ut.begin();
+    	em.joinTransaction();
+    	delete(em, Truck.class, BLUE_PLATE);
+    	em.persist(createBlueTruck());
+    	ut.commit();
+    	
+    	Truck t = em.find(Truck.class, BLUE_PLATE);
+    	assertBlueTruck(t);
+    	
+    	ut.begin();
+    	em.joinTransaction();
+    	delete(em, Truck.class, BLUE_PLATE);
+    	ut.commit();
+    }
+
+    protected <T> void delete(EntityManager em, Class<T> type, String plateId) {
+        T vehicle = em.find(type, plateId);
+        if (vehicle != null) {
+            em.remove(vehicle);
         }
     }
 }
diff --git a/itests/jpa-container-testbundle/src/main/java/org/apache/aries/jpa/container/itest/entities/mapped/Truck.java b/itests/jpa-container-testbundle/src/main/java/org/apache/aries/jpa/container/itest/entities/mapped/Truck.java
new file mode 100644
index 0000000..3fb51a1
--- /dev/null
+++ b/itests/jpa-container-testbundle/src/main/java/org/apache/aries/jpa/container/itest/entities/mapped/Truck.java
@@ -0,0 +1,64 @@
+/*
+ * 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 WARRANTIESOR 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.aries.jpa.container.itest.entities.mapped;
+
+public class Truck {
+  
+  private String numberPlate;
+  
+  private String colour;
+  
+  private int engineSize;
+  
+  private double maxLoad;
+
+  public String getNumberPlate() {
+    return numberPlate;
+  }
+
+  public void setNumberPlate(String numberPlate) {
+    this.numberPlate = numberPlate;
+  }
+
+  public String getColour() {
+    return colour;
+  }
+
+  public void setColour(String colour) {
+    this.colour = colour;
+  }
+
+  public int getEngineSize() {
+    return engineSize;
+  }
+
+  public void setEngineSize(int engineSize) {
+    this.engineSize = engineSize;
+  }
+
+  public double getMaxLoad() {
+    return maxLoad;
+  }
+
+  public void setMaxLoad(double maxLoad) {
+    this.maxLoad = maxLoad;
+  }
+  
+  
+}
diff --git a/itests/jpa-container-testbundle/src/main/java/org/apache/aries/jpa/container/itest/entities/mapped/packageinfo b/itests/jpa-container-testbundle/src/main/java/org/apache/aries/jpa/container/itest/entities/mapped/packageinfo
new file mode 100644
index 0000000..c72722a
--- /dev/null
+++ b/itests/jpa-container-testbundle/src/main/java/org/apache/aries/jpa/container/itest/entities/mapped/packageinfo
@@ -0,0 +1,19 @@
+#
+# 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.
+#
+version 1.0.0
diff --git a/itests/jpa-container-testbundle/src/main/resources/META-INF/custom-mapping.xml b/itests/jpa-container-testbundle/src/main/resources/META-INF/custom-mapping.xml
new file mode 100644
index 0000000..7b8d8e2
--- /dev/null
+++ b/itests/jpa-container-testbundle/src/main/resources/META-INF/custom-mapping.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://xmlns.jcp.org/xml/ns/persistence/orm_2_0.xsd"
+    version="2.0">
+
+    <package>org.apache.aries.jpa.container.itest.entities.mapped</package>
+    <entity class="org.apache.aries.jpa.container.itest.entities.mapped.Truck" name="Truck">
+        <named-query name="GET_DEVELOPER">
+            <query>SELECT DISTINCT record FROM Car record ORDER BY record.engineSize</query>
+        </named-query>
+        <attributes>
+            <id name="numberPlate">
+                <column name="PLATE" length="255" />
+            </id>
+            <basic name="colour">
+                <column name="COLOUR" length="255" />
+            </basic>
+            <basic name="engineSize">
+                <column name="ENGINE_SIZE" />
+            </basic>
+            <basic name="maxLoad">
+                <column name="MAX_LOAD" length="255" />
+            </basic>
+        </attributes>
+    </entity>
+</entity-mappings>
\ No newline at end of file
diff --git a/itests/jpa-container-testbundle/src/main/resources/META-INF/persistence.xml b/itests/jpa-container-testbundle/src/main/resources/META-INF/persistence.xml
index 6d4fd63..535803c 100644
--- a/itests/jpa-container-testbundle/src/main/resources/META-INF/persistence.xml
+++ b/itests/jpa-container-testbundle/src/main/resources/META-INF/persistence.xml
@@ -26,6 +26,7 @@
     <description>Test persistence unit for the JPA Container and Context iTests</description>
     
     <non-jta-data-source>osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=testds)</non-jta-data-source>
+    <mapping-file>META-INF/custom-mapping.xml</mapping-file>
     <properties>
         <!-- This is to avoid compile time enhancement which would conflict with hibernate -->
         <property name="openjpa.RuntimeUnenhancedClasses" value="supported"/>
@@ -45,6 +46,7 @@
      <description>Test persistence unit for the JPA Container advanced iTests</description>
      
      <jta-data-source>osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=testdsxa)</jta-data-source>
+     <mapping-file>META-INF/custom-mapping.xml</mapping-file>
      <properties>
         <!-- These properties are creating the database on the fly. We are using them to avoid the tests having to create a database -->
         <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)" />
@@ -58,6 +60,7 @@
 
   <persistence-unit name="dsf-test-unit" transaction-type="RESOURCE_LOCAL">
     <description>Test persistence unit for the JPA Container DataSourceFactory iTests</description>
+    <mapping-file>META-INF/custom-mapping.xml</mapping-file>
     <properties>
         <!-- These properties are creating the database on the fly. We are using them to avoid the tests having
           to create a database  -->
@@ -74,6 +77,7 @@
   
   <persistence-unit name="dsf-xa-test-unit" transaction-type="JTA">
     <description>Test persistence unit for the JPA Container DataSourceFactory iTests</description>
+    <mapping-file>META-INF/custom-mapping.xml</mapping-file>
     <properties>
       <!-- These properties are creating the database on the fly. We are using them to avoid the tests having to create a database  -->
       <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver"/>
@@ -89,6 +93,7 @@
   
   <persistence-unit name="external-test-unit">
     <description>Test persistence unit for the JPA Container External DataSource iTests</description>
+    <mapping-file>META-INF/custom-mapping.xml</mapping-file>
     <properties>
         <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/>
         <property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>
diff --git a/jpa-container/src/main/java/org/apache/aries/jpa/container/parser/impl/JPAHandler.java b/jpa-container/src/main/java/org/apache/aries/jpa/container/parser/impl/JPAHandler.java
index d2f0386..307a76b 100644
--- a/jpa-container/src/main/java/org/apache/aries/jpa/container/parser/impl/JPAHandler.java
+++ b/jpa-container/src/main/java/org/apache/aries/jpa/container/parser/impl/JPAHandler.java
@@ -103,6 +103,8 @@
             pu.setNonJtaDataSourceName(s);
         else if ("class".equals(elementName))
             pu.addClassName(s);
+        else if("mapping-file".equals(elementName))
+        	pu.addMappingFile(s);
         else if ("exclude-unlisted-classes".equals(elementName))
             pu.setExcludeUnlisted(Boolean.parseBoolean(s));
         else if ("shared-cache-mode".equals(elementName))
diff --git a/jpa-container/src/main/java/org/apache/aries/jpa/container/parser/impl/PersistenceUnit.java b/jpa-container/src/main/java/org/apache/aries/jpa/container/parser/impl/PersistenceUnit.java
index 34e7911..1652f99 100644
--- a/jpa-container/src/main/java/org/apache/aries/jpa/container/parser/impl/PersistenceUnit.java
+++ b/jpa-container/src/main/java/org/apache/aries/jpa/container/parser/impl/PersistenceUnit.java
@@ -44,6 +44,7 @@
     private Bundle bundle;
     private ClassLoader classLoader;
     private Set<String> classNames;
+    private Set<String> mappingFileNames;
     private boolean excludeUnlisted;
     private DataSource jtaDataSource;
     private String jtaDataSourceName;
@@ -65,11 +66,16 @@
         this.props = new Properties();
         this.classLoader = bundle.adapt(BundleWiring.class).getClassLoader();
         this.classNames = new HashSet<String>();
+        this.mappingFileNames = new HashSet<String>();
     }
 
     public void addClassName(String className) {
         this.classNames.add(className);
     }
+    
+    public void addMappingFile(String mappingFileName) {
+        this.mappingFileNames.add(mappingFileName);
+    }
 
     public void addProperty(String name, String value) {
         props.put(name, value);
@@ -116,7 +122,7 @@
 
     @Override
     public List<String> getMappingFileNames() {
-        return Collections.emptyList();
+    	return new ArrayList<String>(mappingFileNames);
     }
 
     public String getName() {
