diff --git a/src/main/src/main/java/org/geoserver/catalog/ResourcePool.java b/src/main/src/main/java/org/geoserver/catalog/ResourcePool.java
index 5d7b91e..b9610dd 100644
--- a/src/main/src/main/java/org/geoserver/catalog/ResourcePool.java
+++ b/src/main/src/main/java/org/geoserver/catalog/ResourcePool.java
@@ -47,6 +47,7 @@ import org.geoserver.config.GeoServerDataDirectory;
 import org.geoserver.data.util.CoverageStoreUtils;
 import org.geoserver.data.util.CoverageUtils;
 import org.geoserver.feature.retype.RetypingDataStore;
+import org.geoserver.feature.retype.RetypingFeatureSource;
 import org.geotools.coverage.grid.GridCoverage2D;
 import org.geotools.coverage.grid.io.AbstractGridFormat;
 import org.geotools.data.DataAccess;
@@ -735,29 +736,9 @@ public class ResourcePool {
         final SimpleFeatureType nativeFeatureType = dataStore.getSchema( typeName );
         final SimpleFeatureType featureType = (SimpleFeatureType) getFeatureType( info );
         if ( !typeName.equals( alias ) || DataUtilities.compare(nativeFeatureType,featureType) != 0 ) {
-            
-            RetypingDataStore retyper = new RetypingDataStore(dataStore) {
-            
-                @Override
-                protected String transformFeatureTypeName(String originalName) {
-                    if(!typeName.equals(originalName))
-                        return originalName;
-                    return alias;
-                }
-                
-                @Override
-                protected SimpleFeatureType transformFeatureType(SimpleFeatureType original)
-                        throws IOException {
-                    if ( original.getTypeName().equals( typeName ) ) {
-                        return featureType;
-                    }
-                    return super.transformFeatureType(original);
-                }
-            
-            };
-            fs = retyper.getFeatureSource(alias);
-        }
-        else {
+            // rename and retype as necessary
+            return RetypingFeatureSource.getRetypingSource(dataStore.getFeatureSource(typeName), featureType);
+        } else {
             //normal case
             fs = dataStore.getFeatureSource(info.getQualifiedName());   
         }
diff --git a/src/main/src/main/java/org/geoserver/feature/retype/FeatureTypeMap.java b/src/main/src/main/java/org/geoserver/feature/retype/FeatureTypeMap.java
index c5d4161..65a2433 100644
--- a/src/main/src/main/java/org/geoserver/feature/retype/FeatureTypeMap.java
+++ b/src/main/src/main/java/org/geoserver/feature/retype/FeatureTypeMap.java
@@ -25,6 +25,13 @@ class FeatureTypeMap {
         this.originalName = originalName;
         this.name = name;
     }
+    
+    public FeatureTypeMap(SimpleFeatureType originalFeatureType, SimpleFeatureType featureType) {
+        this.originalFeatureType = originalFeatureType;
+        this.featureType = featureType;
+        this.originalName = originalFeatureType.getTypeName();
+        this.name = featureType.getTypeName();
+    }
 
     public String getOriginalName() {
         return originalName;
diff --git a/src/main/src/main/java/org/geoserver/feature/retype/RetypingDataStore.java b/src/main/src/main/java/org/geoserver/feature/retype/RetypingDataStore.java
index 38ee260..a88aeac 100644
--- a/src/main/src/main/java/org/geoserver/feature/retype/RetypingDataStore.java
+++ b/src/main/src/main/java/org/geoserver/feature/retype/RetypingDataStore.java
@@ -110,10 +110,9 @@ public class RetypingDataStore implements DataStore {
 
     public String[] getTypeNames() throws IOException {
         // here we transform the names, and also refresh the type maps so that
-        // they
-        // don't contain stale elements
+        // they don't contain stale elements
         String[] names = wrapped.getTypeNames();
-        String[] transformedNames = new String[names.length];
+        List<String> transformedNames = new ArrayList<String>();
         Map<String, FeatureTypeMap> backup = new HashMap<String, FeatureTypeMap>(forwardMap);
         
         // Populate local hashmaps with new values.
@@ -122,21 +121,24 @@ public class RetypingDataStore implements DataStore {
         
         for (int i = 0; i < names.length; i++) {
             String original = names[i];
-            transformedNames[i] = transformFeatureTypeName(original);
-
-            FeatureTypeMap map = backup.get(original);
-            if (map == null) {
-                map = new FeatureTypeMap(original, transformedNames[i]);
+            String transformedName = transformFeatureTypeName(original);
+            if(transformedName != null) {
+                transformedNames.add(transformedName);
+                
+                FeatureTypeMap map = backup.get(original);
+                if (map == null) {
+                    map = new FeatureTypeMap(original, transformedName);
+                }
+                forwardMapLocal.put(map.getOriginalName(), map);
+                backwardsMapLocal.put(map.getName(), map);
             }
-            forwardMapLocal.put(map.getOriginalName(), map);
-            backwardsMapLocal.put(map.getName(), map);
         }
         
         // Replace the member variables.
         forwardMap = forwardMapLocal;
         backwardsMap = backwardsMapLocal;
         
-        return transformedNames;
+        return (String[]) transformedNames.toArray(new String[transformedNames.size()]);
     }
 
     public FeatureReader<SimpleFeatureType, SimpleFeature> getFeatureReader(Query query,
@@ -235,17 +237,13 @@ public class RetypingDataStore implements DataStore {
     }
 
     /**
-     * Just transform the feature type name
+     * Just transform the feature type name, or return null if the original type name is
+     * to be hidden
      * 
      * @param originalName
      * @return
      */
     protected String transformFeatureTypeName(String originalName) {
-//        if(originalName.indexOf(":") >= 0) {
-//            return originalName.substring(originalName.indexOf(":") + 1);
-//        } else {
-//            return originalName;
-//        }
          return originalName.replaceAll(":", "_");
     }
 
diff --git a/src/main/src/main/java/org/geoserver/feature/retype/RetypingFeatureLocking.java b/src/main/src/main/java/org/geoserver/feature/retype/RetypingFeatureLocking.java
index 1778ff3..bbfa1bf 100644
--- a/src/main/src/main/java/org/geoserver/feature/retype/RetypingFeatureLocking.java
+++ b/src/main/src/main/java/org/geoserver/feature/retype/RetypingFeatureLocking.java
@@ -18,11 +18,15 @@ import org.opengis.filter.Filter;
 class RetypingFeatureLocking extends RetypingFeatureStore implements
         SimpleFeatureLocking {
 
-    public RetypingFeatureLocking(RetypingDataStore ds,
+    RetypingFeatureLocking(RetypingDataStore ds,
             SimpleFeatureLocking wrapped, FeatureTypeMap typeMap) {
         super(ds, wrapped, typeMap);
     }
     
+    RetypingFeatureLocking(SimpleFeatureLocking wrapped, FeatureTypeMap typeMap) throws IOException {
+        super(wrapped, typeMap);
+    }
+    
     SimpleFeatureLocking featureLocking() {
         return (SimpleFeatureLocking) wrapped;
     }
diff --git a/src/main/src/main/java/org/geoserver/feature/retype/RetypingFeatureSource.java b/src/main/src/main/java/org/geoserver/feature/retype/RetypingFeatureSource.java
index 15d4b27..fdd2f64 100644
--- a/src/main/src/main/java/org/geoserver/feature/retype/RetypingFeatureSource.java
+++ b/src/main/src/main/java/org/geoserver/feature/retype/RetypingFeatureSource.java
@@ -18,7 +18,9 @@ import org.geotools.data.Query;
 import org.geotools.data.QueryCapabilities;
 import org.geotools.data.ResourceInfo;
 import org.geotools.data.simple.SimpleFeatureCollection;
+import org.geotools.data.simple.SimpleFeatureLocking;
 import org.geotools.data.simple.SimpleFeatureSource;
+import org.geotools.data.simple.SimpleFeatureStore;
 import org.geotools.feature.simple.SimpleFeatureTypeBuilder;
 import org.geotools.geometry.jts.ReferencedEnvelope;
 import org.opengis.feature.simple.SimpleFeatureType;
@@ -38,6 +40,26 @@ public class RetypingFeatureSource implements SimpleFeatureSource{
     RetypingDataStore store;
 
     Map listeners = new HashMap();
+    
+    /**
+     * Builds a retyping wrapper
+     * @param wrapped
+     * @param targetTypeName 
+     * @param targetSchema The target schema can have a different name and less attributes than the original one
+     * @return
+     */
+    public static SimpleFeatureSource getRetypingSource(SimpleFeatureSource wrapped, SimpleFeatureType targetSchema) throws IOException {
+        FeatureTypeMap map = new FeatureTypeMap(wrapped.getSchema(), targetSchema);
+        
+        if(wrapped instanceof SimpleFeatureLocking) {
+            return new RetypingFeatureLocking((SimpleFeatureLocking) wrapped, map);
+        } else if(wrapped instanceof SimpleFeatureStore) {
+            return new RetypingFeatureStore((SimpleFeatureStore) wrapped, map);
+        } else {
+            return new RetypingFeatureSource(wrapped, map);
+        }
+        
+    }
 
     RetypingFeatureSource(RetypingDataStore ds,
             SimpleFeatureSource wrapped, FeatureTypeMap typeMap) {
@@ -45,7 +67,36 @@ public class RetypingFeatureSource implements SimpleFeatureSource{
         this.wrapped = wrapped;
         this.typeMap = typeMap;
     }
-
+    
+    RetypingFeatureSource(SimpleFeatureSource wrapped, final FeatureTypeMap typeMap) throws IOException {
+        this.wrapped = wrapped;
+        this.typeMap = typeMap;
+        this.store = new RetypingDataStore((DataStore) wrapped.getDataStore()) {
+            @Override
+            protected String transformFeatureTypeName(String originalName) {
+                if(typeMap.getOriginalName().equals(originalName)) {
+                    // rename
+                    return typeMap.getName();
+                } else if(typeMap.getName().equals(originalName)) {
+                    // hide
+                    return null;
+                } else {
+                    return originalName;
+                }
+            }
+            
+            @Override
+            protected SimpleFeatureType transformFeatureType(SimpleFeatureType original)
+                    throws IOException {
+                if(typeMap.getOriginalName().equals(original)) {
+                    return typeMap.featureType;
+                } else {
+                    return super.transformFeatureType(original);
+                }
+            }
+        };
+    }
+    
     /**
      * Returns the same name than the feature type (ie,
      * {@code getSchema().getName()} to honor the simple feature land common
diff --git a/src/main/src/main/java/org/geoserver/feature/retype/RetypingFeatureStore.java b/src/main/src/main/java/org/geoserver/feature/retype/RetypingFeatureStore.java
index 6360ff4..7c83240 100644
--- a/src/main/src/main/java/org/geoserver/feature/retype/RetypingFeatureStore.java
+++ b/src/main/src/main/java/org/geoserver/feature/retype/RetypingFeatureStore.java
@@ -29,10 +29,14 @@ import org.opengis.filter.identity.FeatureId;
  */
 public class RetypingFeatureStore extends RetypingFeatureSource implements SimpleFeatureStore {
 
-    public RetypingFeatureStore(RetypingDataStore ds,
+    RetypingFeatureStore(RetypingDataStore ds,
             SimpleFeatureStore wrapped, FeatureTypeMap typeMap) {
         super(ds, wrapped, typeMap);
     }
+    
+    RetypingFeatureStore(SimpleFeatureStore wrapped, FeatureTypeMap typeMap) throws IOException {
+        super(wrapped, typeMap);
+    }
 
     protected SimpleFeatureStore featureStore() {
         return (SimpleFeatureStore) wrapped;
diff --git a/src/main/src/test/java/org/geoserver/feature/retype/RetypingFeatureSourceTest.java b/src/main/src/test/java/org/geoserver/feature/retype/RetypingFeatureSourceTest.java
new file mode 100644
index 0000000..e7cb7dc
--- /dev/null
+++ b/src/main/src/test/java/org/geoserver/feature/retype/RetypingFeatureSourceTest.java
@@ -0,0 +1,111 @@
+package org.geoserver.feature.retype;
+
+import static org.geoserver.data.test.MockData.*;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+import java.util.Collections;
+
+import javax.xml.namespace.QName;
+
+import junit.framework.TestCase;
+
+import org.geoserver.data.test.MockData;
+import org.geoserver.data.util.IOUtils;
+import org.geotools.data.DataStore;
+import org.geotools.data.Query;
+import org.geotools.data.property.PropertyDataStore;
+import org.geotools.data.simple.SimpleFeatureIterator;
+import org.geotools.data.simple.SimpleFeatureLocking;
+import org.geotools.data.simple.SimpleFeatureSource;
+import org.geotools.factory.CommonFactoryFinder;
+import org.geotools.feature.simple.SimpleFeatureTypeBuilder;
+import org.opengis.feature.simple.SimpleFeature;
+import org.opengis.feature.simple.SimpleFeatureType;
+import org.opengis.filter.Filter;
+import org.opengis.filter.FilterFactory;
+
+public class RetypingFeatureSourceTest extends TestCase {
+
+    static final String RENAMED = "houses";
+
+    RetypingDataStore rts;
+
+    private File data;
+
+    private PropertyDataStore store;
+
+    @Override
+    protected void setUp() throws Exception {
+        data = File.createTempFile("retype", "data", new File("./target"));
+        data.delete();
+        data.mkdir();
+
+        copyTestData(BUILDINGS, data);
+        copyTestData(BRIDGES, data);
+
+        store = new PropertyDataStore(data);
+    }
+
+    void copyTestData(QName testData, File data) throws IOException {
+        String fileName = testData.getLocalPart() + ".properties";
+        URL properties = MockData.class.getResource(fileName);
+        IOUtils.copy(properties.openStream(), new File(data, fileName));
+    }
+
+    public void testSimpleRename() throws IOException {
+        SimpleFeatureSource fs = store.getFeatureSource(BUILDINGS.getLocalPart());
+        SimpleFeatureTypeBuilder tb = new SimpleFeatureTypeBuilder();
+        tb.init(fs.getSchema());
+        tb.setName("houses");
+        SimpleFeatureType target = tb.buildFeatureType();
+
+        SimpleFeatureSource retyped = RetypingFeatureSource.getRetypingSource(fs, target);
+        assertTrue(retyped instanceof SimpleFeatureLocking);
+        assertEquals(target, retyped.getSchema());
+        assertEquals(target, ((DataStore) retyped.getDataStore()).getSchema("houses"));
+        assertEquals(target, retyped.getFeatures().getSchema());
+
+        SimpleFeatureIterator it = retyped.getFeatures().features();
+        SimpleFeature f = it.next();
+        it.close();
+        assertEquals(target, f.getType());
+    }
+
+    public void testConflictingRename() throws IOException {
+        // we rename buildings to a feature type that's already available in the data store
+        SimpleFeatureSource fs = store.getFeatureSource(BUILDINGS.getLocalPart());
+        assertEquals(2, store.getTypeNames().length);
+        assertNotNull(store.getSchema(BRIDGES.getLocalPart()));
+
+        SimpleFeatureTypeBuilder tb = new SimpleFeatureTypeBuilder();
+        tb.init(fs.getSchema());
+        tb.setName(BRIDGES.getLocalPart());
+        SimpleFeatureType target = tb.buildFeatureType();
+
+        SimpleFeatureSource retyped = RetypingFeatureSource.getRetypingSource(fs, target);
+        assertEquals(target, retyped.getSchema());
+        DataStore rs = (DataStore) retyped.getDataStore();
+        assertEquals(1, rs.getTypeNames().length);
+        assertEquals(BRIDGES.getLocalPart(), rs.getTypeNames()[0]);
+
+        FilterFactory ff = CommonFactoryFinder.getFilterFactory(null);
+        String fid = BRIDGES.getLocalPart() + ".1107531701011";
+        Filter fidFilter = ff.id(Collections.singleton(ff.featureId(fid)));
+
+        SimpleFeatureIterator it = retyped.getFeatures(fidFilter).features();
+        assertTrue(it.hasNext());
+        SimpleFeature f = it.next();
+        assertFalse(it.hasNext());
+        it.close();
+
+        // _=the_geom:MultiPolygon,FID:String,ADDRESS:String
+        // Buildings.1107531701010=MULTIPOLYGON (((0.0008 0.0005, 0.0008 0.0007, 0.0012 0.0007,
+        // 0.0012 0.0005, 0.0008 0.0005)))|113|123 Main Street
+        // Buildings.1107531701011=MULTIPOLYGON (((0.002 0.0008, 0.002 0.001, 0.0024 0.001, 0.0024
+        // 0.0008, 0.002 0.0008)))|114|215 Main Street
+        assertEquals("114", f.getAttribute("FID"));
+        assertEquals("215 Main Street", f.getAttribute("ADDRESS"));
+    }
+}
diff --git a/src/main/src/test/java/org/geoserver/test/GeoServerTestSupport.java b/src/main/src/test/java/org/geoserver/test/GeoServerTestSupport.java
index 6dc95f3..8eb7a04 100644
--- a/src/main/src/test/java/org/geoserver/test/GeoServerTestSupport.java
+++ b/src/main/src/test/java/org/geoserver/test/GeoServerTestSupport.java
@@ -26,7 +26,7 @@ import org.geoserver.data.test.MockData;
  * </p>
  * @author Justin Deoliveira, The Open Planning Project, jdeolive@openplans.org
  */
-public class GeoServerTestSupport extends GeoServerAbstractTestSupport {
+public abstract class GeoServerTestSupport extends GeoServerAbstractTestSupport {
     
    
     @Override
