Index: api/src/main/java/org/jboss/shrinkwrap/api/ExtensionType.java
===================================================================
--- api/src/main/java/org/jboss/shrinkwrap/api/ExtensionType.java	(revision 4443)
+++ api/src/main/java/org/jboss/shrinkwrap/api/BuiltInExtensionTypes.java	(revision )
@@ -24,23 +24,15 @@
  * @author <a href="mailto:ken@glxn.net">Ken Gullaksen</a>
  * @version $Revision: $
  */
-class ExtensionType
+class BuiltInExtensionTypes extends ExtensionTypes
 {
-   static final ExtensionType WAR = new ExtensionType("war");
-   static final ExtensionType JAR = new ExtensionType("jar");
-   static final ExtensionType EAR = new ExtensionType("ear");
-   static final ExtensionType RAR = new ExtensionType("rar");
-   private static final String DOT_DELIMITER = ".";
-   private final String extension;
+   static final BuiltInExtensionTypes WAR = new BuiltInExtensionTypes("war");
+   static final BuiltInExtensionTypes JAR = new BuiltInExtensionTypes("jar");
+   static final BuiltInExtensionTypes EAR = new BuiltInExtensionTypes("ear");
+   static final BuiltInExtensionTypes RAR = new BuiltInExtensionTypes("rar");
 
-   private ExtensionType(String extension)
+   private BuiltInExtensionTypes(String extension)
    {
-      this.extension = extension;
+      super(extension);
    }
-
-   @Override
-   public String toString()
-   {
-      return DOT_DELIMITER + extension;
-   }
+}
-}
Index: api/src/main/java/org/jboss/shrinkwrap/api/ExtensionTypes.java
===================================================================
--- api/src/main/java/org/jboss/shrinkwrap/api/ExtensionTypes.java	(revision )
+++ api/src/main/java/org/jboss/shrinkwrap/api/ExtensionTypes.java	(revision )
@@ -0,0 +1,50 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * Licensed 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.jboss.shrinkwrap.api;
+
+/**
+ * ExtensionTypes
+ * TODO: Add Class documentation
+ *
+ * @author <a href="mailto:ken@glxn.net">Ken Gullaksen</a>
+ * @version $Revision: $
+ */
+public abstract class ExtensionTypes
+{
+
+   private static final String DOT_DELIMITER = ".";
+   private final String extension;
+
+   public ExtensionTypes(String extension)
+   {
+      this.extension = extension;
+   }
+
+   @Override
+   public String toString()
+   {
+      return DOT_DELIMITER + getExtension();
+   }
+
+   public String getExtension()
+   {
+      return extension;
+   }
+
+
+}
Index: api/src/main/java/org/jboss/shrinkwrap/api/ArchiveFactory.java
===================================================================
--- api/src/main/java/org/jboss/shrinkwrap/api/ArchiveFactory.java	(revision 4446)
+++ api/src/main/java/org/jboss/shrinkwrap/api/ArchiveFactory.java	(revision )
@@ -116,8 +116,8 @@
       }
 
       // Get the extension type
-      final ExtensionType extensionType = configuration.getExtensionMappings().get(type);
-      if (extensionType == null)
+      final ExtensionTypes extensionTypes = configuration.getExtensionMappings().get(type);
+      if (extensionTypes == null)
       {
          throw UnknownExtensionTypeException.newInstance(type);
       }
@@ -126,7 +126,7 @@
       String archiveName = UUID.randomUUID().toString();
       
       // Delegate
-      return create(type, archiveName += extensionType);
+      return create(type, archiveName += extensionTypes);
    }
 
    /**
Index: impl-base/src/test/java/org/jboss/shrinkwrap/impl/base/ShrinkWrapTestCase.java
===================================================================
--- impl-base/src/test/java/org/jboss/shrinkwrap/impl/base/ShrinkWrapTestCase.java	(revision 4445)
+++ impl-base/src/test/java/org/jboss/shrinkwrap/impl/base/ShrinkWrapTestCase.java	(revision )
@@ -22,16 +22,7 @@
 import junit.framework.Assert;
 import junit.framework.TestCase;
 
-import org.jboss.shrinkwrap.api.Archive;
-import org.jboss.shrinkwrap.api.ArchivePath;
-import org.jboss.shrinkwrap.api.ArchivePaths;
-import org.jboss.shrinkwrap.api.Assignable;
-import org.jboss.shrinkwrap.api.Configuration;
-import org.jboss.shrinkwrap.api.ConfigurationBuilder;
-import org.jboss.shrinkwrap.api.Domain;
-import org.jboss.shrinkwrap.api.ExtensionLoader;
-import org.jboss.shrinkwrap.api.ShrinkWrap;
-import org.jboss.shrinkwrap.api.UnknownExtensionTypeException;
+import org.jboss.shrinkwrap.api.*;
 import org.jboss.shrinkwrap.api.formatter.Formatter;
 import org.jboss.shrinkwrap.api.spec.EnterpriseArchive;
 import org.jboss.shrinkwrap.api.spec.JavaArchive;
@@ -274,6 +265,28 @@
       ShrinkWrap.create(MockAssignable.class);
    }
 
+
+   @Test
+   public void userShouldBeAbleExtend() throws Exception
+   {
+      ShrinkWrap.getDefaultDomain().getConfiguration().getExtensionMappings().put(MockArchive.class, new MockExtensionTypes("ext"));
+      ShrinkWrap.getDefaultDomain().getConfiguration().getExtensionLoader().addOverride(MockArchive.class, MockArchiveImpl.class);
+      String archiveName = "testArchive";
+      MockArchive mockArchive = ShrinkWrap.create(MockArchive.class, archiveName);
+      Assert.assertEquals("MockArchive should have given name", archiveName, mockArchive.getName());
+   }
+
+   @Test
+   public void shouldCreateArchiveWithCorrectExtensionWhenExtendedByUser() throws Exception
+   {
+      ShrinkWrap.getDefaultDomain().getConfiguration().getExtensionMappings().put(MockArchive.class, new MockExtensionTypes("ext"));
+      ShrinkWrap.getDefaultDomain().getConfiguration().getExtensionLoader().addOverride(MockArchive.class, MockArchiveImpl.class);
+      MockArchive mockArchive = ShrinkWrap.create(MockArchive.class);
+      String archiveExtension = mockArchive.getName().substring(
+            mockArchive.getName().lastIndexOf("."));
+      Assert.assertEquals("ResourceAdapterArchive should have proper extension", ".ext", archiveExtension);
+   }
+
    //-------------------------------------------------------------------------------------||
    // Internal Helper Members ------------------------------------------------------------||
    //-------------------------------------------------------------------------------------||
@@ -364,4 +377,73 @@
 
    }
 
+   /**
+    * Used in testing user extension
+    *
+    * @author <a href="mailto:ken@glxn.net">Ken Gullaksen</a>
+    * @version $Revision: $
+    */
+   private static class MockExtensionTypes extends ExtensionTypes
+   {
+      public MockExtensionTypes(String extension)
+      {
+         super(extension);
-}
+      }
+   }
+
+   /**
+    * Used in testing user extension
+    *
+    * @author <a href="mailto:ken@glxn.net">Ken Gullaksen</a>
+    * @version $Revision: $
+    */
+   public static interface MockArchive extends Archive<MockArchive> {
+
+   }
+
+   /**
+    * Used in testing user extension
+    *
+    * @author <a href="mailto:ken@glxn.net">Ken Gullaksen</a>
+    * @version $Revision: $
+    */
+   public static class MockArchiveImpl extends ContainerBase<MockArchive> implements MockArchive
+   {
+
+      public MockArchiveImpl(Archive<?> archive)
+      {
+         super(MockArchive.class, archive);
+      }
+
+      @Override
+      protected ArchivePath getClassesPath()
+      {
+         return ArchivePaths.root();
+      }
+
+      @Override
+      protected ArchivePath getLibraryPath()
+      {
+         return ArchivePaths.root();
+      }
+
+      @Override
+      protected ArchivePath getManinfestPath()
+      {
+         return ArchivePaths.root();
+      }
+
+      @Override
+      protected ArchivePath getResourcePath()
+      {
+         return ArchivePaths.root();
+      }
+
+      @Override
+      public String toString(final Formatter formatter) throws IllegalArgumentException
+      {
+         return formatter.format(this);
+      }
+
+   }
+}
Index: api/src/main/java/org/jboss/shrinkwrap/api/ConfigurationBuilder.java
===================================================================
--- api/src/main/java/org/jboss/shrinkwrap/api/ConfigurationBuilder.java	(revision 4446)
+++ api/src/main/java/org/jboss/shrinkwrap/api/ConfigurationBuilder.java	(revision )
@@ -74,9 +74,9 @@
    private ExecutorService executorService;
 
    /**
-    * Mapping between {@link org.jboss.shrinkwrap.api.Assignable}  and {@link org.jboss.shrinkwrap.api.ExtensionType}
+    * Mapping between {@link Assignable}  and {@link org.jboss.shrinkwrap.api.ExtensionTypes}
     */
-   private Map<Class<?>, ExtensionType> extensionMappings;
+   private Map<Class<?>, ExtensionTypes> extensionMappings;
 
    //-------------------------------------------------------------------------------------||
    // Constructor ------------------------------------------------------------------------||
@@ -114,7 +114,7 @@
    /**
     * @return the extensionMapping
     */
-   public Map<Class<?>, ExtensionType> getExtensionMapping()
+   public Map<Class<?>, ExtensionTypes> getExtensionMapping()
    {
       return extensionMappings;
    }
@@ -147,7 +147,7 @@
     * @param extensionMappings the extensionMapping
     * @return the ConfigurationBuilder
     */
-   public ConfigurationBuilder extensionMappings(final Map<Class<?>, ExtensionType> extensionMappings)
+   public ConfigurationBuilder extensionMappings(final Map<Class<?>, ExtensionTypes> extensionMappings)
    {
       this.extensionMappings = extensionMappings;
       return this;
@@ -190,7 +190,7 @@
          this.extensionLoader(loader);
       }
       if(getExtensionMapping() == null) {
-         final Map<Class<?>, ExtensionType> extensionMapping = createDefaultExtensionMapping();
+         final Map<Class<?>, ExtensionTypes> extensionMapping = createDefaultExtensionMapping();
          if (log.isLoggable(Level.FINER))
          {
             log.finer("User has not defined an explicit extensionMapping; defaulting to " + extensionMapping);
@@ -215,14 +215,14 @@
     * Creates and populates the default extensionMapping
     * @return the extensionMapping
     */
-   private Map<Class<?>, ExtensionType> createDefaultExtensionMapping()
+   private Map<Class<?>, ExtensionTypes> createDefaultExtensionMapping()
    {
-      extensionMappings = new HashMap<Class<?>, ExtensionType>();
+      extensionMappings = new HashMap<Class<?>, ExtensionTypes>();
 
-      extensionMappings.put(WebArchive.class, ExtensionType.WAR);
-      extensionMappings.put(JavaArchive.class, ExtensionType.JAR);
-      extensionMappings.put(EnterpriseArchive.class, ExtensionType.EAR);
-      extensionMappings.put(ResourceAdapterArchive.class, ExtensionType.RAR);
+      extensionMappings.put(WebArchive.class, BuiltInExtensionTypes.WAR);
+      extensionMappings.put(JavaArchive.class, BuiltInExtensionTypes.JAR);
+      extensionMappings.put(EnterpriseArchive.class, BuiltInExtensionTypes.EAR);
+      extensionMappings.put(ResourceAdapterArchive.class, BuiltInExtensionTypes.RAR);
 
       return extensionMappings;
    }
Index: api/src/main/java/org/jboss/shrinkwrap/api/Configuration.java
===================================================================
--- api/src/main/java/org/jboss/shrinkwrap/api/Configuration.java	(revision 4446)
+++ api/src/main/java/org/jboss/shrinkwrap/api/Configuration.java	(revision )
@@ -55,7 +55,7 @@
     */
    private final ExecutorService executorService;
 
-   private final Map<Class<?>, ExtensionType> extensionMappings;
+   private final Map<Class<?>, ExtensionTypes> extensionMappings;
 
    //-------------------------------------------------------------------------------------||
    // Constructor ------------------------------------------------------------------------||
@@ -105,7 +105,7 @@
    /**
     * @return the extensionMapping
     */
-   public Map<Class<?>, ExtensionType> getExtensionMappings()
+   public Map<Class<?>, ExtensionTypes> getExtensionMappings()
    {
       return extensionMappings;
    }
