diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..686d81a
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,8 @@
+*.i??
+.project
+.classpath
+.settings
+target
+eclipse-classes
+bin
+*.log
diff --git a/geronimo-jaspi/pom.xml b/geronimo-jaspi/pom.xml
index 1f48c07..7e6aa08 100644
--- a/geronimo-jaspi/pom.xml
+++ b/geronimo-jaspi/pom.xml
@@ -16,7 +16,7 @@
     limitations under the License.
 -->
 
-<!-- $Rev$ $Date$ -->
+<!-- $Rev: 1032962 $ $Date: 2010-11-09 04:23:49 -0800 (Tue, 09 Nov 2010) $ -->
 
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 
@@ -31,11 +31,11 @@
 
     <groupId>org.apache.geronimo.components</groupId>
     <artifactId>geronimo-jaspi</artifactId>
-    <version>1.1.2-SNAPSHOT</version>
+    <version>2.0-SNAPSHOT</version>
     <packaging>bundle</packaging>
     <name>Apache Geronimo JASPI implementation</name>
 
-    <description>Geronimo JASPI implementation using jaxb/sxc for simple xml persistence.</description>
+    <description>Geronimo JASPI implementation using xml/jaxb for simple xml configuration.</description>
 
     <scm>
         <connection>scm:svn:http://svn.apache.org/repos/asf/geronimo/components/jaspi/trunk/geronimo-jaspi</connection>
@@ -89,12 +89,12 @@
             <version>3.6</version>
         </dependency>
 
-        <dependency>
-            <groupId>org.apache.geronimo.bundles</groupId>
-            <artifactId>sxc-jaxb</artifactId>
-            <!--<version>0.8-SNAPSHOT</version>-->
-            <version>0.7.2_1</version>
-        </dependency>
+        <!--<dependency>-->
+            <!--<groupId>org.apache.geronimo.bundles</groupId>-->
+            <!--<artifactId>sxc-jaxb</artifactId>-->
+            <!--&lt;!&ndash;<version>0.8-SNAPSHOT</version>&ndash;&gt;-->
+            <!--<version>0.7.2_1</version>-->
+        <!--</dependency>-->
 
         <!--<dependency>-->
             <!--<groupId>org.apache.geronimo.bundles</groupId>-->
@@ -108,12 +108,12 @@
             <!--<version>2.2_1</version>-->
         <!--</dependency>-->
 
-        <dependency>
-            <groupId>com.sun.xml.bind</groupId>
-            <artifactId>jaxb-xjc</artifactId>
-            <version>2.2</version>
-            <scope>provided</scope>
-        </dependency>
+        <!--<dependency>-->
+            <!--<groupId>com.sun.xml.bind</groupId>-->
+            <!--<artifactId>jaxb-xjc</artifactId>-->
+            <!--<version>2.2</version>-->
+            <!--<scope>provided</scope>-->
+        <!--</dependency>-->
 
         <dependency>
             <groupId>org.testng</groupId>
@@ -161,20 +161,22 @@
                 <version>2.3.4</version>
                 <configuration>
                     <instructions>
-                        <Export-Package>org.apache.geronimo.components.jaspi*;version=1.0</Export-Package>
+                        <Export-Package>
+                            org.apache.geronimo.components.jaspi;version=2.0,
+                            org.apache.geronimo.components.jaspi.model;version=2.0
+                        </Export-Package>
                         <Export-SPI-Provider>org.apache.geronimo.components.jaspi.AuthConfigFactoryImpl</Export-SPI-Provider>
                         <Import-Package>
-                            org.apache.geronimo.components.jaspi*;version="[1.0,1.1)",
-                            com.sun.xml.bind.*:resolution:=optional,
+                            !org.apache.geronimo.components.jaspi.*,
+                            org.apache.geronimo.osgi.registry.api;resolution:=optional,
                             *
                         </Import-Package>
-                        <!-- once a maven-bundle-plugin that can interpret the impl/uses version policy is released we can remove the explicit version ranges on import-package -->
                         <_versionpolicy-impl>[$(version;==;$(@)),$(version;=+;$(@)))</_versionpolicy-impl>
                         <_versionpolicy-uses>[$(version;==;$(@)),$(version;+;$(@)))</_versionpolicy-uses>
                         <Specification-Version>1.0</Specification-Version>
                         <Specification-Title>JASPIC</Specification-Title>
                         <Specification-Vendor>Sun Microsystems</Specification-Vendor>
-                        <Private-Package>org.apache.geronimo.osgi.locator;sxc*</Private-Package>
+                        <Private-Package>org.apache.geronimo.osgi.locator</Private-Package>
                         <Bundle-Activator>org.apache.geronimo.osgi.locator.Activator</Bundle-Activator>
                     </instructions>
                 </configuration>
@@ -190,7 +192,7 @@
                     <plugin>
                         <groupId>org.jvnet.jaxb2.maven2</groupId>
                         <artifactId>maven-jaxb2-plugin</artifactId>
-                        <version>0.5</version>
+                        <version>0.7.2</version>
                         <executions>
                             <execution>
                                 <goals>
@@ -199,13 +201,22 @@
                             </execution>
                         </executions>
                         <configuration>
-                            <schemaDirectory>src/main/xsd</schemaDirectory>
-                            <packageName>org.apache.geronimo.components.jaspi.model</packageName>
+                            <generatePackage>org.apache.geronimo.components.jaspi.model</generatePackage>
+                            <specVersion>2.1</specVersion>
                             <extension>true</extension>
+                            <episode>true</episode>
                         </configuration>
                     </plugin>
                 </plugins>
             </build>
+            <!--<dependencies>-->
+                <!--<dependency>-->
+                    <!--<groupId>com.sun.xml.bind</groupId>-->
+                    <!--<artifactId>jaxb-xjc</artifactId>-->
+                    <!--<version>2.2</version>-->
+                    <!--<scope>provided</scope>-->
+                <!--</dependency>-->
+            <!--</dependencies>-->
         </profile>
         <profile>
             <id>sxc-generate</id>
diff --git a/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/AuthConfigFactoryImpl.java b/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/AuthConfigFactoryImpl.java
index 5dd426d..5f98cd0 100644
--- a/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/AuthConfigFactoryImpl.java
+++ b/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/AuthConfigFactoryImpl.java
@@ -16,9 +16,11 @@
  */
 package org.apache.geronimo.components.jaspi;
 
+import org.apache.geronimo.components.jaspi.impl.ConfigProviderImpl;
 import org.apache.geronimo.components.jaspi.model.ConfigProviderType;
 import org.apache.geronimo.components.jaspi.model.JaspiType;
 import org.apache.geronimo.components.jaspi.model.JaspiXmlUtil;
+import org.apache.geronimo.components.jaspi.model.ObjectFactory;
 import org.xml.sax.SAXException;
 
 import javax.security.auth.AuthPermission;
@@ -30,14 +32,12 @@
 import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.stream.XMLStreamException;
 import java.io.File;
-import java.io.FileOutputStream;
 import java.io.FileReader;
 import java.io.FileWriter;
 import java.io.IOException;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.Writer;
 import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -53,7 +53,8 @@
     public static CallbackHandler staticCallbackHandler;
 
     private static ClassLoader contextClassLoader;
-    private JaspiType jaspiType = new JaspiType();
+
+    private Map<String, ConfigProviderInfo> configProviders = Collections.emptyMap();
 
     private final CallbackHandler callbackHandler;
     private final File configFile;
@@ -94,14 +95,20 @@
         return file;
     }
 
+    public AuthConfigFactoryImpl(JaspiType jaspiType, CallbackHandler callbackHandler) {
+        this.callbackHandler = callbackHandler;
+        this.configFile = null;
+        initialize(jaspiType);
+    }
+
     public synchronized String[] detachListener(RegistrationListener listener, String layer, String appContext) throws SecurityException {
         SecurityManager sm = System.getSecurityManager();
         if (sm != null) {
             sm.checkPermission(new AuthPermission("detachAuthListener"));
         }
         List<String> ids = new ArrayList<String>();
-        for (Map.Entry<String, ConfigProviderType> entry : getRegistrations().entrySet()) {
-            ConfigProviderType ctx = entry.getValue();
+        for (Map.Entry<String, ConfigProviderInfo> entry : getRegistrations().entrySet()) {
+            ConfigProviderInfo ctx = entry.getValue();
             if ((layer == null || layer.equals(ctx.getMessageLayer())) &&
                     (appContext == null || appContext.equals(ctx.getAppContext()))) {
                 if (ctx.getListeners().remove(listener)) {
@@ -112,8 +119,8 @@
         return ids.toArray(new String[ids.size()]);
     }
 
-    private Map<String, ConfigProviderType> getRegistrations() {
-        return jaspiType.getConfigProvider();
+    private Map<String, ConfigProviderInfo> getRegistrations() {
+        return configProviders;
     }
 
     public synchronized AuthConfigProvider getConfigProvider(String layer, String appContext, RegistrationListener listener) {
@@ -123,7 +130,7 @@
         if (appContext == null) {
             throw new NullPointerException("appContext");
         }
-        ConfigProviderType ctx = getRegistrations().get(ConfigProviderType.getRegistrationKey(layer, appContext));
+        ConfigProviderInfo ctx = getRegistrations().get(ConfigProviderType.getRegistrationKey(layer, appContext));
         if (ctx == null) {
             ctx = getRegistrations().get(ConfigProviderType.getRegistrationKey(null, appContext));
         }
@@ -137,7 +144,7 @@
             if (listener != null) {
                 ctx.getListeners().add(listener);
             }
-            return ctx.getProvider();
+            return ctx.getAuthConfigProvider();
         }
         return null;
     }
@@ -148,10 +155,10 @@
 
     public synchronized String[] getRegistrationIDs(AuthConfigProvider provider) {
         List<String> ids = new ArrayList<String>();
-        for (Map.Entry<String, ConfigProviderType> entry : getRegistrations().entrySet()) {
-            ConfigProviderType ctx = entry.getValue();
+        for (Map.Entry<String, ConfigProviderInfo> entry : getRegistrations().entrySet()) {
+            ConfigProviderInfo ctx = entry.getValue();
             if (provider == null ||
-                    provider.getClass().getName().equals(ctx.getProvider().getClass().getName())) {
+                    provider.getClass().getName().equals(ctx.getAuthConfigProvider().getClass().getName())) {
                 ids.add(entry.getKey());
             }
         }
@@ -187,16 +194,18 @@
     private String registerConfigProvider(AuthConfigProvider provider, String layer, String appContext, String description, boolean persistent, Map<String, String> constructorParam, String className) {
         String key = ConfigProviderType.getRegistrationKey(layer, appContext);
         // Get or create context
-        ConfigProviderType ctx = getRegistrations().get(key);
-        if (ctx == null) {
-            ctx = new ConfigProviderType(layer, appContext, persistent, persistent? null: this);
-            getRegistrations().put(key, ctx);
+        ConfigProviderInfo info = getRegistrations().get(key);
+        List<RegistrationListener> listeners;
+        if (info == null) {
+            listeners = new ArrayList<RegistrationListener>();
         } else {
-            if (persistent != ctx.isPersistent()) {
+            if (persistent != info.isPersistent()) {
                 throw new IllegalArgumentException("Cannot change the persistence state");
             }
+            listeners = info.getListeners();
         }
         // Create provider
+        ConfigProviderType ctx = new ConfigProviderType(layer, appContext, persistent, persistent? null: this);
         ctx.setDescription(description);
         if (persistent) {
             if (provider != null) {
@@ -204,18 +213,18 @@
             }
             ctx.setClassName(className);
             ctx.setProperties(constructorParam);
-            ctx.initialize(callbackHandler);
+            provider = ConfigProviderImpl.newConfigProvider(this, ctx);
         } else {
             if (provider == null) {
                 throw new IllegalStateException("No config provider to set");
             }
-            ctx.setProvider(provider);
         }
+        info = new ConfigProviderInfo(provider, ctx, listeners, persistent);
+        getRegistrations().put(key, info);
 
         // Notify listeners
-        List<RegistrationListener> listeners = ctx.getListeners();
         for (RegistrationListener listener : listeners) {
-            listener.notify(ctx.getMessageLayer(), ctx.getAppContext());
+            listener.notify(info.getMessageLayer(), info.getAppContext());
         }
         // Return registration Id
         return key;
@@ -226,7 +235,7 @@
         if (sm != null) {
             sm.checkPermission(new AuthPermission("removeAuthRegistration"));
         }
-        ConfigProviderType ctx = getRegistrations().remove(registrationID);
+        ConfigProviderInfo ctx = getRegistrations().remove(registrationID);
         saveConfig();
         if (ctx != null) {
             List<RegistrationListener> listeners = ctx.getListeners();
@@ -240,6 +249,7 @@
 
     private void loadConfig() {
         if (configFile != null && configFile.length() > 0) {
+            JaspiType jaspiType;
             try {
                 FileReader in = new FileReader(configFile);
                 try {
@@ -258,14 +268,36 @@
             } catch (XMLStreamException e) {
                 throw new SecurityException("Could not read config", e);
             }
+            initialize(jaspiType);
         }
     }
 
+    private void initialize(JaspiType jaspiType) {
+        Map<String, ConfigProviderInfo> configProviderInfos = new HashMap<String, ConfigProviderInfo>();
+        try {
+            for (ConfigProviderType configProviderType: jaspiType.getConfigProvider()) {
+                AuthConfigProvider authConfigProvider = ConfigProviderImpl.newConfigProvider(this, configProviderType);
+                ConfigProviderInfo info = new ConfigProviderInfo(authConfigProvider, configProviderType, true);
+                configProviderInfos.put(configProviderType.getKey(), info);
+            }
+        } catch (Exception e) {
+            throw new SecurityException("Could not map config providers", e);
+        }
+        this.configProviders = configProviderInfos;
+    }
+
+
     private void saveConfig() {
         if (configFile != null) {
+            JaspiType jaspiType = new ObjectFactory().createJaspiType();
+
             try {
-                OutputStream outStream = new FileOutputStream(configFile);
-                Writer out = new OutputStreamWriter(outStream, "UTF-8");
+                for (ConfigProviderInfo info: configProviders.values()) {
+                    if (info.isPersistent()) {
+                        jaspiType.getConfigProvider().add(info.getConfigProviderType());
+                    }
+                }
+                FileWriter out = new FileWriter(configFile);
                 try {
                     JaspiXmlUtil.writeJaspi(jaspiType, out);
                 } finally {
@@ -277,9 +309,64 @@
                 throw new SecurityException("Could not write config", e);
             } catch (JAXBException e) {
                 throw new SecurityException("Could not write config", e);
+            } catch (Exception e) {
+                throw new SecurityException("Could not write config", e);
             }
         }
     }
 
 
+    private static class ConfigProviderInfo implements AuthConfigFactory.RegistrationContext {
+        private final AuthConfigProvider authConfigProvider;
+        private final ConfigProviderType configProviderType;
+        private final boolean persistent;
+        private final List<RegistrationListener> listeners;
+
+        private ConfigProviderInfo(AuthConfigProvider authConfigProvider, ConfigProviderType configProviderType, boolean persistent) {
+            this.authConfigProvider = authConfigProvider;
+            this.configProviderType = configProviderType;
+            this.persistent = persistent;
+            listeners = new ArrayList<RegistrationListener>();
+        }
+
+        private ConfigProviderInfo(AuthConfigProvider authConfigProvider, ConfigProviderType configProviderType, List<RegistrationListener> listeners, boolean persistent) {
+            this.authConfigProvider = authConfigProvider;
+            this.configProviderType = configProviderType;
+            this.listeners = listeners;
+            this.persistent = persistent;
+        }
+
+        public AuthConfigProvider getAuthConfigProvider() {
+            return authConfigProvider;
+        }
+
+        public ConfigProviderType getConfigProviderType() {
+            return configProviderType;
+        }
+
+        public List<RegistrationListener> getListeners() {
+            return listeners;
+        }
+
+        @Override
+        public String getAppContext() {
+            return configProviderType.getAppContext();
+        }
+
+        @Override
+        public String getDescription() {
+            return configProviderType.getDescription();
+        }
+
+        @Override
+        public String getMessageLayer() {
+            return configProviderType.getMessageLayer();
+        }
+
+        @Override
+        public boolean isPersistent() {
+            return persistent;
+        }
+    }
+
 }
diff --git a/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/impl/ClientAuthConfigImpl.java b/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/impl/ClientAuthConfigImpl.java
new file mode 100644
index 0000000..75d623c
--- /dev/null
+++ b/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/impl/ClientAuthConfigImpl.java
@@ -0,0 +1,67 @@
+/*
+ * 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.geronimo.components.jaspi.impl;
+
+import java.util.Map;
+
+import javax.security.auth.Subject;
+import javax.security.auth.message.AuthException;
+import javax.security.auth.message.MessageInfo;
+import javax.security.auth.message.config.ClientAuthConfig;
+import javax.security.auth.message.config.ClientAuthContext;
+import org.apache.geronimo.components.jaspi.model.ClientAuthConfigType;
+
+/**
+* @version $Rev:$ $Date:$
+*/
+public class ClientAuthConfigImpl implements ClientAuthConfig {
+
+    private final ClientAuthConfigType clientAuthConfigType;
+    private final Map<String, ClientAuthContext> clientAuthContextMap;
+
+    public ClientAuthConfigImpl(ClientAuthConfigType clientAuthConfigType, Map<String, ClientAuthContext> clientAuthContextMap) {
+        this.clientAuthConfigType = clientAuthConfigType;
+        this.clientAuthContextMap = clientAuthContextMap;
+    }
+
+    public ClientAuthContext getAuthContext(String authContextID, Subject clientSubject, Map properties) throws AuthException {
+        return clientAuthContextMap.get(authContextID);
+    }
+
+    public String getAppContext() {
+        return clientAuthConfigType.getAppContext();
+    }
+
+    public String getAuthContextID(MessageInfo messageInfo) throws IllegalArgumentException {
+        return clientAuthConfigType.getAuthContextID(messageInfo);
+    }
+
+    public String getMessageLayer() {
+        return clientAuthConfigType.getMessageLayer();
+    }
+
+    public boolean isProtected() {
+        return clientAuthConfigType.isProtected();
+    }
+
+    public void refresh() throws SecurityException {
+    }
+}
diff --git a/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/impl/ClientAuthContextImpl.java b/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/impl/ClientAuthContextImpl.java
new file mode 100644
index 0000000..3ff9acc
--- /dev/null
+++ b/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/impl/ClientAuthContextImpl.java
@@ -0,0 +1,80 @@
+/*
+ * 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.geronimo.components.jaspi.impl;
+
+import java.util.List;
+
+import javax.security.auth.Subject;
+import javax.security.auth.message.AuthException;
+import javax.security.auth.message.AuthStatus;
+import javax.security.auth.message.MessageInfo;
+import javax.security.auth.message.config.ClientAuthContext;
+import javax.security.auth.message.module.ClientAuthModule;
+
+/**
+* @version $Rev:$ $Date:$
+*/
+public class ClientAuthContextImpl implements ClientAuthContext {
+
+    private final List<ClientAuthModule> clientAuthModules;
+
+    public ClientAuthContextImpl(List<ClientAuthModule> clientAuthModules) {
+        this.clientAuthModules = clientAuthModules;
+    }
+
+    public void cleanSubject(MessageInfo messageInfo, Subject subject) throws AuthException {
+        for (ClientAuthModule clientAuthModule : clientAuthModules) {
+            clientAuthModule.cleanSubject(messageInfo, subject);
+        }
+    }
+
+    public AuthStatus secureRequest(MessageInfo messageInfo, Subject clientSubject) throws AuthException {
+        for (ClientAuthModule clientAuthModule : clientAuthModules) {
+            AuthStatus result = clientAuthModule.secureRequest(messageInfo, clientSubject);
+
+            //jaspi spec p 74
+            if (result == AuthStatus.SUCCESS) {
+                continue;
+            }
+            if (result == AuthStatus.SEND_CONTINUE || result == AuthStatus.FAILURE) {
+                return result;
+            }
+            throw new AuthException("Invalid AuthStatus " + result + " from client auth module: " + clientAuthModule);
+        }
+        return AuthStatus.SUCCESS;
+    }
+
+    public AuthStatus validateResponse(MessageInfo messageInfo, Subject clientSubject, Subject serviceSubject) throws AuthException {
+        for (ClientAuthModule clientAuthModule : clientAuthModules) {
+            AuthStatus result = clientAuthModule.validateResponse(messageInfo, clientSubject, serviceSubject);
+
+            //jaspi spec p 74
+            if (result == AuthStatus.SUCCESS) {
+                continue;
+            }
+            if (result == AuthStatus.SEND_CONTINUE || result == AuthStatus.FAILURE) {
+                return result;
+            }
+            throw new AuthException("Invalid AuthStatus " + result + " from client auth module: " + clientAuthModule);
+        }
+        return AuthStatus.SUCCESS;
+    }
+}
diff --git a/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/impl/ConfigProviderImpl.java b/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/impl/ConfigProviderImpl.java
new file mode 100644
index 0000000..85134ff
--- /dev/null
+++ b/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/impl/ConfigProviderImpl.java
@@ -0,0 +1,347 @@
+/*
+ * 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.geronimo.components.jaspi.impl;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.security.auth.callback.CallbackHandler;
+import javax.security.auth.message.AuthException;
+import javax.security.auth.message.MessagePolicy;
+import javax.security.auth.message.config.AuthConfigFactory;
+import javax.security.auth.message.config.AuthConfigProvider;
+import javax.security.auth.message.config.ClientAuthConfig;
+import javax.security.auth.message.config.ClientAuthContext;
+import javax.security.auth.message.config.ServerAuthConfig;
+import javax.security.auth.message.config.ServerAuthContext;
+import javax.security.auth.message.module.ClientAuthModule;
+import javax.security.auth.message.module.ServerAuthModule;
+import org.apache.geronimo.components.jaspi.model.AuthModuleType;
+import org.apache.geronimo.components.jaspi.model.ClientAuthConfigType;
+import org.apache.geronimo.components.jaspi.model.ClientAuthContextType;
+import org.apache.geronimo.components.jaspi.model.ConfigProviderType;
+import org.apache.geronimo.components.jaspi.model.KeyedObjectMapAdapter;
+import org.apache.geronimo.components.jaspi.model.MessagePolicyType;
+import org.apache.geronimo.components.jaspi.model.ProtectionPolicyType;
+import org.apache.geronimo.components.jaspi.model.ServerAuthConfigType;
+import org.apache.geronimo.components.jaspi.model.ServerAuthContextType;
+import org.apache.geronimo.components.jaspi.model.TargetPolicyType;
+import org.apache.geronimo.components.jaspi.model.TargetType;
+import org.apache.geronimo.osgi.locator.ProviderLocator;
+
+/**
+* @version $Rev:$ $Date:$
+*/
+public class ConfigProviderImpl implements AuthConfigProvider {
+
+    private final Map<String, ClientAuthConfigType> clientConfigTypeMap;
+    private final Map<String, ServerAuthConfigType> serverAuthConfigMap;
+
+    public ConfigProviderImpl(List<ClientAuthConfigType> clientAuthConfigTypes, List<ServerAuthConfigType> serverAuthConfigTypes) {
+        try {
+            this.clientConfigTypeMap =  new KeyedObjectMapAdapter<ClientAuthConfigType>().unmarshal(clientAuthConfigTypes);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+        try {
+            this.serverAuthConfigMap = new KeyedObjectMapAdapter<ServerAuthConfigType>().unmarshal(serverAuthConfigTypes);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * spec required constructor
+     * @param properties useless properties map
+     * @param factory useless factory
+     */
+    public ConfigProviderImpl(Map<String, String> properties, AuthConfigFactory factory) {
+        throw new RuntimeException("don't call this");
+    }
+
+    public ClientAuthConfig getClientAuthConfig(String layer, String appContext, CallbackHandler handler) throws AuthException, SecurityException {
+        if (layer == null) {
+            throw new NullPointerException("messageLayer");
+        }
+        if (appContext == null) {
+            throw new NullPointerException("appContext");
+        }
+        ClientAuthConfigType ctx = clientConfigTypeMap.get(ConfigProviderType.getRegistrationKey(layer, appContext));
+        if (ctx == null) {
+            ctx = clientConfigTypeMap.get(ConfigProviderType.getRegistrationKey(null, appContext));
+        }
+        if (ctx == null) {
+            ctx = clientConfigTypeMap.get(ConfigProviderType.getRegistrationKey(layer, null));
+        }
+        if (ctx == null) {
+            ctx = clientConfigTypeMap.get(ConfigProviderType.getRegistrationKey(null, null));
+        }
+        if (ctx != null) {
+
+            return newClientAuthConfig(ctx, layer, appContext, handler);
+        }
+        throw new AuthException("No suitable ClientAuthConfig");
+    }
+
+    public ServerAuthConfig getServerAuthConfig(String layer, String appContext, CallbackHandler handler) throws AuthException, SecurityException {
+        if (layer == null) {
+            throw new NullPointerException("messageLayer");
+        }
+        if (appContext == null) {
+            throw new NullPointerException("appContext");
+        }
+        ServerAuthConfigType ctx = serverAuthConfigMap.get(ConfigProviderType.getRegistrationKey(layer, appContext));
+        if (ctx == null) {
+            ctx = serverAuthConfigMap.get(ConfigProviderType.getRegistrationKey(null, appContext));
+        }
+        if (ctx == null) {
+            ctx = serverAuthConfigMap.get(ConfigProviderType.getRegistrationKey(layer, null));
+        }
+        if (ctx == null) {
+            ctx = serverAuthConfigMap.get(ConfigProviderType.getRegistrationKey(null, null));
+        }
+        if (ctx != null) {
+
+            return newServerAuthConfig(ctx, layer, appContext, handler);
+        }
+        throw new AuthException("No suitable ServerAuthConfig");
+    }
+
+    public void refresh() throws SecurityException {
+    }
+
+    public static AuthConfigProvider newConfigProvider(final AuthConfigFactory authConfigFactory, final ConfigProviderType configProviderType) {
+        AuthConfigProvider provider;
+        if (configProviderType.getClassName() == null) {
+            provider = new ConfigProviderImpl(configProviderType.getClientAuthConfig(), configProviderType.getServerAuthConfig());
+        } else {
+            try {
+                provider = java.security.AccessController
+                .doPrivileged(new PrivilegedExceptionAction<AuthConfigProvider>() {
+                    public AuthConfigProvider run() throws ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException {
+                        Class<? extends AuthConfigProvider> cl = ProviderLocator.loadClass(configProviderType.getClassName(), getClass(), Thread.currentThread().getContextClassLoader()).asSubclass(AuthConfigProvider.class);
+                        Constructor<? extends AuthConfigProvider> cnst = cl.getConstructor(Map.class, AuthConfigFactory.class);
+                        return cnst.newInstance(configProviderType.getProperties(), authConfigFactory);
+                    }
+                });
+            } catch (PrivilegedActionException e) {
+                Exception inner = e.getException();
+                if (inner instanceof InstantiationException) {
+                    throw new SecurityException("AuthConfigFactory error:"
+                                    + inner.getCause().getMessage(), inner.getCause());
+                } else {
+                    throw new SecurityException("AuthConfigFactory error: " + inner, inner);
+                }
+            } catch (Exception e) {
+                throw new SecurityException("AuthConfigFactory error: " + e, e);
+            }
+        }
+        return provider;
+    }
+
+    static ClientAuthConfig newClientAuthConfig(ClientAuthConfigType clientAuthConfigType, String messageLayer, String appContext, CallbackHandler callbackHandler) throws AuthException {
+        Map<String, ClientAuthContext> authContextMap = new HashMap<String, ClientAuthContext>();
+        for (ClientAuthContextType clientAuthContextType: clientAuthConfigType.getClientAuthContext()) {
+            if (match(clientAuthContextType, messageLayer, appContext)) {
+                ClientAuthContext clientAuthContext = newClientAuthContext(clientAuthContextType, callbackHandler);
+                String authContextID = clientAuthContextType.getAuthenticationContextID();
+                if (authContextID == null) {
+                    authContextID = clientAuthConfigType.getAuthenticationContextID();
+                }
+                if (!authContextMap.containsKey(authContextID)) {
+                    authContextMap.put(authContextID,  clientAuthContext);
+                }
+            }
+        }
+        return new ClientAuthConfigImpl(clientAuthConfigType, authContextMap);
+    }
+
+    static ClientAuthContext newClientAuthContext(ClientAuthContextType clientAuthContextType, CallbackHandler callbackHandler) throws AuthException {
+        List<ClientAuthModule> clientAuthModules = new ArrayList<ClientAuthModule>();
+        for (AuthModuleType<ClientAuthModule> clientAuthModuleType: clientAuthContextType.getClientAuthModule()) {
+            ClientAuthModule instance = newAuthModule(clientAuthModuleType, callbackHandler);
+            clientAuthModules.add(instance);
+        }
+        return new ClientAuthContextImpl(clientAuthModules);
+    }
+
+    private static boolean match(ClientAuthContextType clientAuthContextType, String messageLayer, String appContext) {
+        if (messageLayer == null) throw new NullPointerException("messageLayer");
+        if (appContext == null) throw new NullPointerException("appContext");
+        if (messageLayer.equals(clientAuthContextType.getMessageLayer())) {
+            return appContext.equals(clientAuthContextType.getAppContext()) || clientAuthContextType.getAppContext() == null;
+        }
+        if (clientAuthContextType.getMessageLayer() == null) {
+            return appContext.equals(clientAuthContextType.getAppContext()) || clientAuthContextType.getAppContext() == null;
+        }
+        return false;
+    }
+
+
+    static ServerAuthConfig newServerAuthConfig(ServerAuthConfigType serverAuthConfigType, String messageLayer, String appContext, CallbackHandler callbackHandler) throws AuthException {
+        Map<String, ServerAuthContext> authContextMap = new HashMap<String, ServerAuthContext>();
+        for (ServerAuthContextType serverAuthContextType: serverAuthConfigType.getServerAuthContext()) {
+            if (match(serverAuthContextType, messageLayer, appContext)) {
+                ServerAuthContext serverAuthContext = newServerAuthContext(serverAuthContextType, callbackHandler);
+                String authContextID = serverAuthContextType.getAuthenticationContextID();
+                if (authContextID == null) {
+                    authContextID = serverAuthConfigType.getAuthenticationContextID();
+                }
+                if (!authContextMap.containsKey(authContextID)) {
+                    authContextMap.put(authContextID,  serverAuthContext);
+                }
+            }
+        }
+        return new ServerAuthConfigImpl(serverAuthConfigType, authContextMap);
+    }
+
+    static ServerAuthContext newServerAuthContext(ServerAuthContextType serverAuthContextType, CallbackHandler callbackHandler) throws AuthException {
+        List<ServerAuthModule> serverAuthModules = new ArrayList<ServerAuthModule>();
+        for (AuthModuleType<ServerAuthModule> serverAuthModuleType: serverAuthContextType.getServerAuthModule()) {
+            ServerAuthModule instance = newAuthModule(serverAuthModuleType, callbackHandler);
+            serverAuthModules.add(instance);
+        }
+        return new ServerAuthContextImpl(serverAuthModules);
+    }
+
+    private static boolean match(ServerAuthContextType serverAuthContextType, String messageLayer, String appContext) {
+        if (messageLayer == null) throw new NullPointerException("messageLayer");
+        if (appContext == null) throw new NullPointerException("appContext");
+        if (messageLayer.equals(serverAuthContextType.getMessageLayer())) {
+            return appContext.equals(serverAuthContextType.getAppContext()) || serverAuthContextType.getAppContext() == null;
+        }
+        if (serverAuthContextType.getMessageLayer() == null) {
+            return appContext.equals(serverAuthContextType.getAppContext()) || serverAuthContextType.getAppContext() == null;
+        }
+        return false;
+    }
+
+    static <T> T newAuthModule(final AuthModuleType authModuleType, final CallbackHandler callbackHandler) throws AuthException {
+        T authModule;
+        try {
+            authModule = java.security.AccessController
+            .doPrivileged(new PrivilegedExceptionAction<T>() {
+                public T run() throws ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException, AuthException {
+                    Class<? extends T> cl = (Class<? extends T>) ProviderLocator.loadClass(authModuleType.getClassName(), getClass(), Thread.currentThread().getContextClassLoader());
+                    Constructor<? extends T> cnst = cl.getConstructor();
+                    T authModule = cnst.newInstance();
+                    Method m = cl.getMethod("initialize", MessagePolicy.class, MessagePolicy.class, CallbackHandler.class, Map.class);
+                    MessagePolicy reqPolicy = newMessagePolicy(authModuleType.getRequestPolicy());
+                    MessagePolicy respPolicy = newMessagePolicy(authModuleType.getResponsePolicy());
+                    m.invoke(authModule, reqPolicy, respPolicy, callbackHandler, authModuleType.getOptions());
+                    return authModule;
+                }
+            });
+        } catch (PrivilegedActionException e) {
+            Exception inner = e.getException();
+            if (inner instanceof InstantiationException) {
+                throw (AuthException) new AuthException("AuthConfigFactory error:"
+                                + inner.getCause().getMessage()).initCause(inner.getCause());
+            } else {
+                throw (AuthException) new AuthException("AuthConfigFactory error: " + inner).initCause(inner);
+            }
+        } catch (Exception e) {
+            throw (AuthException) new AuthException("AuthConfigFactory error: " + e).initCause(e);
+        }
+        return authModule;
+    }
+
+    private static MessagePolicy newMessagePolicy(MessagePolicyType messagePolicyType) throws AuthException {
+        if (messagePolicyType == null) {
+            return null;
+        }
+        if (messagePolicyType.getTargetPolicy().size() == 0) {
+            return null;
+        }
+        MessagePolicy.TargetPolicy[] targetPolicies = new MessagePolicy.TargetPolicy[messagePolicyType.getTargetPolicy().size()];
+        int i = 0;
+        for (TargetPolicyType targetPolicyType: messagePolicyType.getTargetPolicy()) {
+            targetPolicies[i++] = newTargetPolicy(targetPolicyType);
+        }
+        return new MessagePolicy(targetPolicies, messagePolicyType.isMandatory());
+    }
+
+    private static MessagePolicy.TargetPolicy newTargetPolicy(TargetPolicyType targetPolicyType) throws AuthException {
+        MessagePolicy.Target[] targets = new MessagePolicy.Target[targetPolicyType.getTarget().size()];
+        int i = 0;
+        for (TargetType targetType: targetPolicyType.getTarget()) {
+            targets[i++] = newTarget(targetType);
+        }
+        return new MessagePolicy.TargetPolicy(targets, newProtectionPolicy(targetPolicyType.getProtectionPolicy()));
+    }
+
+    private static MessagePolicy.Target newTarget(final TargetType targetType) throws AuthException {
+        try {
+            return java.security.AccessController
+            .doPrivileged(new PrivilegedExceptionAction<MessagePolicy.Target>() {
+                public MessagePolicy.Target run() throws ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException {
+                    Class<? extends MessagePolicy.Target> cl = ProviderLocator.loadClass(targetType.getClassName(), getClass(), Thread.currentThread().getContextClassLoader()).asSubclass(MessagePolicy.Target.class);
+                    Constructor<? extends MessagePolicy.Target> cnst = cl.getConstructor();
+                    MessagePolicy.Target target = cnst.newInstance();
+                    return target;
+                }
+            });
+        } catch (PrivilegedActionException e) {
+            Exception inner = e.getException();
+            if (inner instanceof InstantiationException) {
+                throw (AuthException) new AuthException("AuthConfigFactory error:"
+                                + inner.getCause().getMessage()).initCause(inner.getCause());
+            } else {
+                throw (AuthException) new AuthException("AuthConfigFactory error: " + inner).initCause(inner);
+            }
+        } catch (Exception e) {
+            throw (AuthException) new AuthException("AuthConfigFactory error: " + e).initCause(e);
+        }
+
+    }
+
+    private static MessagePolicy.ProtectionPolicy newProtectionPolicy(final ProtectionPolicyType protectionPolicyType) throws AuthException {
+        try {
+            return java.security.AccessController
+            .doPrivileged(new PrivilegedExceptionAction<MessagePolicy.ProtectionPolicy>() {
+                public MessagePolicy.ProtectionPolicy run() throws ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException {
+                    Class<? extends MessagePolicy.ProtectionPolicy> cl = ProviderLocator.loadClass(protectionPolicyType.getClassName(), getClass(), Thread.currentThread().getContextClassLoader()).asSubclass(MessagePolicy.ProtectionPolicy.class);
+                    Constructor<? extends MessagePolicy.ProtectionPolicy> cnst = cl.getConstructor();
+                    MessagePolicy.ProtectionPolicy target = cnst.newInstance();
+                    return target;
+                }
+            });
+        } catch (PrivilegedActionException e) {
+            Exception inner = e.getException();
+            if (inner instanceof InstantiationException) {
+                throw (AuthException) new AuthException("AuthConfigFactory error:"
+                                + inner.getCause().getMessage()).initCause(inner.getCause());
+            } else {
+                throw (AuthException) new AuthException("AuthConfigFactory error: " + inner).initCause(inner);
+            }
+        } catch (Exception e) {
+            throw (AuthException) new AuthException("AuthConfigFactory error: " + e).initCause(e);
+        }
+    }
+
+}
diff --git a/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/impl/ServerAuthConfigImpl.java b/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/impl/ServerAuthConfigImpl.java
new file mode 100644
index 0000000..eca3a08
--- /dev/null
+++ b/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/impl/ServerAuthConfigImpl.java
@@ -0,0 +1,67 @@
+/*
+ * 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.geronimo.components.jaspi.impl;
+
+import java.util.Map;
+
+import javax.security.auth.Subject;
+import javax.security.auth.message.AuthException;
+import javax.security.auth.message.MessageInfo;
+import javax.security.auth.message.config.ServerAuthConfig;
+import javax.security.auth.message.config.ServerAuthContext;
+import org.apache.geronimo.components.jaspi.model.ServerAuthConfigType;
+
+/**
+* @version $Rev:$ $Date:$
+*/
+public class ServerAuthConfigImpl implements ServerAuthConfig {
+
+    private final ServerAuthConfigType serverAuthConfigType;
+    private final Map<String, ServerAuthContext> serverAuthContextMap;
+
+    public ServerAuthConfigImpl(ServerAuthConfigType serverAuthConfigType, Map<String, ServerAuthContext> serverAuthContextMap) {
+        this.serverAuthConfigType = serverAuthConfigType;
+        this.serverAuthContextMap = serverAuthContextMap;
+    }
+
+    public ServerAuthContext getAuthContext(String authContextID, Subject serverSubject, Map properties) throws AuthException {
+        return serverAuthContextMap.get(authContextID);
+    }
+
+    public String getAppContext() {
+        return serverAuthConfigType.getAppContext();
+    }
+
+    public String getAuthContextID(MessageInfo messageInfo) throws IllegalArgumentException {
+        return serverAuthConfigType.getAuthContextID(messageInfo);
+    }
+
+    public String getMessageLayer() {
+        return serverAuthConfigType.getMessageLayer();
+    }
+
+    public boolean isProtected() {
+        return serverAuthConfigType.isProtected();
+    }
+
+    public void refresh() throws SecurityException {
+    }
+}
diff --git a/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/impl/ServerAuthContextImpl.java b/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/impl/ServerAuthContextImpl.java
new file mode 100644
index 0000000..0972cb8
--- /dev/null
+++ b/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/impl/ServerAuthContextImpl.java
@@ -0,0 +1,81 @@
+/*
+ * 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.geronimo.components.jaspi.impl;
+
+import java.util.List;
+
+import javax.security.auth.Subject;
+import javax.security.auth.message.AuthException;
+import javax.security.auth.message.AuthStatus;
+import javax.security.auth.message.MessageInfo;
+import javax.security.auth.message.config.ServerAuthContext;
+import javax.security.auth.message.module.ServerAuthModule;
+
+/**
+* @version $Rev:$ $Date:$
+*/
+public class ServerAuthContextImpl implements ServerAuthContext {
+
+    private final List<ServerAuthModule> serverAuthModules;
+
+    public ServerAuthContextImpl(List<ServerAuthModule> serverAuthModules) {
+        this.serverAuthModules = serverAuthModules;
+    }
+
+    public void cleanSubject(MessageInfo messageInfo, Subject subject) throws AuthException {
+        for (ServerAuthModule serverAuthModule : serverAuthModules) {
+            serverAuthModule.cleanSubject(messageInfo, subject);
+        }
+    }
+
+    public AuthStatus secureResponse(MessageInfo messageInfo, Subject serviceSubject) throws AuthException {
+        for (ServerAuthModule serverAuthModule : serverAuthModules) {
+            AuthStatus result = serverAuthModule.secureResponse(messageInfo, serviceSubject);
+
+            //jaspi spec p 86
+            if (result == AuthStatus.SEND_SUCCESS) {
+                continue;
+            }
+            if (result == AuthStatus.SEND_CONTINUE || result == AuthStatus.SEND_FAILURE) {
+                return result;
+            }
+            throw new AuthException("Invalid AuthStatus " + result + " from server auth module secureResponse: " + serverAuthModule);
+        }
+        return AuthStatus.SEND_SUCCESS;
+    }
+
+    public AuthStatus validateRequest(MessageInfo messageInfo, Subject clientSubject, Subject serviceSubject) throws AuthException {
+        for (ServerAuthModule serverAuthModule : serverAuthModules) {
+            AuthStatus result = serverAuthModule.validateRequest(messageInfo, clientSubject, serviceSubject);
+
+            //jaspi spec p 88
+            if (result == AuthStatus.SUCCESS) {
+                continue;
+            }
+            if (result == AuthStatus.SEND_SUCCESS || result == AuthStatus.SEND_CONTINUE || result == AuthStatus.FAILURE) {
+                return result;
+            }
+            throw new AuthException("Invalid AuthStatus " + result + " from server auth module validateRequest: " + serverAuthModule);
+        }
+        return AuthStatus.SUCCESS;
+    }
+
+}
diff --git a/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/AuthModuleType.java b/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/AuthModuleType.java
index 3a1d065..20c490c 100644
--- a/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/AuthModuleType.java
+++ b/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/AuthModuleType.java
@@ -69,6 +69,7 @@
 @XmlAccessorType(XmlAccessType.FIELD)
 @XmlType(name = "authModuleType", propOrder = {
     "className",
+    "classLoaderName",
     "requestPolicy",
     "responsePolicy",
     "options"
@@ -190,37 +191,4 @@
         this.classLoaderName = classLoaderName;
     }
 
-    public T newAuthModule(final CallbackHandler callbackHandler) throws AuthException {
-        T authModule;
-        try {
-            authModule = java.security.AccessController
-            .doPrivileged(new PrivilegedExceptionAction<T>() {
-                public T run() throws ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException, AuthException {
-                    Class<? extends T> cl = (Class<? extends T>) ProviderLocator.loadClass(className, getClass(), Thread.currentThread().getContextClassLoader());
-                    Constructor<? extends T> cnst = cl.getConstructor();
-                    T authModule = cnst.newInstance();
-                    Method m = cl.getMethod("initialize", MessagePolicy.class, MessagePolicy.class, CallbackHandler.class, Map.class);
-                    MessagePolicy reqPolicy = requestPolicy == null? null:requestPolicy.newMessagePolicy();
-                    MessagePolicy respPolicy = responsePolicy == null? null: responsePolicy.newMessagePolicy();
-                    m.invoke(authModule, reqPolicy, respPolicy, callbackHandler, options);
-                    return authModule;
-                }
-            });
-        } catch (PrivilegedActionException e) {
-            Exception inner = e.getException();
-            if (inner instanceof InstantiationException) {
-                throw (AuthException) new AuthException("AuthConfigFactory error:"
-                                + inner.getCause().getMessage()).initCause(inner.getCause());
-            } else {
-                throw (AuthException) new AuthException("AuthConfigFactory error: " + inner).initCause(inner);
-            }
-        } catch (Exception e) {
-            throw (AuthException) new AuthException("AuthConfigFactory error: " + e).initCause(e);
-        }
-
-
-
-        return authModule;
-    }
-
 }
diff --git a/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/ClientAuthConfigType.java b/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/ClientAuthConfigType.java
index dae6857..2447c22 100644
--- a/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/ClientAuthConfigType.java
+++ b/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/ClientAuthConfigType.java
@@ -25,11 +25,12 @@
 package org.apache.geronimo.components.jaspi.model;
 
 import java.io.Serializable;
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
-import javax.security.auth.Subject;
 import javax.security.auth.callback.CallbackHandler;
 import javax.security.auth.message.AuthException;
 import javax.security.auth.message.MessageInfo;
@@ -38,8 +39,9 @@
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+import org.apache.geronimo.components.jaspi.impl.ClientAuthConfigImpl;
 
 
 /**
@@ -64,8 +66,9 @@
  * </pre>
  * 
  * 
- * @version $Rev$ $Date$
+ * @version $Rev: 939768 $ $Date: 2010-04-30 11:26:46 -0700 (Fri, 30 Apr 2010) $
  */
+@XmlRootElement(name = "clientAuthConfig", namespace = "http://geronimo.apache.org/xml/ns/geronimo-jaspi")
 @XmlAccessorType(XmlAccessType.FIELD)
 @XmlType(name = "clientAuthConfigType", propOrder = {
     "messageLayer",
@@ -85,8 +88,8 @@
     @XmlElement(name = "protected")
     protected boolean _protected;
     //TODO go back to a map
-    @XmlJavaTypeAdapter(KeyedObjectMapAdapter.class)
-    protected Map<String, ClientAuthContextType> clientAuthContext;
+//    @XmlJavaTypeAdapter(KeyedObjectMapAdapter.class)
+    protected List<ClientAuthContextType> clientAuthContext;
 
 
     public ClientAuthConfigType() {
@@ -96,7 +99,7 @@
         this.messageLayer = clientAuthContextType.getMessageLayer();
         this.appContext = clientAuthContextType.getAppContext();
         this.authenticationContextID = clientAuthContextType.getAuthenticationContextID();
-        this.clientAuthContext = Collections.singletonMap(clientAuthContextType.getKey(), clientAuthContextType);
+        this.clientAuthContext = Collections.singletonList(clientAuthContextType);
         this._protected = _protected;
     }
 
@@ -216,11 +219,11 @@
      *
      * @return map of id to client auth context
      */
-    public Map<String, ClientAuthContextType> getClientAuthContext() {
+    public List<ClientAuthContextType> getClientAuthContext() {
         if (clientAuthContext == null) {
-            clientAuthContext = new HashMap<String, ClientAuthContextType>();
+            clientAuthContext = new ArrayList<ClientAuthContextType>();
         }
-        return this.clientAuthContext;
+        return clientAuthContext;
     }
 
 
@@ -229,7 +232,7 @@
         if (authenticationContextID != null) {
             return authenticationContextID;
         }
-        for (ClientAuthContextType clientAuthContextType: clientAuthContext.values()) {
+        for (ClientAuthContextType clientAuthContextType: clientAuthContext) {
             String authContextID = clientAuthContextType.getAuthenticationContextID(messageInfo);
             if (authContextID != null) {
                 return authContextID;
@@ -242,61 +245,4 @@
         return ConfigProviderType.getRegistrationKey(messageLayer, appContext);
     }
 
-    public void initialize(CallbackHandler callbackHandler) throws AuthException {
-    }
-
-    public boolean isPersistent() {
-        return true;
-    }
-
-    public ClientAuthConfig newClientAuthConfig(String messageLayer, String appContext, CallbackHandler callbackHandler) throws AuthException {
-        Map<String, ClientAuthContext> authContextMap = new HashMap<String, ClientAuthContext>();
-        for (ClientAuthContextType clientAuthContextType: getClientAuthContext().values()) {
-            if (clientAuthContextType.match(messageLayer, appContext)) {
-                ClientAuthContext clientAuthContext = clientAuthContextType.newClientAuthContext(callbackHandler);
-                String authContextID = clientAuthContextType.getAuthenticationContextID();
-                if (authContextID == null) {
-                    authContextID = getAuthenticationContextID();
-                }
-                if (!authContextMap.containsKey(authContextID)) {
-                    authContextMap.put(authContextID,  clientAuthContext);
-                }
-            }
-        }
-        return new ClientAuthConfigImpl(this, authContextMap);
-    }
-
-    public static class ClientAuthConfigImpl implements ClientAuthConfig {
-
-        private final ClientAuthConfigType clientAuthConfigType;
-        private final Map<String, ClientAuthContext> clientAuthContextMap;
-
-        public ClientAuthConfigImpl(ClientAuthConfigType clientAuthConfigType, Map<String, ClientAuthContext> clientAuthContextMap) {
-            this.clientAuthConfigType = clientAuthConfigType;
-            this.clientAuthContextMap = clientAuthContextMap;
-        }
-
-        public ClientAuthContext getAuthContext(String authContextID, Subject clientSubject, Map properties) throws AuthException {
-            return clientAuthContextMap.get(authContextID);
-        }
-
-        public String getAppContext() {
-            return clientAuthConfigType.getAppContext();
-        }
-
-        public String getAuthContextID(MessageInfo messageInfo) throws IllegalArgumentException {
-            return clientAuthConfigType.getAuthContextID(messageInfo);
-        }
-
-        public String getMessageLayer() {
-            return clientAuthConfigType.getMessageLayer();
-        }
-
-        public boolean isProtected() {
-            return clientAuthConfigType.isProtected();
-        }
-
-        public void refresh() throws SecurityException {
-        }
-    }
 }
diff --git a/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/ClientAuthContextType.java b/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/ClientAuthContextType.java
index 0eaaaba..ae06e62 100644
--- a/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/ClientAuthContextType.java
+++ b/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/ClientAuthContextType.java
@@ -29,17 +29,17 @@
 import java.util.Collections;
 import java.util.List;
 
-import javax.security.auth.Subject;
 import javax.security.auth.callback.CallbackHandler;
 import javax.security.auth.message.AuthException;
-import javax.security.auth.message.AuthStatus;
 import javax.security.auth.message.MessageInfo;
 import javax.security.auth.message.config.ClientAuthContext;
 import javax.security.auth.message.module.ClientAuthModule;
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
+import org.apache.geronimo.components.jaspi.impl.ClientAuthContextImpl;
 
 
 /**
@@ -62,8 +62,9 @@
  * &lt;/complexType>
  * </pre>
  *
- * @version $Rev$ $Date$
+ * @version $Rev: 939768 $ $Date: 2010-04-30 11:26:46 -0700 (Fri, 30 Apr 2010) $
  */
+@XmlRootElement(name = "clientAuthContext", namespace = "http://geronimo.apache.org/xml/ns/geronimo-jaspi")
 @XmlAccessorType(XmlAccessType.FIELD)
 @XmlType(name = "clientAuthContextType", propOrder = {
         "messageLayer",
@@ -72,7 +73,7 @@
         "clientAuthModule"
         })
 public class ClientAuthContextType
-        implements Serializable, KeyedObject {
+        implements Serializable {
 
     private final static long serialVersionUID = 12343L;
     protected String messageLayer;
@@ -186,83 +187,4 @@
     }
 
 
-    public String getKey() {
-        return ConfigProviderType.getRegistrationKey(messageLayer, appContext);
-    }
-
-    public void initialize(CallbackHandler callbackHandler) throws AuthException {
-    }
-
-    public boolean isPersistent() {
-        return true;
-    }
-
-    public ClientAuthContext newClientAuthContext(CallbackHandler callbackHandler) throws AuthException {
-        List<ClientAuthModule> clientAuthModules = new ArrayList<ClientAuthModule>();
-        for (AuthModuleType<ClientAuthModule> clientAuthModuleType: clientAuthModule) {
-            ClientAuthModule instance = clientAuthModuleType.newAuthModule(callbackHandler);
-            clientAuthModules.add(instance);
-        }
-        return new ClientAuthContextImpl(clientAuthModules);
-    }
-
-    public boolean match(String messageLayer, String appContext) {
-        if (messageLayer == null) throw new NullPointerException("messageLayer");
-        if (appContext == null) throw new NullPointerException("appContext");
-        if (messageLayer.equals(this.messageLayer)) {
-            return appContext.equals(this.appContext) || this.appContext == null;
-        }
-        if (this.messageLayer == null) {
-            return appContext.equals(this.appContext) || this.appContext == null;
-        }
-        return false;
-    }
-
-    public static class ClientAuthContextImpl implements ClientAuthContext {
-
-        private final List<ClientAuthModule> clientAuthModules;
-
-        public ClientAuthContextImpl(List<ClientAuthModule> clientAuthModules) {
-            this.clientAuthModules = clientAuthModules;
-        }
-
-        public void cleanSubject(MessageInfo messageInfo, Subject subject) throws AuthException {
-            for (ClientAuthModule clientAuthModule : clientAuthModules) {
-                clientAuthModule.cleanSubject(messageInfo, subject);
-            }
-        }
-
-        public AuthStatus secureRequest(MessageInfo messageInfo, Subject clientSubject) throws AuthException {
-            for (ClientAuthModule clientAuthModule : clientAuthModules) {
-                AuthStatus result = clientAuthModule.secureRequest(messageInfo, clientSubject);
-
-                //jaspi spec p 74
-                if (result == AuthStatus.SUCCESS) {
-                    continue;
-                }
-                if (result == AuthStatus.SEND_CONTINUE || result == AuthStatus.FAILURE) {
-                    return result;
-                }
-                throw new AuthException("Invalid AuthStatus " + result + " from client auth module: " + clientAuthModule);
-            }
-            return AuthStatus.SUCCESS;
-        }
-
-        public AuthStatus validateResponse(MessageInfo messageInfo, Subject clientSubject, Subject serviceSubject) throws AuthException {
-            for (ClientAuthModule clientAuthModule : clientAuthModules) {
-                AuthStatus result = clientAuthModule.validateResponse(messageInfo, clientSubject, serviceSubject);
-
-                //jaspi spec p 74
-                if (result == AuthStatus.SUCCESS) {
-                    continue;
-                }
-                if (result == AuthStatus.SEND_CONTINUE || result == AuthStatus.FAILURE) {
-                    return result;
-                }
-                throw new AuthException("Invalid AuthStatus " + result + " from client auth module: " + clientAuthModule);
-            }
-            return AuthStatus.SUCCESS;
-        }
-    }
-
 }
diff --git a/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/ConfigProviderType.java b/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/ConfigProviderType.java
index bb0ae86..452cfb7 100644
--- a/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/ConfigProviderType.java
+++ b/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/ConfigProviderType.java
@@ -35,18 +35,17 @@
 import java.util.Map;
 
 import javax.security.auth.callback.CallbackHandler;
-import javax.security.auth.message.AuthException;
 import javax.security.auth.message.config.AuthConfigFactory;
 import javax.security.auth.message.config.AuthConfigProvider;
-import javax.security.auth.message.config.ClientAuthConfig;
 import javax.security.auth.message.config.RegistrationListener;
-import javax.security.auth.message.config.ServerAuthConfig;
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 import javax.xml.bind.annotation.XmlType;
 import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+import org.apache.geronimo.components.jaspi.impl.ConfigProviderImpl;
 import org.apache.geronimo.osgi.locator.ProviderLocator;
 
 
@@ -83,6 +82,7 @@
  * 
  * 
  */
+@XmlRootElement(name = "configProvider", namespace = "http://geronimo.apache.org/xml/ns/geronimo-jaspi")
 @XmlAccessorType(XmlAccessType.FIELD)
 @XmlType(name = "configProviderType", propOrder = {
     "messageLayer",
@@ -96,7 +96,7 @@
     "classLoaderName"
 })
 public class ConfigProviderType
-    implements AuthConfigFactory.RegistrationContext, Serializable, KeyedObject
+    implements Serializable
 {
 
     private final static long serialVersionUID = 12343L;
@@ -108,20 +108,11 @@
     @XmlElement(required = true)
     @XmlJavaTypeAdapter(StringMapAdapter.class)
     protected Map<String, String> properties;
-    @XmlJavaTypeAdapter(KeyedObjectMapAdapter.class)
-    private Map<String, ClientAuthConfigType> clientAuthConfig;
-    @XmlJavaTypeAdapter(KeyedObjectMapAdapter.class)
-    private Map<String, ServerAuthConfigType> serverAuthConfig;
+    private List<ClientAuthConfigType> clientAuthConfig;
+    private List<ServerAuthConfigType> serverAuthConfig;
     protected Boolean persistent = Boolean.FALSE;
     protected String classLoaderName;
 
-    @XmlTransient
-    private AuthConfigFactory authConfigFactory;
-    @XmlTransient
-    private final List<RegistrationListener> listeners = new ArrayList<RegistrationListener>();
-    @XmlTransient
-    private AuthConfigProvider provider;
-
 
     public ConfigProviderType() {
     }
@@ -130,7 +121,6 @@
         this.messageLayer = messageLayer;
         this.appContext = appContext;
         this.persistent = persistent;
-        this.authConfigFactory = authConfigFactory;
     }
 
     /**
@@ -275,11 +265,11 @@
      * 
      * @return map of id to client auth config
      */
-    public Map<String, ClientAuthConfigType> getClientAuthConfig() {
+    public List<ClientAuthConfigType> getClientAuthConfig() {
         if (clientAuthConfig == null) {
-            clientAuthConfig = new HashMap<String, ClientAuthConfigType>();
+            clientAuthConfig = new ArrayList<ClientAuthConfigType>();
         }
-        return this.clientAuthConfig;
+        return clientAuthConfig;
     }
 
     /**
@@ -304,11 +294,11 @@
      * 
      * @return map of id to server auth config
      */
-    public Map<String, ServerAuthConfigType> getServerAuthConfig() {
+    public List<ServerAuthConfigType> getServerAuthConfig() {
         if (serverAuthConfig == null) {
-            serverAuthConfig = new HashMap<String, ServerAuthConfigType>();
+            serverAuthConfig = new ArrayList<ServerAuthConfigType>();
         }
-        return this.serverAuthConfig;
+        return serverAuthConfig;
     }
 
     /**
@@ -335,18 +325,6 @@
         this.persistent = value;
     }
 
-    public List<RegistrationListener> getListeners() {
-        return listeners;
-    }
-
-    public AuthConfigProvider getProvider() {
-        return provider;
-    }
-
-    public void setProvider(AuthConfigProvider provider) {
-        this.provider = provider;
-    }
-
     public String getClassLoaderName() {
         return classLoaderName;
     }
@@ -355,33 +333,6 @@
         this.classLoaderName = classLoaderName;
     }
 
-    public void initialize(CallbackHandler callbackHandler) {
-        if (className == null) {
-            provider = new ConfigProviderImpl(getClientAuthConfig(), getServerAuthConfig());
-        } else {
-            try {
-                provider = java.security.AccessController
-                .doPrivileged(new PrivilegedExceptionAction<AuthConfigProvider>() {
-                    public AuthConfigProvider run() throws ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException {
-                        Class<? extends AuthConfigProvider> cl = ProviderLocator.loadClass(className, getClass(), Thread.currentThread().getContextClassLoader()).asSubclass(AuthConfigProvider.class);
-                        Constructor<? extends AuthConfigProvider> cnst = cl.getConstructor(Map.class, AuthConfigFactory.class);
-                        return cnst.newInstance(properties, authConfigFactory);
-                    }
-                });
-            } catch (PrivilegedActionException e) {
-                Exception inner = e.getException();
-                if (inner instanceof InstantiationException) {
-                    throw new SecurityException("AuthConfigFactory error:"
-                                    + inner.getCause().getMessage(), inner.getCause());
-                } else {
-                    throw new SecurityException("AuthConfigFactory error: " + inner, inner);
-                }
-            } catch (Exception e) {
-                throw new SecurityException("AuthConfigFactory error: " + e, e);
-            }
-        }
-    }
-
     public static String getRegistrationKey(String layer, String appContext) {
         return layer + "/" + appContext;
     }
@@ -390,75 +341,4 @@
         return getRegistrationKey(getMessageLayer(), getAppContext());
     }
 
-    public static class ConfigProviderImpl implements AuthConfigProvider {
-
-        private final Map<String, ClientAuthConfigType> clientConfigTypeMap;
-        private final Map<String, ServerAuthConfigType> serverAuthConfigMap;
-
-        public ConfigProviderImpl(Map<String, ClientAuthConfigType> clientConfigTypeMap, Map<String, ServerAuthConfigType> serverAuthConfigMap) {
-            this.clientConfigTypeMap = clientConfigTypeMap;
-            this.serverAuthConfigMap = serverAuthConfigMap;
-        }
-
-        /**
-         * spec required constructor
-         * @param properties useless properties map
-         * @param factory useless factory
-         */
-        public ConfigProviderImpl(Map<String, String> properties, AuthConfigFactory factory) {
-            throw new RuntimeException("don't call this");
-        }
-
-        public ClientAuthConfig getClientAuthConfig(String layer, String appContext, CallbackHandler handler) throws AuthException, SecurityException {
-            if (layer == null) {
-                throw new NullPointerException("messageLayer");
-            }
-            if (appContext == null) {
-                throw new NullPointerException("appContext");
-            }
-            ClientAuthConfigType ctx = clientConfigTypeMap.get(getRegistrationKey(layer, appContext));
-            if (ctx == null) {
-                ctx = clientConfigTypeMap.get(getRegistrationKey(null, appContext));
-            }
-            if (ctx == null) {
-                ctx = clientConfigTypeMap.get(getRegistrationKey(layer, null));
-            }
-            if (ctx == null) {
-                ctx = clientConfigTypeMap.get(getRegistrationKey(null, null));
-            }
-            if (ctx != null) {
-                
-                return ctx.newClientAuthConfig(layer, appContext, handler);
-            }
-            throw new AuthException("No suitable ClientAuthConfig");
-        }
-
-        public ServerAuthConfig getServerAuthConfig(String layer, String appContext, CallbackHandler handler) throws AuthException, SecurityException {
-            if (layer == null) {
-                throw new NullPointerException("messageLayer");
-            }
-            if (appContext == null) {
-                throw new NullPointerException("appContext");
-            }
-            ServerAuthConfigType ctx = serverAuthConfigMap.get(getRegistrationKey(layer, appContext));
-            if (ctx == null) {
-                ctx = serverAuthConfigMap.get(getRegistrationKey(null, appContext));
-            }
-            if (ctx == null) {
-                ctx = serverAuthConfigMap.get(getRegistrationKey(layer, null));
-            }
-            if (ctx == null) {
-                ctx = serverAuthConfigMap.get(getRegistrationKey(null, null));
-            }
-            if (ctx != null) {
-
-                return ctx.newServerAuthConfig(layer, appContext, handler);
-            }
-            throw new AuthException("No suitable ServerAuthConfig");
-        }
-
-        public void refresh() throws SecurityException {
-        }
-    }
-
 }
diff --git a/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/JaspiType.java b/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/JaspiType.java
index 1c07b16..1e174bd 100644
--- a/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/JaspiType.java
+++ b/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/JaspiType.java
@@ -25,7 +25,9 @@
 package org.apache.geronimo.components.jaspi.model;
 
 import java.io.Serializable;
+import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 import javax.xml.bind.annotation.XmlAccessType;
@@ -52,7 +54,7 @@
  * </pre>
  * 
  * 
- * @version $Rev$ $Date$
+ * @version $Rev: 939768 $ $Date: 2010-04-30 11:26:46 -0700 (Fri, 30 Apr 2010) $
  */
 @XmlAccessorType(XmlAccessType.FIELD)
 @XmlType(name = "jaspiType", propOrder = {
@@ -63,9 +65,9 @@
 {
 
     private final static long serialVersionUID = 12343L;
-
-    @XmlJavaTypeAdapter(KeyedObjectMapAdapter.class)
-    protected Map<String, ConfigProviderType> configProvider;
+    protected List<ConfigProviderType> configProvider;
+//    @XmlJavaTypeAdapter(KeyedObjectMapAdapter.class)
+//    protected Map<String, ConfigProviderType> configProvider;
 
     /**
      * Gets the value of the configProvider property.
@@ -88,11 +90,11 @@
      * {@link ConfigProviderType }
      * 
      *
-     * @return map of id to Config Provider
+     * @return list of Config Provider
      */
-    public Map<String, ConfigProviderType> getConfigProvider() {
+     public List<ConfigProviderType> getConfigProvider() {
         if (configProvider == null) {
-            configProvider = new HashMap<String, ConfigProviderType>();
+            configProvider = new ArrayList<ConfigProviderType>();
         }
         return this.configProvider;
     }
diff --git a/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/JaspiUtil.java b/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/JaspiUtil.java
index bbe212f..241bf57 100644
--- a/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/JaspiUtil.java
+++ b/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/JaspiUtil.java
@@ -21,16 +21,18 @@
 package org.apache.geronimo.components.jaspi.model;
 
 import java.util.Collections;
+import java.util.List;
 import java.util.Map;
 
 import javax.security.auth.message.AuthException;
 import javax.security.auth.message.config.AuthConfigProvider;
 import javax.security.auth.message.module.ClientAuthModule;
 import javax.security.auth.message.module.ServerAuthModule;
+import org.apache.geronimo.components.jaspi.impl.ConfigProviderImpl;
 
 /**
  * Convenience methods to wrap various jaspi objects into AuthConfigProvider instances, ready to be registered.
- * @version $Rev$ $Date$
+ * @version $Rev: 939768 $ $Date: 2010-04-30 11:26:46 -0700 (Fri, 30 Apr 2010) $
  */
 public class JaspiUtil {
 
@@ -38,12 +40,12 @@
     }
 
     public static AuthConfigProvider wrapAuthConfigProvider(ConfigProviderType configProviderType) {
-        return new ConfigProviderType.ConfigProviderImpl(configProviderType.getClientAuthConfig(), configProviderType.getServerAuthConfig());
+        return new ConfigProviderImpl(configProviderType.getClientAuthConfig(), configProviderType.getServerAuthConfig());
     }
 
     public static AuthConfigProvider wrapClientAuthConfig(ClientAuthConfigType clientAuthConfigType) throws AuthException {
-        Map<String, ClientAuthConfigType> clientAuthConfig = Collections.singletonMap(clientAuthConfigType.getKey(), clientAuthConfigType);
-        return new ConfigProviderType.ConfigProviderImpl(clientAuthConfig, Collections.<String, ServerAuthConfigType>emptyMap());
+        List<ClientAuthConfigType> clientAuthConfig = Collections.singletonList(clientAuthConfigType);
+        return new ConfigProviderImpl(clientAuthConfig, Collections.<ServerAuthConfigType>emptyList());
     }
 
     public static AuthConfigProvider wrapClientAuthContext(ClientAuthContextType clientAuthContextType, boolean _protected) throws AuthException {
@@ -58,8 +60,8 @@
 
 
     public static AuthConfigProvider wrapServerAuthConfig(ServerAuthConfigType serverAuthConfigType) throws AuthException {
-        Map<String, ServerAuthConfigType> serverAuthConfig = Collections.singletonMap(serverAuthConfigType.getKey(), serverAuthConfigType);
-        return new ConfigProviderType.ConfigProviderImpl(Collections.<String, ClientAuthConfigType>emptyMap(), serverAuthConfig);
+        List<ServerAuthConfigType> serverAuthConfig = Collections.singletonList(serverAuthConfigType);
+        return new ConfigProviderImpl(Collections.<ClientAuthConfigType>emptyList(), serverAuthConfig);
     }
 
     public static AuthConfigProvider wrapServerAuthContext(ServerAuthContextType serverAuthContextType, boolean _protected) throws AuthException {
diff --git a/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/JaspiXmlUtil.java b/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/JaspiXmlUtil.java
index 0c2f9df..90ece51 100644
--- a/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/JaspiXmlUtil.java
+++ b/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/JaspiXmlUtil.java
@@ -23,7 +23,6 @@
 import java.io.IOException;
 import java.io.Reader;
 import java.io.Writer;
-import java.util.Collections;
 
 import javax.security.auth.callback.CallbackHandler;
 import javax.security.auth.message.module.ClientAuthModule;
@@ -40,7 +39,7 @@
 import org.xml.sax.SAXException;
 
 /**
- * @version $Rev$ $Date$
+ * @version $Rev: 939768 $ $Date: 2010-04-30 11:26:46 -0700 (Fri, 30 Apr 2010) $
  */
 public class JaspiXmlUtil {
     public static final XMLInputFactory XMLINPUT_FACTORY = XMLInputFactory.newInstance();
@@ -49,8 +48,8 @@
 
     static {
         try {
-//            JASPI_CONTEXT = JAXBContext.newInstance(JaspiType.class);
-            JASPI_CONTEXT = com.envoisolutions.sxc.jaxb.JAXBContextImpl.newInstance(new Class[] {JaspiType.class, ConfigProviderType.class, ClientAuthConfigType.class, ClientAuthContextType.class, ServerAuthConfigType.class, ServerAuthContextType.class, AuthModuleType.class}, Collections.singletonMap("com.envoisolutions.sxc.generate", "false"));
+            JASPI_CONTEXT = JAXBContext.newInstance(JaspiType.class, ConfigProviderType.class, ClientAuthConfigType.class, ClientAuthContextType.class, ServerAuthConfigType.class, ServerAuthContextType.class, AuthModuleType.class);
+//            JASPI_CONTEXT = com.envoisolutions.sxc.jaxb.JAXBContextImpl.newInstance(new Class[] {JaspiType.class, ConfigProviderType.class, ClientAuthConfigType.class, ClientAuthContextType.class, ServerAuthConfigType.class, ServerAuthContextType.class, AuthModuleType.class}, Collections.singletonMap("com.envoisolutions.sxc.generate", "false"));
 
         } catch (JAXBException e) {
             throw new RuntimeException("Could not create jaxb contexts for plugin types", e);
diff --git a/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/KeyedObject.java b/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/KeyedObject.java
index 822899b..374bf21 100644
--- a/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/KeyedObject.java
+++ b/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/KeyedObject.java
@@ -24,10 +24,8 @@
 import javax.security.auth.message.AuthException;
 
 /**
- * @version $Rev$ $Date$
+ * @version $Rev: 939768 $ $Date: 2010-04-30 11:26:46 -0700 (Fri, 30 Apr 2010) $
  */
 public interface KeyedObject {
     String getKey();
-    void initialize(CallbackHandler callbackHandler) throws AuthException;
-    boolean isPersistent();
 }
diff --git a/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/KeyedObjectMapAdapter.java b/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/KeyedObjectMapAdapter.java
index 0630532..f88421e 100644
--- a/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/KeyedObjectMapAdapter.java
+++ b/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/KeyedObjectMapAdapter.java
@@ -30,47 +30,43 @@
 import javax.xml.bind.annotation.adapters.XmlAdapter;
 
 /**
- * @version $Rev$ $Date$
+ * @version $Rev: 939768 $ $Date: 2010-04-30 11:26:46 -0700 (Fri, 30 Apr 2010) $
  */
-public class KeyedObjectMapAdapter<T extends KeyedObject> extends XmlAdapter<T[], Map<String, T>> {
+public class KeyedObjectMapAdapter<T extends KeyedObject> extends XmlAdapter<List<T>, Map<String, T>> {
     public static CallbackHandler staticCallbackHandler;
     private final CallbackHandler callbackHandler;
-    private final Class<T> type;
+//    private final Class<T> type;
 
-    public KeyedObjectMapAdapter(CallbackHandler callbackHandler, Class<T> type) {
+    public KeyedObjectMapAdapter(CallbackHandler callbackHandler) {
         this.callbackHandler = callbackHandler;
-        this.type = type;
+//        this.type = type;
     }
 
-    public KeyedObjectMapAdapter(Class<T> type) {
-        this(staticCallbackHandler, type);
+    public KeyedObjectMapAdapter() {
+        this(staticCallbackHandler);
     }
 
-    public Map<String, T> unmarshal(T[] configProviderTypes) throws Exception {
+    public Map<String, T> unmarshal(List<T> configProviderTypes) throws Exception {
         Map<String, T> map = new HashMap<String, T>();
         if (configProviderTypes != null) {
             for (T configProviderType : configProviderTypes) {
                 if (configProviderType != null) {
                     String key = configProviderType.getKey();
                     map.put(key, configProviderType);
-                    configProviderType.initialize(callbackHandler);
                 }
             }
         }
         return map;
     }
 
-    public T[] marshal(Map<String, T> stringConfigProviderTypeMap) throws Exception {
+    public ArrayList<T> marshal(Map<String, T> stringConfigProviderTypeMap) throws Exception {
         if (stringConfigProviderTypeMap == null) {
             return null;
         }
-        List<T> list = new ArrayList<T>();
+        ArrayList<T> list = new ArrayList<T>();
         for (T configProviderType : stringConfigProviderTypeMap.values()) {
-            if (configProviderType.isPersistent()) {
-                list.add(configProviderType);
-            }
+            list.add(configProviderType);
         }
-        T[] array = (T[]) Array.newInstance(type, list.size());
-        return list.toArray(array);
+        return list;
     }
 }
diff --git a/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/MessagePolicyType.java b/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/MessagePolicyType.java
index c8c3df6..3042389 100644
--- a/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/MessagePolicyType.java
+++ b/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/MessagePolicyType.java
@@ -55,7 +55,7 @@
  * </pre>
  * 
  * 
- * @version $Rev$ $Date$
+ * @version $Rev: 939768 $ $Date: 2010-04-30 11:26:46 -0700 (Fri, 30 Apr 2010) $
  */
 @XmlAccessorType(XmlAccessType.FIELD)
 @XmlType(name = "messagePolicyType", propOrder = {
@@ -124,16 +124,5 @@
         this.mandatory = value;
     }
 
-    public MessagePolicy newMessagePolicy() throws AuthException {
-        if (targetPolicy == null || targetPolicy.size() == 0) {
-            return null;
-        }
-        MessagePolicy.TargetPolicy[] targetPolicies = new MessagePolicy.TargetPolicy[targetPolicy.size()];
-        int i = 0;
-        for (TargetPolicyType targetPolicyType: targetPolicy) {
-            targetPolicies[i++] = targetPolicyType.newTargetPolicy();
-        }
-        return new MessagePolicy(targetPolicies, mandatory);
-    }
 
 }
diff --git a/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/ProtectionPolicyType.java b/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/ProtectionPolicyType.java
index ada31f6..f838d9a 100644
--- a/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/ProtectionPolicyType.java
+++ b/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/ProtectionPolicyType.java
@@ -57,7 +57,7 @@
  * </pre>
  * 
  * 
- * @version $Rev$ $Date$
+ * @version $Rev: 939768 $ $Date: 2010-04-30 11:26:46 -0700 (Fri, 30 Apr 2010) $
  */
 @XmlAccessorType(XmlAccessType.FIELD)
 @XmlType(name = "protectionPolicyType", propOrder = {
@@ -95,27 +95,4 @@
         this.className = value;
     }
 
-    public MessagePolicy.ProtectionPolicy newProtectionPolicy() throws AuthException {
-        try {
-            return java.security.AccessController
-            .doPrivileged(new PrivilegedExceptionAction<MessagePolicy.ProtectionPolicy>() {
-                public MessagePolicy.ProtectionPolicy run() throws ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException {
-                    Class<? extends MessagePolicy.ProtectionPolicy> cl = ProviderLocator.loadClass(className, getClass(), Thread.currentThread().getContextClassLoader()).asSubclass(MessagePolicy.ProtectionPolicy.class);
-                    Constructor<? extends MessagePolicy.ProtectionPolicy> cnst = cl.getConstructor();
-                    MessagePolicy.ProtectionPolicy target = cnst.newInstance();
-                    return target;
-                }
-            });
-        } catch (PrivilegedActionException e) {
-            Exception inner = e.getException();
-            if (inner instanceof InstantiationException) {
-                throw (AuthException) new AuthException("AuthConfigFactory error:"
-                                + inner.getCause().getMessage()).initCause(inner.getCause());
-            } else {
-                throw (AuthException) new AuthException("AuthConfigFactory error: " + inner).initCause(inner);
-            }
-        } catch (Exception e) {
-            throw (AuthException) new AuthException("AuthConfigFactory error: " + e).initCause(e);
-        }
-    }
 }
diff --git a/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/ServerAuthConfigType.java b/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/ServerAuthConfigType.java
index eae7874..483a742 100644
--- a/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/ServerAuthConfigType.java
+++ b/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/ServerAuthConfigType.java
@@ -25,8 +25,10 @@
 package org.apache.geronimo.components.jaspi.model;
 
 import java.io.Serializable;
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 import javax.security.auth.Subject;
@@ -39,7 +41,7 @@
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlType;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+import org.apache.geronimo.components.jaspi.impl.ServerAuthConfigImpl;
 
 
 /**
@@ -64,7 +66,7 @@
  * </pre>
  * 
  * 
- * @version $Rev$ $Date$
+ * @version $Rev: 939768 $ $Date: 2010-04-30 11:26:46 -0700 (Fri, 30 Apr 2010) $
  */
 @XmlAccessorType(XmlAccessType.FIELD)
 @XmlType(name = "serverAuthConfigType", propOrder = {
@@ -84,8 +86,8 @@
     protected String authenticationContextID;
     @XmlElement(name = "protected")
     protected boolean _protected;
-    @XmlJavaTypeAdapter(KeyedObjectMapAdapter.class)
-    protected Map<String, ServerAuthContextType> serverAuthContext;
+//    @XmlJavaTypeAdapter(KeyedObjectMapAdapter.class)
+    protected List<ServerAuthContextType> serverAuthContext;
 
     public ServerAuthConfigType() {
     }
@@ -94,7 +96,7 @@
         this.messageLayer = serverAuthContextType.getMessageLayer();
         this.appContext = serverAuthContextType.getAppContext();
         this.authenticationContextID = serverAuthContextType.getAuthenticationContextID();
-        this.serverAuthContext = Collections.singletonMap(serverAuthContextType.getKey(), serverAuthContextType);
+        this.serverAuthContext = Collections.singletonList(serverAuthContextType);
         this._protected = _protected;
     }
 
@@ -138,7 +140,7 @@
         if (authenticationContextID != null) {
             return authenticationContextID;
         }
-        for (ServerAuthContextType serverAuthContextType: serverAuthContext.values()) {
+        for (ServerAuthContextType serverAuthContextType: serverAuthContext) {
             String authContextID = serverAuthContextType.getAuthenticationContextID(messageInfo);
             if (authContextID != null) {
                 return authContextID;
@@ -227,81 +229,15 @@
      *
      * @return map of id to Server auth config
      */
-    public Map<String, ServerAuthContextType> getServerAuthContext() {
+    public List<ServerAuthContextType> getServerAuthContext() {
         if (serverAuthContext == null) {
-            serverAuthContext = new HashMap<String, ServerAuthContextType>();
+            serverAuthContext = new ArrayList<ServerAuthContextType>();
         }
-        return this.serverAuthContext;
+        return serverAuthContext;
     }
 
-    public ServerAuthContext getAuthContext(String authContextID, Subject serviceSubject, Map properties) throws AuthException {
-        //see page 136  We are going to ignore the clientSubject and properties for now.
-        for (ServerAuthContextType serverAuthContext: getServerAuthContext().values()) {
-            if (serverAuthContext.getAuthenticationContextID().equals(authContextID)) {
-                return serverAuthContext.getServerAuthContext();
-            }
-        }
-        return null;
-    }
     public String getKey() {
         return ConfigProviderType.getRegistrationKey(messageLayer, appContext);
     }
 
-    public void initialize(CallbackHandler callbackHandler) throws AuthException {
-    }
-
-    public boolean isPersistent() {
-        return true;
-    }
-
-    public ServerAuthConfig newServerAuthConfig(String messageLayer, String appContext, CallbackHandler callbackHandler) throws AuthException {
-        Map<String, ServerAuthContext> authContextMap = new HashMap<String, ServerAuthContext>();
-        for (ServerAuthContextType serverAuthContextType: getServerAuthContext().values()) {
-            if (serverAuthContextType.match(messageLayer, appContext)) {
-                ServerAuthContext serverAuthContext = serverAuthContextType.newServerAuthContext(callbackHandler);
-                String authContextID = serverAuthContextType.getAuthenticationContextID();
-                if (authContextID == null) {
-                    authContextID = getAuthenticationContextID();
-                }
-                if (!authContextMap.containsKey(authContextID)) {
-                    authContextMap.put(authContextID,  serverAuthContext);
-                }
-            }
-        }
-        return new ServerAuthConfigImpl(this, authContextMap);
-    }
-
-    public static class ServerAuthConfigImpl implements ServerAuthConfig {
-
-        private final ServerAuthConfigType serverAuthConfigType;
-        private final Map<String, ServerAuthContext> serverAuthContextMap;
-
-        public ServerAuthConfigImpl(ServerAuthConfigType serverAuthConfigType, Map<String, ServerAuthContext> serverAuthContextMap) {
-            this.serverAuthConfigType = serverAuthConfigType;
-            this.serverAuthContextMap = serverAuthContextMap;
-        }
-
-        public ServerAuthContext getAuthContext(String authContextID, Subject serverSubject, Map properties) throws AuthException {
-            return serverAuthContextMap.get(authContextID);
-        }
-
-        public String getAppContext() {
-            return serverAuthConfigType.getAppContext();
-        }
-
-        public String getAuthContextID(MessageInfo messageInfo) throws IllegalArgumentException {
-            return serverAuthConfigType.getAuthContextID(messageInfo);
-        }
-
-        public String getMessageLayer() {
-            return serverAuthConfigType.getMessageLayer();
-        }
-
-        public boolean isProtected() {
-            return serverAuthConfigType.isProtected();
-        }
-
-        public void refresh() throws SecurityException {
-        }
-    }
 }
diff --git a/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/ServerAuthContextType.java b/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/ServerAuthContextType.java
index ba7fcf3..5c57955 100644
--- a/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/ServerAuthContextType.java
+++ b/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/ServerAuthContextType.java
@@ -29,10 +29,8 @@
 import java.util.Collections;
 import java.util.List;
 
-import javax.security.auth.Subject;
 import javax.security.auth.callback.CallbackHandler;
 import javax.security.auth.message.AuthException;
-import javax.security.auth.message.AuthStatus;
 import javax.security.auth.message.MessageInfo;
 import javax.security.auth.message.config.ServerAuthContext;
 import javax.security.auth.message.module.ServerAuthModule;
@@ -40,6 +38,7 @@
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlTransient;
 import javax.xml.bind.annotation.XmlType;
+import org.apache.geronimo.components.jaspi.impl.ServerAuthContextImpl;
 
 
 /**
@@ -63,7 +62,7 @@
  * </pre>
  *
  * 
- * @version $Rev$ $Date$
+ * @version $Rev: 939768 $ $Date: 2010-04-30 11:26:46 -0700 (Fri, 30 Apr 2010) $
  */
 @XmlAccessorType(XmlAccessType.FIELD)
 @XmlType(name = "serverAuthContextType", propOrder = {
@@ -73,7 +72,7 @@
         "serverAuthModule"
         })
 public class ServerAuthContextType
-        implements Serializable, KeyedObject {
+        implements Serializable {
 
     private final static long serialVersionUID = 12343L;
     protected String messageLayer;
@@ -81,10 +80,6 @@
     protected String authenticationContextID;
     protected List<AuthModuleType<ServerAuthModule>> serverAuthModule;
 
-    @XmlTransient
-    private ServerAuthContext serverAuthContext;
-
-
     public ServerAuthContextType() {
     }
 
@@ -187,94 +182,4 @@
         return this.serverAuthModule;
     }
 
-    public String getKey() {
-        return ConfigProviderType.getRegistrationKey(messageLayer, appContext);
-    }
-
-    public void initialize(CallbackHandler callbackHandler) throws AuthException {
-        List<ServerAuthModule> serverAuthModules = new ArrayList<ServerAuthModule>();
-        for (AuthModuleType<ServerAuthModule> serverAuthModuleType: serverAuthModule) {
-            ServerAuthModule instance = serverAuthModuleType.newAuthModule(callbackHandler);
-            serverAuthModules.add(instance);
-        }
-        serverAuthContext = new ServerAuthContextImpl(serverAuthModules);
-    }
-
-    public boolean isPersistent() {
-        return true;
-    }
-
-    public ServerAuthContext getServerAuthContext() {
-        return serverAuthContext;
-    }
-
-    public ServerAuthContext newServerAuthContext(CallbackHandler callbackHandler) throws AuthException {
-        List<ServerAuthModule> serverAuthModules = new ArrayList<ServerAuthModule>();
-        for (AuthModuleType<ServerAuthModule> serverAuthModuleType: serverAuthModule) {
-            ServerAuthModule instance = serverAuthModuleType.newAuthModule(callbackHandler);
-            serverAuthModules.add(instance);
-        }
-        return new ServerAuthContextImpl(serverAuthModules);
-    }
-
-    public boolean match(String messageLayer, String appContext) {
-        if (messageLayer == null) throw new NullPointerException("messageLayer");
-        if (appContext == null) throw new NullPointerException("appContext");
-        if (messageLayer.equals(this.messageLayer)) {
-            return appContext.equals(this.appContext) || this.appContext == null;
-        }
-        if (this.messageLayer == null) {
-            return appContext.equals(this.appContext) || this.appContext == null;
-        }
-        return false;
-    }
-
-    public static class ServerAuthContextImpl implements ServerAuthContext {
-
-        private final List<ServerAuthModule> serverAuthModules;
-
-        public ServerAuthContextImpl(List<ServerAuthModule> serverAuthModules) {
-            this.serverAuthModules = serverAuthModules;
-        }
-
-        public void cleanSubject(MessageInfo messageInfo, Subject subject) throws AuthException {
-            for (ServerAuthModule serverAuthModule : serverAuthModules) {
-                serverAuthModule.cleanSubject(messageInfo, subject);
-            }
-        }
-
-        public AuthStatus secureResponse(MessageInfo messageInfo, Subject serviceSubject) throws AuthException {
-            for (ServerAuthModule serverAuthModule : serverAuthModules) {
-                AuthStatus result = serverAuthModule.secureResponse(messageInfo, serviceSubject);
-
-                //jaspi spec p 86
-                if (result == AuthStatus.SEND_SUCCESS) {
-                    continue;
-                }
-                if (result == AuthStatus.SEND_CONTINUE || result == AuthStatus.SEND_FAILURE) {
-                    return result;
-                }
-                throw new AuthException("Invalid AuthStatus " + result + " from server auth module secureResponse: " + serverAuthModule);
-            }
-            return AuthStatus.SEND_SUCCESS;
-        }
-
-        public AuthStatus validateRequest(MessageInfo messageInfo, Subject clientSubject, Subject serviceSubject) throws AuthException {
-            for (ServerAuthModule serverAuthModule : serverAuthModules) {
-                AuthStatus result = serverAuthModule.validateRequest(messageInfo, clientSubject, serviceSubject);
-
-                //jaspi spec p 88
-                if (result == AuthStatus.SUCCESS) {
-                    continue;
-                }
-                if (result == AuthStatus.SEND_SUCCESS || result == AuthStatus.SEND_CONTINUE || result == AuthStatus.FAILURE) {
-                    return result;
-                }
-                throw new AuthException("Invalid AuthStatus " + result + " from server auth module validateRequest: " + serverAuthModule);
-            }
-            return AuthStatus.SUCCESS;
-        }
-
-    }
-
 }
diff --git a/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/StringMapAdapter.java b/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/StringMapAdapter.java
index 4000057..ca19bac 100644
--- a/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/StringMapAdapter.java
+++ b/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/StringMapAdapter.java
@@ -31,7 +31,7 @@
 /**
  * jaxb helper class for maps
  *
- * @version $Rev$ $Date$
+ * @version $Rev: 939768 $ $Date: 2010-04-30 11:26:46 -0700 (Fri, 30 Apr 2010) $
  */
 public class StringMapAdapter extends XmlAdapter<String, Map<String, String>> {
     public Map<String, String> unmarshal(String s) throws Exception {
diff --git a/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/TargetPolicyType.java b/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/TargetPolicyType.java
index 04dc719..2a0d233 100644
--- a/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/TargetPolicyType.java
+++ b/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/TargetPolicyType.java
@@ -55,7 +55,7 @@
  * </pre>
  * 
  * 
- * @version $Rev$ $Date$
+ * @version $Rev: 939768 $ $Date: 2010-04-30 11:26:46 -0700 (Fri, 30 Apr 2010) $
  */
 @XmlAccessorType(XmlAccessType.FIELD)
 @XmlType(name = "targetPolicyType", propOrder = {
@@ -125,12 +125,4 @@
         return this.target;
     }
 
-    public MessagePolicy.TargetPolicy newTargetPolicy() throws AuthException {
-        MessagePolicy.Target[] targets = new MessagePolicy.Target[getTarget().size()];
-        int i = 0;
-        for (TargetType targetType: getTarget()) {
-            targets[i++] = targetType.newTarget();
-        }
-        return new MessagePolicy.TargetPolicy(targets, protectionPolicy.newProtectionPolicy());
-    }
 }
diff --git a/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/TargetType.java b/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/TargetType.java
index 1fa425d..0570282 100644
--- a/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/TargetType.java
+++ b/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/TargetType.java
@@ -57,7 +57,7 @@
  * </pre>
  * 
  * 
- * @version $Rev$ $Date$
+ * @version $Rev: 939768 $ $Date: 2010-04-30 11:26:46 -0700 (Fri, 30 Apr 2010) $
  */
 @XmlAccessorType(XmlAccessType.FIELD)
 @XmlType(name = "targetType", propOrder = {
@@ -95,29 +95,4 @@
         this.className = value;
     }
 
-    public MessagePolicy.Target newTarget() throws AuthException {
-        try {
-            return java.security.AccessController
-            .doPrivileged(new PrivilegedExceptionAction<MessagePolicy.Target>() {
-                public MessagePolicy.Target run() throws ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException {
-                    Class<? extends MessagePolicy.Target> cl = ProviderLocator.loadClass(className, getClass(), Thread.currentThread().getContextClassLoader()).asSubclass(MessagePolicy.Target.class);
-                    Constructor<? extends MessagePolicy.Target> cnst = cl.getConstructor();
-                    MessagePolicy.Target target = cnst.newInstance();
-                    return target;
-                }
-            });
-        } catch (PrivilegedActionException e) {
-            Exception inner = e.getException();
-            if (inner instanceof InstantiationException) {
-                throw (AuthException) new AuthException("AuthConfigFactory error:"
-                                + inner.getCause().getMessage()).initCause(inner.getCause());
-            } else {
-                throw (AuthException) new AuthException("AuthConfigFactory error: " + inner).initCause(inner);
-            }
-        } catch (Exception e) {
-            throw (AuthException) new AuthException("AuthConfigFactory error: " + e).initCause(e);
-        }
-        
-    }
-
 }
diff --git a/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/package-info.java b/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/package-info.java
index 969a8a6..857f0dd 100644
--- a/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/package-info.java
+++ b/geronimo-jaspi/src/main/java/org/apache/geronimo/components/jaspi/model/package-info.java
@@ -21,7 +21,7 @@
 // Generated on: 2008.07.15 at 04:13:34 PM PDT 
 //
 /**
- * @version $Rev$ $Date$
+ * @version $Rev: 680565 $ $Date: 2008-07-28 16:33:51 -0700 (Mon, 28 Jul 2008) $
  */
 @javax.xml.bind.annotation.XmlSchema(namespace = "http://geronimo.apache.org/xml/ns/geronimo-jaspi", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
 package org.apache.geronimo.components.jaspi.model;
diff --git a/geronimo-jaspi/src/main/java/sxc/org/apache/geronimo/components/jaspi/model/AuthModuleTypeJAXB.java b/geronimo-jaspi/src/main/java/sxc/org/apache/geronimo/components/jaspi/model/AuthModuleTypeJAXB.java
deleted file mode 100644
index 21f8e8a..0000000
--- a/geronimo-jaspi/src/main/java/sxc/org/apache/geronimo/components/jaspi/model/AuthModuleTypeJAXB.java
+++ /dev/null
@@ -1,230 +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 sxc.org.apache.geronimo.components.jaspi.model;
-
-import java.util.Map;
-import javax.xml.XMLConstants;
-import javax.xml.namespace.QName;
-import javax.security.auth.message.module.ClientAuthModule;
-import javax.security.auth.message.module.ServerAuthModule;
-
-import com.envoisolutions.sxc.jaxb.FieldAccessor;
-import com.envoisolutions.sxc.jaxb.JAXBObject;
-import com.envoisolutions.sxc.jaxb.LifecycleCallback;
-import com.envoisolutions.sxc.jaxb.RuntimeContext;
-import com.envoisolutions.sxc.util.Attribute;
-import com.envoisolutions.sxc.util.XoXMLStreamReader;
-import com.envoisolutions.sxc.util.XoXMLStreamWriter;
-import org.apache.geronimo.components.jaspi.model.AuthModuleType;
-import org.apache.geronimo.components.jaspi.model.MessagePolicyType;
-import org.apache.geronimo.components.jaspi.model.StringMapAdapter;
-
-
-import static sxc.org.apache.geronimo.components.jaspi.model.MessagePolicyTypeJAXB.readMessagePolicyType;
-import static sxc.org.apache.geronimo.components.jaspi.model.MessagePolicyTypeJAXB.writeMessagePolicyType;
-
-/**
- * @version $Rev: $ $Date: $
- */
-
-@SuppressWarnings({
-    "StringEquality"
-})
-public class AuthModuleTypeJAXB<T>
-    extends JAXBObject<AuthModuleType>
-{
-
-    public final static AuthModuleTypeJAXB<ClientAuthModule> CLIENT_INSTANCE = new AuthModuleTypeJAXB<ClientAuthModule>();
-    public final static AuthModuleTypeJAXB<ServerAuthModule> SERVER_INSTANCE = new AuthModuleTypeJAXB<ServerAuthModule>();
-    private final static LifecycleCallback lifecycleCallback = new LifecycleCallback(AuthModuleType.class);
-    private final static FieldAccessor<AuthModuleType, String> authModuleTypeClassName = new FieldAccessor<AuthModuleType, String>(AuthModuleType.class, "className");
-    private final static FieldAccessor<AuthModuleType, String> authModuleTypeClassLoaderName = new FieldAccessor<AuthModuleType, String>(AuthModuleType.class, "classLoaderName");
-    private final static FieldAccessor<AuthModuleType, MessagePolicyType> authModuleTypeRequestPolicy = new FieldAccessor<AuthModuleType, MessagePolicyType>(AuthModuleType.class, "requestPolicy");
-    private final static FieldAccessor<AuthModuleType, MessagePolicyType> authModuleTypeResponsePolicy = new FieldAccessor<AuthModuleType, MessagePolicyType>(AuthModuleType.class, "responsePolicy");
-    private final static FieldAccessor<AuthModuleType, Map<String, String>> authModuleTypeOptions = new FieldAccessor<AuthModuleType, Map<String, String>>(AuthModuleType.class, "options");
-    private final static StringMapAdapter stringMapAdapterAdapter = new StringMapAdapter();
-
-    public AuthModuleTypeJAXB() {
-        super(AuthModuleType.class, null, new QName("http://geronimo.apache.org/xml/ns/geronimo-jaspi".intern(), "authModuleType".intern()), MessagePolicyTypeJAXB.class);
-    }
-
-    public static AuthModuleType<ClientAuthModule> readClientAuthModuleType(XoXMLStreamReader reader, RuntimeContext context)
-        throws Exception
-    {
-        return CLIENT_INSTANCE.read(reader, context);
-    }
-
-    public static void writeClientAuthModuleType(XoXMLStreamWriter writer, AuthModuleType authModuleType, RuntimeContext context)
-        throws Exception
-    {
-        CLIENT_INSTANCE.write(writer, authModuleType, context);
-    }
-
-    public static AuthModuleType<ServerAuthModule> readServerAuthModuleType(XoXMLStreamReader reader, RuntimeContext context)
-        throws Exception
-    {
-        return SERVER_INSTANCE.read(reader, context);
-    }
-
-    public static void writeServerAuthModuleType(XoXMLStreamWriter writer, AuthModuleType authModuleType, RuntimeContext context)
-        throws Exception
-    {
-        SERVER_INSTANCE.write(writer, authModuleType, context);
-    }
-
-    public final AuthModuleType<T> read(XoXMLStreamReader reader, RuntimeContext context)
-        throws Exception
-    {
-        // Check for xsi:nil
-        if (reader.isXsiNil()) {
-            return null;
-        }
-
-        if (context == null) {
-            context = new RuntimeContext();
-        }
-
-        AuthModuleType<T> authModuleType = new AuthModuleType<T>();
-        context.beforeUnmarshal(authModuleType, lifecycleCallback);
-
-
-        // Check xsi:type
-        QName xsiType = reader.getXsiType();
-        if (xsiType!= null) {
-            if (("authModuleType"!= xsiType.getLocalPart())||("http://geronimo.apache.org/xml/ns/geronimo-jaspi"!= xsiType.getNamespaceURI())) {
-                return context.unexpectedXsiType(reader, AuthModuleType.class);
-            }
-        }
-
-        // Read attributes
-        for (Attribute attribute: reader.getAttributes()) {
-            if (XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI!= attribute.getNamespace()) {
-                context.unexpectedAttribute(attribute);
-            }
-        }
-
-        // Read elements
-        for (XoXMLStreamReader elementReader: reader.getChildElements()) {
-            if (("className" == elementReader.getLocalName())&&("http://geronimo.apache.org/xml/ns/geronimo-jaspi" == elementReader.getNamespaceURI())) {
-                // ELEMENT: className
-                String className = elementReader.getElementAsString();
-                authModuleTypeClassName.setObject(reader, context, authModuleType, className);
-            } else if (("classLoaderName" == elementReader.getLocalName())&&("http://geronimo.apache.org/xml/ns/geronimo-jaspi" == elementReader.getNamespaceURI())) {
-                // ELEMENT: classLoaderName
-                String classLoaderName = elementReader.getElementAsString();
-                authModuleTypeClassLoaderName.setObject(reader, context, authModuleType, classLoaderName);
-            } else if (("requestPolicy" == elementReader.getLocalName())&&("http://geronimo.apache.org/xml/ns/geronimo-jaspi" == elementReader.getNamespaceURI())) {
-                // ELEMENT: requestPolicy
-                MessagePolicyType requestPolicy = readMessagePolicyType(elementReader, context);
-                authModuleTypeRequestPolicy.setObject(reader, context, authModuleType, requestPolicy);
-            } else if (("responsePolicy" == elementReader.getLocalName())&&("http://geronimo.apache.org/xml/ns/geronimo-jaspi" == elementReader.getNamespaceURI())) {
-                // ELEMENT: responsePolicy
-                MessagePolicyType responsePolicy = readMessagePolicyType(elementReader, context);
-                authModuleTypeResponsePolicy.setObject(reader, context, authModuleType, responsePolicy);
-            } else if (("options" == elementReader.getLocalName())&&("http://geronimo.apache.org/xml/ns/geronimo-jaspi" == elementReader.getNamespaceURI())) {
-                // ELEMENT: options
-                String optionsRaw = elementReader.getElementAsString();
-
-                Map<String, String> options;
-                try {
-                    options = stringMapAdapterAdapter.unmarshal(optionsRaw);
-                } catch (Exception e) {
-                    context.xmlAdapterError(elementReader, StringMapAdapter.class, Map.class, Map.class, e);
-                    continue;
-                }
-
-                authModuleTypeOptions.setObject(reader, context, authModuleType, options);
-            } else {
-                context.unexpectedElement(elementReader, new QName(elementReader.getNamespaceURI(), elementReader.getLocalName()), new QName("http://geronimo.apache.org/xml/ns/geronimo-jaspi", "requestPolicy"), new QName("http://geronimo.apache.org/xml/ns/geronimo-jaspi", "responsePolicy"), new QName("http://geronimo.apache.org/xml/ns/geronimo-jaspi", "options"));
-            }
-        }
-
-        context.afterUnmarshal(authModuleType, lifecycleCallback);
-
-        return authModuleType;
-    }
-
-    public final void write(XoXMLStreamWriter writer, AuthModuleType authModuleType, RuntimeContext context)
-        throws Exception
-    {
-        if (authModuleType == null) {
-            writer.writeXsiNil();
-            return ;
-        }
-
-        if (context == null) {
-            context = new RuntimeContext();
-        }
-
-        String prefix = writer.getUniquePrefix("http://geronimo.apache.org/xml/ns/geronimo-jaspi");
-        if (AuthModuleType.class!= authModuleType.getClass()) {
-            context.unexpectedSubclass(writer, authModuleType, AuthModuleType.class);
-            return ;
-        }
-
-        context.beforeMarshal(authModuleType, lifecycleCallback);
-
-
-        // ELEMENT: className
-        String className = authModuleTypeClassName.getObject(authModuleType, context, authModuleType);
-        if (className!= null) {
-            writer.writeStartElement(prefix, "className", "http://geronimo.apache.org/xml/ns/geronimo-jaspi");
-            writer.writeCharacters(className);
-            writer.writeEndElement();
-        } else {
-            context.unexpectedNullValue(authModuleType, "className");
-        }
-
-        // ELEMENT: requestPolicy
-        MessagePolicyType requestPolicy = authModuleTypeRequestPolicy.getObject(authModuleType, context, authModuleType);
-        if (requestPolicy!= null) {
-            writer.writeStartElement(prefix, "requestPolicy", "http://geronimo.apache.org/xml/ns/geronimo-jaspi");
-            writeMessagePolicyType(writer, requestPolicy, context);
-            writer.writeEndElement();
-        } else {
-            context.unexpectedNullValue(authModuleType, "requestPolicy");
-        }
-
-        // ELEMENT: responsePolicy
-        MessagePolicyType responsePolicy = authModuleTypeResponsePolicy.getObject(authModuleType, context, authModuleType);
-        if (responsePolicy!= null) {
-            writer.writeStartElement(prefix, "responsePolicy", "http://geronimo.apache.org/xml/ns/geronimo-jaspi");
-            writeMessagePolicyType(writer, responsePolicy, context);
-            writer.writeEndElement();
-        } else {
-            context.unexpectedNullValue(authModuleType, "responsePolicy");
-        }
-
-        // ELEMENT: options
-        Map<String, String> optionsRaw = authModuleTypeOptions.getObject(authModuleType, context, authModuleType);
-        String options = null;
-        try {
-            options = stringMapAdapterAdapter.marshal(optionsRaw);
-        } catch (Exception e) {
-            context.xmlAdapterError(authModuleType, "options", StringMapAdapter.class, Map.class, Map.class, e);
-        }
-        if (options!= null) {
-            writer.writeStartElement(prefix, "options", "http://geronimo.apache.org/xml/ns/geronimo-jaspi");
-            writer.writeCharacters(options);
-            writer.writeEndElement();
-        }
-
-        context.afterMarshal(authModuleType, lifecycleCallback);
-    }
-
-}
diff --git a/geronimo-jaspi/src/main/java/sxc/org/apache/geronimo/components/jaspi/model/ClientAuthConfigTypeJAXB.java b/geronimo-jaspi/src/main/java/sxc/org/apache/geronimo/components/jaspi/model/ClientAuthConfigTypeJAXB.java
deleted file mode 100644
index 3efdff9..0000000
--- a/geronimo-jaspi/src/main/java/sxc/org/apache/geronimo/components/jaspi/model/ClientAuthConfigTypeJAXB.java
+++ /dev/null
@@ -1,225 +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 sxc.org.apache.geronimo.components.jaspi.model;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-import javax.xml.XMLConstants;
-import javax.xml.namespace.QName;
-import com.envoisolutions.sxc.jaxb.FieldAccessor;
-import com.envoisolutions.sxc.jaxb.JAXBObject;
-import com.envoisolutions.sxc.jaxb.LifecycleCallback;
-import com.envoisolutions.sxc.jaxb.RuntimeContext;
-import com.envoisolutions.sxc.util.Attribute;
-import com.envoisolutions.sxc.util.XoXMLStreamReader;
-import com.envoisolutions.sxc.util.XoXMLStreamWriter;
-import org.apache.geronimo.components.jaspi.model.ClientAuthConfigType;
-import org.apache.geronimo.components.jaspi.model.ClientAuthContextType;
-import org.apache.geronimo.components.jaspi.model.KeyedObjectMapAdapter;
-
-
-import static sxc.org.apache.geronimo.components.jaspi.model.ClientAuthContextTypeJAXB.readClientAuthContextType;
-import static sxc.org.apache.geronimo.components.jaspi.model.ClientAuthContextTypeJAXB.writeClientAuthContextType;
-
-/**
- * @version $Rev$ $Date$
- */
-
-@SuppressWarnings({
-    "StringEquality"
-})
-public class ClientAuthConfigTypeJAXB
-    extends JAXBObject<ClientAuthConfigType>
-{
-
-    public final static ClientAuthConfigTypeJAXB INSTANCE = new ClientAuthConfigTypeJAXB();
-    private final static LifecycleCallback lifecycleCallback = new LifecycleCallback(ClientAuthConfigType.class);
-    private final static FieldAccessor<ClientAuthConfigType, String> clientAuthConfigTypeMessageLayer = new FieldAccessor<ClientAuthConfigType, String>(ClientAuthConfigType.class, "messageLayer");
-    private final static FieldAccessor<ClientAuthConfigType, String> clientAuthConfigTypeAppContext = new FieldAccessor<ClientAuthConfigType, String>(ClientAuthConfigType.class, "appContext");
-    private final static FieldAccessor<ClientAuthConfigType, String> clientAuthConfigTypeAuthenticationContextID = new FieldAccessor<ClientAuthConfigType, String>(ClientAuthConfigType.class, "authenticationContextID");
-    private final static FieldAccessor<ClientAuthConfigType, Boolean> clientAuthConfigType_protected = new FieldAccessor<ClientAuthConfigType, Boolean>(ClientAuthConfigType.class, "_protected");
-    private final static FieldAccessor<ClientAuthConfigType, Map<String, ClientAuthContextType>> clientAuthConfigTypeClientAuthContext = new FieldAccessor<ClientAuthConfigType, Map<String, ClientAuthContextType>>(ClientAuthConfigType.class, "clientAuthContext");
-    private final static KeyedObjectMapAdapter<ClientAuthContextType> clientAuthContextMapAdapter = new KeyedObjectMapAdapter<ClientAuthContextType>(ClientAuthContextType.class);
-
-    public ClientAuthConfigTypeJAXB() {
-        super(ClientAuthConfigType.class, null, new QName("http://geronimo.apache.org/xml/ns/geronimo-jaspi".intern(), "clientAuthConfigType".intern()), ClientAuthContextTypeJAXB.class);
-    }
-
-    public static ClientAuthConfigType readClientAuthConfigType(XoXMLStreamReader reader, RuntimeContext context)
-        throws Exception
-    {
-        return INSTANCE.read(reader, context);
-    }
-
-    public static void writeClientAuthConfigType(XoXMLStreamWriter writer, ClientAuthConfigType clientAuthConfigType, RuntimeContext context)
-        throws Exception
-    {
-        INSTANCE.write(writer, clientAuthConfigType, context);
-    }
-
-    public final ClientAuthConfigType read(XoXMLStreamReader reader, RuntimeContext context)
-        throws Exception
-    {
-
-        // Check for xsi:nil
-        if (reader.isXsiNil()) {
-            return null;
-        }
-
-        if (context == null) {
-            context = new RuntimeContext();
-        }
-
-        ClientAuthConfigType clientAuthConfigType = new ClientAuthConfigType();
-        context.beforeUnmarshal(clientAuthConfigType, lifecycleCallback);
-
-        List<ClientAuthContextType> clientAuthContextRaw = new ArrayList<ClientAuthContextType>();
-
-        // Check xsi:type
-        QName xsiType = reader.getXsiType();
-        if (xsiType!= null) {
-            if (("clientAuthConfigType"!= xsiType.getLocalPart())||("http://geronimo.apache.org/xml/ns/geronimo-jaspi"!= xsiType.getNamespaceURI())) {
-                return context.unexpectedXsiType(reader, ClientAuthConfigType.class);
-            }
-        }
-
-        // Read attributes
-        for (Attribute attribute: reader.getAttributes()) {
-            if (XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI!= attribute.getNamespace()) {
-                context.unexpectedAttribute(attribute);
-            }
-        }
-
-        // Read elements
-        for (XoXMLStreamReader elementReader: reader.getChildElements()) {
-            if (("messageLayer" == elementReader.getLocalName())&&("http://geronimo.apache.org/xml/ns/geronimo-jaspi" == elementReader.getNamespaceURI())) {
-                // ELEMENT: messageLayer
-                String messageLayer = elementReader.getElementAsString();
-                clientAuthConfigTypeMessageLayer.setObject(reader, context, clientAuthConfigType, messageLayer);
-            } else if (("appContext" == elementReader.getLocalName())&&("http://geronimo.apache.org/xml/ns/geronimo-jaspi" == elementReader.getNamespaceURI())) {
-                // ELEMENT: appContext
-                String appContext = elementReader.getElementAsString();
-                clientAuthConfigTypeAppContext.setObject(reader, context, clientAuthConfigType, appContext);
-            } else if (("authenticationContextID" == elementReader.getLocalName())&&("http://geronimo.apache.org/xml/ns/geronimo-jaspi" == elementReader.getNamespaceURI())) {
-                // ELEMENT: authenticationContextID
-                String authenticationContextID = elementReader.getElementAsString();
-                clientAuthConfigTypeAuthenticationContextID.setObject(reader, context, clientAuthConfigType, authenticationContextID);
-            } else if (("protected" == elementReader.getLocalName())&&("http://geronimo.apache.org/xml/ns/geronimo-jaspi" == elementReader.getNamespaceURI())) {
-                // ELEMENT: _protected
-                Boolean _protected = ("1".equals(elementReader.getElementAsString())||"true".equals(elementReader.getElementAsString()));
-                clientAuthConfigType_protected.setBoolean(reader, context, clientAuthConfigType, _protected);
-            } else if (("clientAuthContext" == elementReader.getLocalName())&&("http://geronimo.apache.org/xml/ns/geronimo-jaspi" == elementReader.getNamespaceURI())) {
-                // ELEMENT: clientAuthContext
-                ClientAuthContextType clientAuthContextItem = readClientAuthContextType(elementReader, context);
-//                if (clientAuthContextRaw == null) {
-//                    clientAuthContextRaw = clientAuthConfigTypeClientAuthContext.getObject(reader, context, clientAuthConfigType);
-//                    if (clientAuthContextRaw!= null) {
-//                        clientAuthContextRaw.clear();
-//                    } else {
-//                        clientAuthContextRaw = new ArrayList<ClientAuthContextType>();
-//                    }
-//                }
-                clientAuthContextRaw.add(clientAuthContextItem);
-            } else {
-                context.unexpectedElement(elementReader, new QName("http://geronimo.apache.org/xml/ns/geronimo-jaspi", "messageLayer"), new QName("http://geronimo.apache.org/xml/ns/geronimo-jaspi", "appContext"), new QName("http://geronimo.apache.org/xml/ns/geronimo-jaspi", "authenticationContextID"), new QName("http://geronimo.apache.org/xml/ns/geronimo-jaspi", "protected"), new QName("http://geronimo.apache.org/xml/ns/geronimo-jaspi", "clientAuthContext"));
-            }
-        }
-        if (clientAuthContextRaw != null) {
-            Map<String, ClientAuthContextType> clientAuthContext = clientAuthContextMapAdapter.unmarshal(clientAuthContextRaw.toArray(new ClientAuthContextType[clientAuthContextRaw.size()]));
-            clientAuthConfigTypeClientAuthContext.setObject(reader, context, clientAuthConfigType, clientAuthContext);
-        }
-
-        context.afterUnmarshal(clientAuthConfigType, lifecycleCallback);
-
-        return clientAuthConfigType;
-    }
-
-    public final void write(XoXMLStreamWriter writer, ClientAuthConfigType clientAuthConfigType, RuntimeContext context)
-        throws Exception
-    {
-        if (clientAuthConfigType == null) {
-            writer.writeXsiNil();
-            return ;
-        }
-
-        if (context == null) {
-            context = new RuntimeContext();
-        }
-
-        String prefix = writer.getUniquePrefix("http://geronimo.apache.org/xml/ns/geronimo-jaspi");
-        if (ClientAuthConfigType.class!= clientAuthConfigType.getClass()) {
-            context.unexpectedSubclass(writer, clientAuthConfigType, ClientAuthConfigType.class);
-            return ;
-        }
-
-        context.beforeMarshal(clientAuthConfigType, lifecycleCallback);
-
-
-        // ELEMENT: messageLayer
-        String messageLayer = clientAuthConfigTypeMessageLayer.getObject(clientAuthConfigType, context, clientAuthConfigType);
-        if (messageLayer!= null) {
-            writer.writeStartElement(prefix, "messageLayer", "http://geronimo.apache.org/xml/ns/geronimo-jaspi");
-            writer.writeCharacters(messageLayer);
-            writer.writeEndElement();
-        }
-
-        // ELEMENT: appContext
-        String appContext = clientAuthConfigTypeAppContext.getObject(clientAuthConfigType, context, clientAuthConfigType);
-        if (appContext!= null) {
-            writer.writeStartElement(prefix, "appContext", "http://geronimo.apache.org/xml/ns/geronimo-jaspi");
-            writer.writeCharacters(appContext);
-            writer.writeEndElement();
-        }
-
-        // ELEMENT: authenticationContextID
-        String authenticationContextID = clientAuthConfigTypeAuthenticationContextID.getObject(clientAuthConfigType, context, clientAuthConfigType);
-        if (authenticationContextID!= null) {
-            writer.writeStartElement(prefix, "authenticationContextID", "http://geronimo.apache.org/xml/ns/geronimo-jaspi");
-            writer.writeCharacters(authenticationContextID);
-            writer.writeEndElement();
-        } else {
-            context.unexpectedNullValue(clientAuthConfigType, "authenticationContextID");
-        }
-
-        // ELEMENT: _protected
-        Boolean _protected = clientAuthConfigType_protected.getBoolean(clientAuthConfigType, context, clientAuthConfigType);
-        writer.writeStartElement(prefix, "protected", "http://geronimo.apache.org/xml/ns/geronimo-jaspi");
-        writer.writeCharacters(Boolean.toString(_protected));
-        writer.writeEndElement();
-
-        // ELEMENT: clientAuthContext
-        Map<String, ClientAuthContextType> clientAuthContextMap = clientAuthConfigTypeClientAuthContext.getObject(clientAuthConfigType, context, clientAuthConfigType);
-        ClientAuthContextType[] clientAuthContext = clientAuthContextMapAdapter.marshal(clientAuthContextMap);
-        if (clientAuthContext!= null) {
-            for (ClientAuthContextType clientAuthContextItem: clientAuthContext) {
-                writer.writeStartElement(prefix, "clientAuthContext", "http://geronimo.apache.org/xml/ns/geronimo-jaspi");
-                if (clientAuthContextItem!= null) {
-                    writeClientAuthContextType(writer, clientAuthContextItem, context);
-                } else {
-                    writer.writeXsiNil();
-                }
-                writer.writeEndElement();
-            }
-        }
-
-        context.afterMarshal(clientAuthConfigType, lifecycleCallback);
-    }
-
-}
diff --git a/geronimo-jaspi/src/main/java/sxc/org/apache/geronimo/components/jaspi/model/ClientAuthContextTypeJAXB.java b/geronimo-jaspi/src/main/java/sxc/org/apache/geronimo/components/jaspi/model/ClientAuthContextTypeJAXB.java
deleted file mode 100644
index 291a36b..0000000
--- a/geronimo-jaspi/src/main/java/sxc/org/apache/geronimo/components/jaspi/model/ClientAuthContextTypeJAXB.java
+++ /dev/null
@@ -1,208 +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 sxc.org.apache.geronimo.components.jaspi.model;
-
-import java.util.ArrayList;
-import java.util.List;
-import javax.xml.XMLConstants;
-import javax.xml.namespace.QName;
-import com.envoisolutions.sxc.jaxb.FieldAccessor;
-import com.envoisolutions.sxc.jaxb.JAXBObject;
-import com.envoisolutions.sxc.jaxb.LifecycleCallback;
-import com.envoisolutions.sxc.jaxb.RuntimeContext;
-import com.envoisolutions.sxc.util.Attribute;
-import com.envoisolutions.sxc.util.XoXMLStreamReader;
-import com.envoisolutions.sxc.util.XoXMLStreamWriter;
-import org.apache.geronimo.components.jaspi.model.AuthModuleType;
-import org.apache.geronimo.components.jaspi.model.ClientAuthContextType;
-
-
-import static sxc.org.apache.geronimo.components.jaspi.model.AuthModuleTypeJAXB.readClientAuthModuleType;
-import static sxc.org.apache.geronimo.components.jaspi.model.AuthModuleTypeJAXB.writeClientAuthModuleType;
-
-/**
- * @version $Rev$ $Date$
- */
-
-@SuppressWarnings({
-    "StringEquality"
-})
-public class ClientAuthContextTypeJAXB
-    extends JAXBObject<ClientAuthContextType>
-{
-
-    public final static ClientAuthContextTypeJAXB INSTANCE = new ClientAuthContextTypeJAXB();
-    private final static LifecycleCallback lifecycleCallback = new LifecycleCallback(ClientAuthContextType.class);
-    private final static FieldAccessor<ClientAuthContextType, String> clientAuthContextTypeMessageLayer = new FieldAccessor<ClientAuthContextType, String>(ClientAuthContextType.class, "messageLayer");
-    private final static FieldAccessor<ClientAuthContextType, String> clientAuthContextTypeAppContext = new FieldAccessor<ClientAuthContextType, String>(ClientAuthContextType.class, "appContext");
-    private final static FieldAccessor<ClientAuthContextType, String> clientAuthContextTypeAuthenticationContextID = new FieldAccessor<ClientAuthContextType, String>(ClientAuthContextType.class, "authenticationContextID");
-    private final static FieldAccessor<ClientAuthContextType, List<AuthModuleType>> clientAuthContextTypeClientAuthModule = new FieldAccessor<ClientAuthContextType, List<AuthModuleType>>(ClientAuthContextType.class, "clientAuthModule");
-
-    public ClientAuthContextTypeJAXB() {
-        super(ClientAuthContextType.class, null, new QName("http://geronimo.apache.org/xml/ns/geronimo-jaspi".intern(), "clientAuthContextType".intern()), AuthModuleTypeJAXB.class);
-    }
-
-    public static ClientAuthContextType readClientAuthContextType(XoXMLStreamReader reader, RuntimeContext context)
-        throws Exception
-    {
-        return INSTANCE.read(reader, context);
-    }
-
-    public static void writeClientAuthContextType(XoXMLStreamWriter writer, ClientAuthContextType clientAuthContextType, RuntimeContext context)
-        throws Exception
-    {
-        INSTANCE.write(writer, clientAuthContextType, context);
-    }
-
-    public final ClientAuthContextType read(XoXMLStreamReader reader, RuntimeContext context)
-        throws Exception
-    {
-
-        // Check for xsi:nil
-        if (reader.isXsiNil()) {
-            return null;
-        }
-
-        if (context == null) {
-            context = new RuntimeContext();
-        }
-
-        ClientAuthContextType clientAuthContextType = new ClientAuthContextType();
-        context.beforeUnmarshal(clientAuthContextType, lifecycleCallback);
-
-        List<AuthModuleType> clientAuthModule = null;
-
-        // Check xsi:type
-        QName xsiType = reader.getXsiType();
-        if (xsiType!= null) {
-            if (("clientAuthContextType"!= xsiType.getLocalPart())||("http://geronimo.apache.org/xml/ns/geronimo-jaspi"!= xsiType.getNamespaceURI())) {
-                return context.unexpectedXsiType(reader, ClientAuthContextType.class);
-            }
-        }
-
-        // Read attributes
-        for (Attribute attribute: reader.getAttributes()) {
-            if (XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI!= attribute.getNamespace()) {
-                context.unexpectedAttribute(attribute);
-            }
-        }
-
-        // Read elements
-        for (XoXMLStreamReader elementReader: reader.getChildElements()) {
-            if (("messageLayer" == elementReader.getLocalName())&&("http://geronimo.apache.org/xml/ns/geronimo-jaspi" == elementReader.getNamespaceURI())) {
-                // ELEMENT: messageLayer
-                String messageLayer = elementReader.getElementAsString();
-                clientAuthContextTypeMessageLayer.setObject(reader, context, clientAuthContextType, messageLayer);
-            } else if (("appContext" == elementReader.getLocalName())&&("http://geronimo.apache.org/xml/ns/geronimo-jaspi" == elementReader.getNamespaceURI())) {
-                // ELEMENT: appContext
-                String appContext = elementReader.getElementAsString();
-                clientAuthContextTypeAppContext.setObject(reader, context, clientAuthContextType, appContext);
-            } else if (("authenticationContextID" == elementReader.getLocalName())&&("http://geronimo.apache.org/xml/ns/geronimo-jaspi" == elementReader.getNamespaceURI())) {
-                // ELEMENT: authenticationContextID
-                String authenticationContextID = elementReader.getElementAsString();
-                clientAuthContextTypeAuthenticationContextID.setObject(reader, context, clientAuthContextType, authenticationContextID);
-            } else if (("clientAuthModule" == elementReader.getLocalName())&&("http://geronimo.apache.org/xml/ns/geronimo-jaspi" == elementReader.getNamespaceURI())) {
-                // ELEMENT: clientAuthModule
-                AuthModuleType clientAuthModuleItem = readClientAuthModuleType(elementReader, context);
-                if (clientAuthModule == null) {
-                    clientAuthModule = clientAuthContextTypeClientAuthModule.getObject(reader, context, clientAuthContextType);
-                    if (clientAuthModule!= null) {
-                        clientAuthModule.clear();
-                    } else {
-                        clientAuthModule = new ArrayList<AuthModuleType>();
-                    }
-                }
-                clientAuthModule.add(clientAuthModuleItem);
-            } else {
-                context.unexpectedElement(elementReader, new QName("http://geronimo.apache.org/xml/ns/geronimo-jaspi", "messageLayer"), new QName("http://geronimo.apache.org/xml/ns/geronimo-jaspi", "appContext"), new QName("http://geronimo.apache.org/xml/ns/geronimo-jaspi", "authenticationContextID"), new QName("http://geronimo.apache.org/xml/ns/geronimo-jaspi", "clientAuthModule"));
-            }
-        }
-        if (clientAuthModule!= null) {
-            clientAuthContextTypeClientAuthModule.setObject(reader, context, clientAuthContextType, clientAuthModule);
-        }
-
-        context.afterUnmarshal(clientAuthContextType, lifecycleCallback);
-
-        return clientAuthContextType;
-    }
-
-    public final void write(XoXMLStreamWriter writer, ClientAuthContextType clientAuthContextType, RuntimeContext context)
-        throws Exception
-    {
-        if (clientAuthContextType == null) {
-            writer.writeXsiNil();
-            return ;
-        }
-
-        if (context == null) {
-            context = new RuntimeContext();
-        }
-
-        String prefix = writer.getUniquePrefix("http://geronimo.apache.org/xml/ns/geronimo-jaspi");
-        if (ClientAuthContextType.class!= clientAuthContextType.getClass()) {
-            context.unexpectedSubclass(writer, clientAuthContextType, ClientAuthContextType.class);
-            return ;
-        }
-
-        context.beforeMarshal(clientAuthContextType, lifecycleCallback);
-
-
-        // ELEMENT: messageLayer
-        String messageLayer = clientAuthContextTypeMessageLayer.getObject(clientAuthContextType, context, clientAuthContextType);
-        if (messageLayer!= null) {
-            writer.writeStartElement(prefix, "messageLayer", "http://geronimo.apache.org/xml/ns/geronimo-jaspi");
-            writer.writeCharacters(messageLayer);
-            writer.writeEndElement();
-        }
-
-        // ELEMENT: appContext
-        String appContext = clientAuthContextTypeAppContext.getObject(clientAuthContextType, context, clientAuthContextType);
-        if (appContext!= null) {
-            writer.writeStartElement(prefix, "appContext", "http://geronimo.apache.org/xml/ns/geronimo-jaspi");
-            writer.writeCharacters(appContext);
-            writer.writeEndElement();
-        }
-
-        // ELEMENT: authenticationContextID
-        String authenticationContextID = clientAuthContextTypeAuthenticationContextID.getObject(clientAuthContextType, context, clientAuthContextType);
-        if (authenticationContextID!= null) {
-            writer.writeStartElement(prefix, "authenticationContextID", "http://geronimo.apache.org/xml/ns/geronimo-jaspi");
-            writer.writeCharacters(authenticationContextID);
-            writer.writeEndElement();
-        } else {
-            context.unexpectedNullValue(clientAuthContextType, "authenticationContextID");
-        }
-
-        // ELEMENT: clientAuthModule
-        List<AuthModuleType> clientAuthModule = clientAuthContextTypeClientAuthModule.getObject(clientAuthContextType, context, clientAuthContextType);
-        if (clientAuthModule!= null) {
-            for (AuthModuleType clientAuthModuleItem: clientAuthModule) {
-                writer.writeStartElement(prefix, "clientAuthModule", "http://geronimo.apache.org/xml/ns/geronimo-jaspi");
-                if (clientAuthModuleItem!= null) {
-                    writeClientAuthModuleType(writer, clientAuthModuleItem, context);
-                } else {
-                    writer.writeXsiNil();
-                }
-                writer.writeEndElement();
-            }
-        }
-
-        context.afterMarshal(clientAuthContextType, lifecycleCallback);
-    }
-
-}
diff --git a/geronimo-jaspi/src/main/java/sxc/org/apache/geronimo/components/jaspi/model/ConfigProviderTypeJAXB.java b/geronimo-jaspi/src/main/java/sxc/org/apache/geronimo/components/jaspi/model/ConfigProviderTypeJAXB.java
deleted file mode 100644
index 10b50d4..0000000
--- a/geronimo-jaspi/src/main/java/sxc/org/apache/geronimo/components/jaspi/model/ConfigProviderTypeJAXB.java
+++ /dev/null
@@ -1,303 +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 sxc.org.apache.geronimo.components.jaspi.model;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import javax.xml.XMLConstants;
-import javax.xml.namespace.QName;
-import com.envoisolutions.sxc.jaxb.FieldAccessor;
-import com.envoisolutions.sxc.jaxb.JAXBObject;
-import com.envoisolutions.sxc.jaxb.LifecycleCallback;
-import com.envoisolutions.sxc.jaxb.RuntimeContext;
-import com.envoisolutions.sxc.util.Attribute;
-import com.envoisolutions.sxc.util.XoXMLStreamReader;
-import com.envoisolutions.sxc.util.XoXMLStreamWriter;
-import org.apache.geronimo.components.jaspi.model.ClientAuthConfigType;
-import org.apache.geronimo.components.jaspi.model.ConfigProviderType;
-import org.apache.geronimo.components.jaspi.model.ServerAuthConfigType;
-import org.apache.geronimo.components.jaspi.model.StringMapAdapter;
-import org.apache.geronimo.components.jaspi.model.KeyedObjectMapAdapter;
-
-
-import static sxc.org.apache.geronimo.components.jaspi.model.ClientAuthConfigTypeJAXB.readClientAuthConfigType;
-import static sxc.org.apache.geronimo.components.jaspi.model.ClientAuthConfigTypeJAXB.writeClientAuthConfigType;
-import static sxc.org.apache.geronimo.components.jaspi.model.ServerAuthConfigTypeJAXB.readServerAuthConfigType;
-import static sxc.org.apache.geronimo.components.jaspi.model.ServerAuthConfigTypeJAXB.writeServerAuthConfigType;
-
-/**
- * @version $Rev$ $Date$
- */
-
-@SuppressWarnings({
-    "StringEquality"
-})
-public class ConfigProviderTypeJAXB
-    extends JAXBObject<ConfigProviderType>
-{
-
-    public final static ConfigProviderTypeJAXB INSTANCE = new ConfigProviderTypeJAXB();
-    private final static LifecycleCallback lifecycleCallback = new LifecycleCallback(ConfigProviderType.class);
-    private final static FieldAccessor<ConfigProviderType, String> configProviderTypeMessageLayer = new FieldAccessor<ConfigProviderType, String>(ConfigProviderType.class, "messageLayer");
-    private final static FieldAccessor<ConfigProviderType, String> configProviderTypeAppContext = new FieldAccessor<ConfigProviderType, String>(ConfigProviderType.class, "appContext");
-    private final static FieldAccessor<ConfigProviderType, String> configProviderTypeDescription = new FieldAccessor<ConfigProviderType, String>(ConfigProviderType.class, "description");
-    private final static FieldAccessor<ConfigProviderType, String> configProviderTypeClassName = new FieldAccessor<ConfigProviderType, String>(ConfigProviderType.class, "className");
-    private final static FieldAccessor<ConfigProviderType, Map<String, String>> configProviderTypeProperties = new FieldAccessor<ConfigProviderType, Map<String, String>>(ConfigProviderType.class, "properties");
-    private final static FieldAccessor<ConfigProviderType, Map<String, ClientAuthConfigType>> configProviderTypeClientAuthConfig = new FieldAccessor<ConfigProviderType, Map<String, ClientAuthConfigType>>(ConfigProviderType.class, "clientAuthConfig");
-    private final static FieldAccessor<ConfigProviderType, Map<String, ServerAuthConfigType>> configProviderTypeServerAuthConfig = new FieldAccessor<ConfigProviderType, Map<String, ServerAuthConfigType>>(ConfigProviderType.class, "serverAuthConfig");
-    private final static FieldAccessor<ConfigProviderType, Boolean> configProviderTypePersistent = new FieldAccessor<ConfigProviderType, Boolean>(ConfigProviderType.class, "persistent");
-    private final static FieldAccessor<ConfigProviderType, String> configProviderTypeClassLoaderName = new FieldAccessor<ConfigProviderType, String>(ConfigProviderType.class, "classLoaderName");
-    private final static StringMapAdapter stringMapAdapterAdapter = new StringMapAdapter();
-    private final static KeyedObjectMapAdapter<ClientAuthConfigType> clientAuthConfigMapAdapter = new KeyedObjectMapAdapter<ClientAuthConfigType>(ClientAuthConfigType.class);
-    private final static KeyedObjectMapAdapter<ServerAuthConfigType> serverAuthConfigMapAdapter = new KeyedObjectMapAdapter<ServerAuthConfigType>(ServerAuthConfigType.class);
-
-    public ConfigProviderTypeJAXB() {
-        super(ConfigProviderType.class, null, new QName("http://geronimo.apache.org/xml/ns/geronimo-jaspi".intern(), "configProviderType".intern()), ClientAuthConfigTypeJAXB.class, ServerAuthConfigTypeJAXB.class);
-    }
-
-    public static ConfigProviderType readConfigProviderType(XoXMLStreamReader reader, RuntimeContext context)
-        throws Exception
-    {
-        return INSTANCE.read(reader, context);
-    }
-
-    public static void writeConfigProviderType(XoXMLStreamWriter writer, ConfigProviderType configProviderType, RuntimeContext context)
-        throws Exception
-    {
-        INSTANCE.write(writer, configProviderType, context);
-    }
-
-    public final ConfigProviderType read(XoXMLStreamReader reader, RuntimeContext context)
-        throws Exception
-    {
-
-        // Check for xsi:nil
-        if (reader.isXsiNil()) {
-            return null;
-        }
-
-        if (context == null) {
-            context = new RuntimeContext();
-        }
-
-        ConfigProviderType configProviderType = new ConfigProviderType();
-        context.beforeUnmarshal(configProviderType, lifecycleCallback);
-
-        List<ClientAuthConfigType> clientAuthConfigRaw = new ArrayList<ClientAuthConfigType>();
-        List<ServerAuthConfigType> serverAuthConfigRaw = new ArrayList<ServerAuthConfigType>();
-
-        // Check xsi:type
-        QName xsiType = reader.getXsiType();
-        if (xsiType!= null) {
-            if (("configProviderType"!= xsiType.getLocalPart())||("http://geronimo.apache.org/xml/ns/geronimo-jaspi"!= xsiType.getNamespaceURI())) {
-                return context.unexpectedXsiType(reader, ConfigProviderType.class);
-            }
-        }
-
-        // Read attributes
-        for (Attribute attribute: reader.getAttributes()) {
-            if (XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI!= attribute.getNamespace()) {
-                context.unexpectedAttribute(attribute);
-            }
-        }
-
-        // Read elements
-        for (XoXMLStreamReader elementReader: reader.getChildElements()) {
-            if (("messageLayer" == elementReader.getLocalName())&&("http://geronimo.apache.org/xml/ns/geronimo-jaspi" == elementReader.getNamespaceURI())) {
-                // ELEMENT: messageLayer
-                String messageLayer = elementReader.getElementAsString();
-                configProviderTypeMessageLayer.setObject(reader, context, configProviderType, messageLayer);
-            } else if (("appContext" == elementReader.getLocalName())&&("http://geronimo.apache.org/xml/ns/geronimo-jaspi" == elementReader.getNamespaceURI())) {
-                // ELEMENT: appContext
-                String appContext = elementReader.getElementAsString();
-                configProviderTypeAppContext.setObject(reader, context, configProviderType, appContext);
-            } else if (("description" == elementReader.getLocalName())&&("http://geronimo.apache.org/xml/ns/geronimo-jaspi" == elementReader.getNamespaceURI())) {
-                // ELEMENT: description
-                String description = elementReader.getElementAsString();
-                configProviderTypeDescription.setObject(reader, context, configProviderType, description);
-            } else if (("className" == elementReader.getLocalName())&&("http://geronimo.apache.org/xml/ns/geronimo-jaspi" == elementReader.getNamespaceURI())) {
-                // ELEMENT: className
-                String className = elementReader.getElementAsString();
-                configProviderTypeClassName.setObject(reader, context, configProviderType, className);
-            } else if (("properties" == elementReader.getLocalName())&&("http://geronimo.apache.org/xml/ns/geronimo-jaspi" == elementReader.getNamespaceURI())) {
-                // ELEMENT: properties
-                String propertiesRaw = elementReader.getElementAsString();
-
-                Map properties;
-                try {
-                    properties = stringMapAdapterAdapter.unmarshal(propertiesRaw);
-                } catch (Exception e) {
-                    context.xmlAdapterError(elementReader, StringMapAdapter.class, Map.class, Map.class, e);
-                    continue;
-                }
-
-                configProviderTypeProperties.setObject(reader, context, configProviderType, properties);
-            } else if (("clientAuthConfig" == elementReader.getLocalName())&&("http://geronimo.apache.org/xml/ns/geronimo-jaspi" == elementReader.getNamespaceURI())) {
-                // ELEMENT: clientAuthConfig
-                ClientAuthConfigType clientAuthConfigItem = readClientAuthConfigType(elementReader, context);
-                clientAuthConfigRaw.add(clientAuthConfigItem);
-            } else if (("serverAuthConfig" == elementReader.getLocalName())&&("http://geronimo.apache.org/xml/ns/geronimo-jaspi" == elementReader.getNamespaceURI())) {
-                // ELEMENT: serverAuthConfig
-                ServerAuthConfigType serverAuthConfigItem = readServerAuthConfigType(elementReader, context);
-                serverAuthConfigRaw.add(serverAuthConfigItem);
-            } else if (("persistent" == elementReader.getLocalName())&&("http://geronimo.apache.org/xml/ns/geronimo-jaspi" == elementReader.getNamespaceURI())) {
-                // ELEMENT: persistent
-                Boolean persistent = ("1".equals(elementReader.getElementAsString())||"true".equals(elementReader.getElementAsString()));
-                configProviderTypePersistent.setObject(reader, context, configProviderType, persistent);
-            } else if (("classLoaderName" == elementReader.getLocalName())&&("http://geronimo.apache.org/xml/ns/geronimo-jaspi" == elementReader.getNamespaceURI())) {
-                // ELEMENT: classLoaderName
-                String classLoaderName = elementReader.getElementAsString();
-                configProviderTypeClassLoaderName.setObject(reader, context, configProviderType, classLoaderName);
-            } else {
-                context.unexpectedElement(elementReader, new QName("http://geronimo.apache.org/xml/ns/geronimo-jaspi", "messageLayer"), new QName("http://geronimo.apache.org/xml/ns/geronimo-jaspi", "appContext"), new QName("http://geronimo.apache.org/xml/ns/geronimo-jaspi", "description"), new QName("http://geronimo.apache.org/xml/ns/geronimo-jaspi", "className"), new QName("http://geronimo.apache.org/xml/ns/geronimo-jaspi", "properties"), new QName("http://geronimo.apache.org/xml/ns/geronimo-jaspi", "clientAuthConfig"), new QName("http://geronimo.apache.org/xml/ns/geronimo-jaspi", "serverAuthConfig"), new QName("http://geronimo.apache.org/xml/ns/geronimo-jaspi", "persistent"), new QName("http://geronimo.apache.org/xml/ns/geronimo-jaspi", "classLoaderName"));
-            }
-        }
-        if (clientAuthConfigRaw!= null) {
-            Map<String, ClientAuthConfigType> clientAuthConfig = clientAuthConfigMapAdapter.unmarshal(clientAuthConfigRaw.toArray(new ClientAuthConfigType[clientAuthConfigRaw.size()]));
-            configProviderTypeClientAuthConfig.setObject(reader, context, configProviderType, clientAuthConfig);
-        }
-        if (serverAuthConfigRaw!= null) {
-            Map<String, ServerAuthConfigType> serverAuthConfig = serverAuthConfigMapAdapter.unmarshal(serverAuthConfigRaw.toArray(new ServerAuthConfigType[serverAuthConfigRaw.size()]));
-            configProviderTypeServerAuthConfig.setObject(reader, context, configProviderType, serverAuthConfig);
-        }
-
-        context.afterUnmarshal(configProviderType, lifecycleCallback);
-
-        return configProviderType;
-    }
-
-    public final void write(XoXMLStreamWriter writer, ConfigProviderType configProviderType, RuntimeContext context)
-        throws Exception
-    {
-        if (configProviderType == null) {
-            writer.writeXsiNil();
-            return ;
-        }
-
-        if (context == null) {
-            context = new RuntimeContext();
-        }
-
-        String prefix = writer.getUniquePrefix("http://geronimo.apache.org/xml/ns/geronimo-jaspi");
-        if (ConfigProviderType.class!= configProviderType.getClass()) {
-            context.unexpectedSubclass(writer, configProviderType, ConfigProviderType.class);
-            return ;
-        }
-
-        context.beforeMarshal(configProviderType, lifecycleCallback);
-
-
-        // ELEMENT: messageLayer
-        String messageLayer = configProviderTypeMessageLayer.getObject(configProviderType, context, configProviderType);
-        if (messageLayer!= null) {
-            writer.writeStartElement(prefix, "messageLayer", "http://geronimo.apache.org/xml/ns/geronimo-jaspi");
-            writer.writeCharacters(messageLayer);
-            writer.writeEndElement();
-        }
-
-        // ELEMENT: appContext
-        String appContext = configProviderTypeAppContext.getObject(configProviderType, context, configProviderType);
-        if (appContext!= null) {
-            writer.writeStartElement(prefix, "appContext", "http://geronimo.apache.org/xml/ns/geronimo-jaspi");
-            writer.writeCharacters(appContext);
-            writer.writeEndElement();
-        }
-
-        // ELEMENT: description
-        String description = configProviderTypeDescription.getObject(configProviderType, context, configProviderType);
-        if (description!= null) {
-            writer.writeStartElement(prefix, "description", "http://geronimo.apache.org/xml/ns/geronimo-jaspi");
-            writer.writeCharacters(description);
-            writer.writeEndElement();
-        }
-
-        // ELEMENT: className
-        String className = configProviderTypeClassName.getObject(configProviderType, context, configProviderType);
-        if (className!= null) {
-            writer.writeStartElement(prefix, "className", "http://geronimo.apache.org/xml/ns/geronimo-jaspi");
-            writer.writeCharacters(className);
-            writer.writeEndElement();
-        }
-
-        // ELEMENT: properties
-        Map<String, String> propertiesRaw = configProviderTypeProperties.getObject(configProviderType, context, configProviderType);
-        String properties = null;
-        try {
-            properties = stringMapAdapterAdapter.marshal(propertiesRaw);
-        } catch (Exception e) {
-            context.xmlAdapterError(configProviderType, "properties", StringMapAdapter.class, Map.class, Map.class, e);
-        }
-        if (properties!= null) {
-            writer.writeStartElement(prefix, "properties", "http://geronimo.apache.org/xml/ns/geronimo-jaspi");
-            writer.writeCharacters(properties);
-            writer.writeEndElement();
-        } else {
-            context.unexpectedNullValue(configProviderType, "properties");
-        }
-
-        // ELEMENT: clientAuthConfig
-        Map<String, ClientAuthConfigType> clientAuthConfigMap = configProviderTypeClientAuthConfig.getObject(configProviderType, context, configProviderType);
-        ClientAuthConfigType[] clientAuthConfig = clientAuthConfigMapAdapter.marshal(clientAuthConfigMap);
-        if (clientAuthConfig!= null) {
-            for (ClientAuthConfigType clientAuthConfigItem: clientAuthConfig) {
-                writer.writeStartElement(prefix, "clientAuthConfig", "http://geronimo.apache.org/xml/ns/geronimo-jaspi");
-                if (clientAuthConfigItem!= null) {
-                    writeClientAuthConfigType(writer, clientAuthConfigItem, context);
-                } else {
-                    writer.writeXsiNil();
-                }
-                writer.writeEndElement();
-            }
-        }
-
-        // ELEMENT: serverAuthConfig
-        Map<String,ServerAuthConfigType> serverAuthConfigMap = configProviderTypeServerAuthConfig.getObject(configProviderType, context, configProviderType);
-        ServerAuthConfigType[] serverAuthConfig = serverAuthConfigMapAdapter.marshal(serverAuthConfigMap);
-        if (serverAuthConfig!= null) {
-            for (ServerAuthConfigType serverAuthConfigItem: serverAuthConfig) {
-                writer.writeStartElement(prefix, "serverAuthConfig", "http://geronimo.apache.org/xml/ns/geronimo-jaspi");
-                if (serverAuthConfigItem!= null) {
-                    writeServerAuthConfigType(writer, serverAuthConfigItem, context);
-                } else {
-                    writer.writeXsiNil();
-                }
-                writer.writeEndElement();
-            }
-        }
-
-        // ELEMENT: persistent
-        Boolean persistent = configProviderTypePersistent.getObject(configProviderType, context, configProviderType);
-        if (persistent!= null) {
-            writer.writeStartElement(prefix, "persistent", "http://geronimo.apache.org/xml/ns/geronimo-jaspi");
-            writer.writeCharacters(Boolean.toString(persistent));
-            writer.writeEndElement();
-        }
-
-        // ELEMENT: classLoaderName
-        String classLoaderName = configProviderTypeClassLoaderName.getObject(configProviderType, context, configProviderType);
-        if (classLoaderName!= null) {
-            writer.writeStartElement(prefix, "classLoaderName", "http://geronimo.apache.org/xml/ns/geronimo-jaspi");
-            writer.writeCharacters(classLoaderName);
-            writer.writeEndElement();
-        }
-
-        context.afterMarshal(configProviderType, lifecycleCallback);
-    }
-
-}
diff --git a/geronimo-jaspi/src/main/java/sxc/org/apache/geronimo/components/jaspi/model/JaspiTypeJAXB.java b/geronimo-jaspi/src/main/java/sxc/org/apache/geronimo/components/jaspi/model/JaspiTypeJAXB.java
deleted file mode 100644
index 0f0c630..0000000
--- a/geronimo-jaspi/src/main/java/sxc/org/apache/geronimo/components/jaspi/model/JaspiTypeJAXB.java
+++ /dev/null
@@ -1,178 +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 sxc.org.apache.geronimo.components.jaspi.model;
-
-import java.util.Map;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.xml.XMLConstants;
-import javax.xml.namespace.QName;
-import com.envoisolutions.sxc.jaxb.FieldAccessor;
-import com.envoisolutions.sxc.jaxb.JAXBObject;
-import com.envoisolutions.sxc.jaxb.LifecycleCallback;
-import com.envoisolutions.sxc.jaxb.RuntimeContext;
-import com.envoisolutions.sxc.util.Attribute;
-import com.envoisolutions.sxc.util.XoXMLStreamReader;
-import com.envoisolutions.sxc.util.XoXMLStreamWriter;
-import org.apache.geronimo.components.jaspi.model.KeyedObjectMapAdapter;
-import org.apache.geronimo.components.jaspi.model.ConfigProviderType;
-import org.apache.geronimo.components.jaspi.model.JaspiType;
-import static sxc.org.apache.geronimo.components.jaspi.model.ConfigProviderTypeJAXB.readConfigProviderType;
-import static sxc.org.apache.geronimo.components.jaspi.model.ConfigProviderTypeJAXB.writeConfigProviderType;
-
-/**
- * @version $Rev$ $Date$
- */
-
-@SuppressWarnings({
-    "StringEquality"
-})
-public class JaspiTypeJAXB
-    extends JAXBObject<JaspiType>
-{
-
-    public final static JaspiTypeJAXB INSTANCE = new JaspiTypeJAXB();
-    private final static LifecycleCallback lifecycleCallback = new LifecycleCallback(JaspiType.class);
-    private final static FieldAccessor<JaspiType, Map<String, ConfigProviderType>> jaspiTypeConfigProvider = new FieldAccessor<JaspiType, Map<String, ConfigProviderType>>(JaspiType.class, "configProvider");
-    private final static KeyedObjectMapAdapter<ConfigProviderType> configProviderMapAdapterAdapter = new KeyedObjectMapAdapter<ConfigProviderType>(ConfigProviderType.class);
-
-    public JaspiTypeJAXB() {
-        super(JaspiType.class, null, new QName("http://geronimo.apache.org/xml/ns/geronimo-jaspi".intern(), "jaspiType".intern()));
-    }
-
-    public static JaspiType readJaspiType(XoXMLStreamReader reader, RuntimeContext context)
-        throws Exception
-    {
-        return INSTANCE.read(reader, context);
-    }
-
-    public static void writeJaspiType(XoXMLStreamWriter writer, JaspiType jaspiType, RuntimeContext context)
-        throws Exception
-    {
-        INSTANCE.write(writer, jaspiType, context);
-    }
-
-    public final JaspiType read(XoXMLStreamReader reader, RuntimeContext context)
-        throws Exception
-    {
-
-        // Check for xsi:nil
-        if (reader.isXsiNil()) {
-            return null;
-        }
-
-        if (context == null) {
-            context = new RuntimeContext();
-        }
-
-        JaspiType jaspiType = new JaspiType();
-        context.beforeUnmarshal(jaspiType, lifecycleCallback);
-
-        List<ConfigProviderType> configProviderRaw = null;
-
-        // Check xsi:type
-        QName xsiType = reader.getXsiType();
-        if (xsiType!= null) {
-            if (("jaspiType"!= xsiType.getLocalPart())||("http://geronimo.apache.org/xml/ns/geronimo-jaspi"!= xsiType.getNamespaceURI())) {
-                return context.unexpectedXsiType(reader, JaspiType.class);
-            }
-        }
-
-        // Read attributes
-        for (Attribute attribute: reader.getAttributes()) {
-            if (XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI!= attribute.getNamespace()) {
-                context.unexpectedAttribute(attribute);
-            }
-        }
-
-        // Read elements
-        for (XoXMLStreamReader elementReader: reader.getChildElements()) {
-            if (("configProvider" == elementReader.getLocalName())&&("http://geronimo.apache.org/xml/ns/geronimo-jaspi" == elementReader.getNamespaceURI())) {
-                // ELEMENT: configProvider
-                ConfigProviderType configProviderItem = readConfigProviderType(elementReader, context);
-                if (configProviderRaw == null) {
-                    configProviderRaw = new ArrayList<ConfigProviderType>();
-                }
-                configProviderRaw.add(configProviderItem);
-
-            } else {
-                context.unexpectedElement(elementReader, new QName("http://geronimo.apache.org/xml/ns/geronimo-jaspi", "configProvider"));
-            }
-        }
-
-        Map<String, ConfigProviderType> configProvider;
-        try {
-            ConfigProviderType[] configProviderArray = configProviderRaw == null? null: configProviderRaw.toArray(new ConfigProviderType[configProviderRaw.size()]);
-            configProvider = configProviderMapAdapterAdapter.unmarshal(configProviderArray);
-            jaspiTypeConfigProvider.setObject(reader, context, jaspiType, configProvider);
-        } catch (Exception e) {
-//            context.xmlAdapterError(null, KeyedObjectMapAdapter.class, Map.class, Map.class, e);
-            throw e;
-        }
-
-
-        context.afterUnmarshal(jaspiType, lifecycleCallback);
-
-        return jaspiType;
-    }
-
-    public final void write(XoXMLStreamWriter writer, JaspiType jaspiType, RuntimeContext context)
-        throws Exception
-    {
-        if (jaspiType == null) {
-            writer.writeXsiNil();
-            return ;
-        }
-
-        if (context == null) {
-            context = new RuntimeContext();
-        }
-
-        if (JaspiType.class!= jaspiType.getClass()) {
-            context.unexpectedSubclass(writer, jaspiType, JaspiType.class);
-            return ;
-        }
-
-        context.beforeMarshal(jaspiType, lifecycleCallback);
-
-
-        // ELEMENT: configProvider
-        Map<String, ConfigProviderType> configProviderRaw = jaspiTypeConfigProvider.getObject(jaspiType, context, jaspiType);
-        ConfigProviderType[] configProvider = null;
-        try {
-            configProvider = configProviderMapAdapterAdapter.marshal(configProviderRaw);
-        } catch (Exception e) {
-            context.xmlAdapterError(jaspiType, "configProvider", KeyedObjectMapAdapter.class, Map.class, Map.class, e);
-        }
-        if (configProvider!= null) {
-            for (ConfigProviderType configProviderItem: configProvider) {
-                writer.writeStartElementWithAutoPrefix("http://geronimo.apache.org/xml/ns/geronimo-jaspi", "configProvider");
-                if (configProviderItem!= null) {
-                    writeConfigProviderType(writer, configProviderItem, context);
-                } else {
-                    writer.writeXsiNil();
-                }
-                writer.writeEndElement();
-            }
-        }
-
-        context.afterMarshal(jaspiType, lifecycleCallback);
-    }
-
-}
diff --git a/geronimo-jaspi/src/main/java/sxc/org/apache/geronimo/components/jaspi/model/MessagePolicyTypeJAXB.java b/geronimo-jaspi/src/main/java/sxc/org/apache/geronimo/components/jaspi/model/MessagePolicyTypeJAXB.java
deleted file mode 100644
index 0a180bd..0000000
--- a/geronimo-jaspi/src/main/java/sxc/org/apache/geronimo/components/jaspi/model/MessagePolicyTypeJAXB.java
+++ /dev/null
@@ -1,177 +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 sxc.org.apache.geronimo.components.jaspi.model;
-
-import java.util.ArrayList;
-import java.util.List;
-import javax.xml.XMLConstants;
-import javax.xml.namespace.QName;
-import com.envoisolutions.sxc.jaxb.FieldAccessor;
-import com.envoisolutions.sxc.jaxb.JAXBObject;
-import com.envoisolutions.sxc.jaxb.LifecycleCallback;
-import com.envoisolutions.sxc.jaxb.RuntimeContext;
-import com.envoisolutions.sxc.util.Attribute;
-import com.envoisolutions.sxc.util.XoXMLStreamReader;
-import com.envoisolutions.sxc.util.XoXMLStreamWriter;
-import org.apache.geronimo.components.jaspi.model.MessagePolicyType;
-import org.apache.geronimo.components.jaspi.model.TargetPolicyType;
-
-
-import static sxc.org.apache.geronimo.components.jaspi.model.TargetPolicyTypeJAXB.readTargetPolicyType;
-import static sxc.org.apache.geronimo.components.jaspi.model.TargetPolicyTypeJAXB.writeTargetPolicyType;
-
-/**
- * @version $Rev$ $Date$
- */
-
-@SuppressWarnings({
-    "StringEquality"
-})
-public class MessagePolicyTypeJAXB
-    extends JAXBObject<MessagePolicyType>
-{
-
-    public final static MessagePolicyTypeJAXB INSTANCE = new MessagePolicyTypeJAXB();
-    private final static LifecycleCallback lifecycleCallback = new LifecycleCallback(MessagePolicyType.class);
-    private final static FieldAccessor<MessagePolicyType, List<TargetPolicyType>> messagePolicyTypeTargetPolicy = new FieldAccessor<MessagePolicyType, List<TargetPolicyType>>(MessagePolicyType.class, "targetPolicy");
-    private final static FieldAccessor<MessagePolicyType, Boolean> messagePolicyTypeMandatory = new FieldAccessor<MessagePolicyType, Boolean>(MessagePolicyType.class, "mandatory");
-
-    public MessagePolicyTypeJAXB() {
-        super(MessagePolicyType.class, null, new QName("http://geronimo.apache.org/xml/ns/geronimo-jaspi".intern(), "messagePolicyType".intern()), TargetPolicyTypeJAXB.class);
-    }
-
-    public static MessagePolicyType readMessagePolicyType(XoXMLStreamReader reader, RuntimeContext context)
-        throws Exception
-    {
-        return INSTANCE.read(reader, context);
-    }
-
-    public static void writeMessagePolicyType(XoXMLStreamWriter writer, MessagePolicyType messagePolicyType, RuntimeContext context)
-        throws Exception
-    {
-        INSTANCE.write(writer, messagePolicyType, context);
-    }
-
-    public final MessagePolicyType read(XoXMLStreamReader reader, RuntimeContext context)
-        throws Exception
-    {
-
-        // Check for xsi:nil
-        if (reader.isXsiNil()) {
-            return null;
-        }
-
-        if (context == null) {
-            context = new RuntimeContext();
-        }
-
-        MessagePolicyType messagePolicyType = new MessagePolicyType();
-        context.beforeUnmarshal(messagePolicyType, lifecycleCallback);
-
-        List<TargetPolicyType> targetPolicy = null;
-
-        // Check xsi:type
-        QName xsiType = reader.getXsiType();
-        if (xsiType!= null) {
-            if (("messagePolicyType"!= xsiType.getLocalPart())||("http://geronimo.apache.org/xml/ns/geronimo-jaspi"!= xsiType.getNamespaceURI())) {
-                return context.unexpectedXsiType(reader, MessagePolicyType.class);
-            }
-        }
-
-        // Read attributes
-        for (Attribute attribute: reader.getAttributes()) {
-            if (("mandatory" == attribute.getLocalName())&&(("" == attribute.getNamespace())||(attribute.getNamespace() == null))) {
-                // ATTRIBUTE: mandatory
-                Boolean mandatory = ("1".equals(attribute.getValue())||"true".equals(attribute.getValue()));
-                messagePolicyTypeMandatory.setObject(reader, context, messagePolicyType, mandatory);
-            } else if (XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI!= attribute.getNamespace()) {
-                context.unexpectedAttribute(attribute, new QName("", "mandatory"));
-            }
-        }
-
-        // Read elements
-        for (XoXMLStreamReader elementReader: reader.getChildElements()) {
-            if (("targetPolicy" == elementReader.getLocalName())&&("http://geronimo.apache.org/xml/ns/geronimo-jaspi" == elementReader.getNamespaceURI())) {
-                // ELEMENT: targetPolicy
-                TargetPolicyType targetPolicyItem = readTargetPolicyType(elementReader, context);
-                if (targetPolicy == null) {
-                    targetPolicy = messagePolicyTypeTargetPolicy.getObject(reader, context, messagePolicyType);
-                    if (targetPolicy!= null) {
-                        targetPolicy.clear();
-                    } else {
-                        targetPolicy = new ArrayList<TargetPolicyType>();
-                    }
-                }
-                targetPolicy.add(targetPolicyItem);
-            } else {
-                context.unexpectedElement(elementReader, new QName("http://geronimo.apache.org/xml/ns/geronimo-jaspi", "targetPolicy"));
-            }
-        }
-        if (targetPolicy!= null) {
-            messagePolicyTypeTargetPolicy.setObject(reader, context, messagePolicyType, targetPolicy);
-        }
-
-        context.afterUnmarshal(messagePolicyType, lifecycleCallback);
-
-        return messagePolicyType;
-    }
-
-    public final void write(XoXMLStreamWriter writer, MessagePolicyType messagePolicyType, RuntimeContext context)
-        throws Exception
-    {
-        if (messagePolicyType == null) {
-            writer.writeXsiNil();
-            return ;
-        }
-
-        if (context == null) {
-            context = new RuntimeContext();
-        }
-
-        if (MessagePolicyType.class!= messagePolicyType.getClass()) {
-            context.unexpectedSubclass(writer, messagePolicyType, MessagePolicyType.class);
-            return ;
-        }
-
-        context.beforeMarshal(messagePolicyType, lifecycleCallback);
-
-
-        // ATTRIBUTE: mandatory
-        Boolean mandatory = messagePolicyTypeMandatory.getObject(messagePolicyType, context, messagePolicyType);
-        if (mandatory!= null) {
-            writer.writeAttribute("", "", "mandatory", Boolean.toString(mandatory));
-        }
-
-        // ELEMENT: targetPolicy
-        List<TargetPolicyType> targetPolicy = messagePolicyTypeTargetPolicy.getObject(messagePolicyType, context, messagePolicyType);
-        if (targetPolicy!= null) {
-            for (TargetPolicyType targetPolicyItem: targetPolicy) {
-                writer.writeStartElementWithAutoPrefix("http://geronimo.apache.org/xml/ns/geronimo-jaspi", "targetPolicy");
-                if (targetPolicyItem!= null) {
-                    writeTargetPolicyType(writer, targetPolicyItem, context);
-                } else {
-                    writer.writeXsiNil();
-                }
-                writer.writeEndElement();
-            }
-        }
-
-        context.afterMarshal(messagePolicyType, lifecycleCallback);
-    }
-
-}
diff --git a/geronimo-jaspi/src/main/java/sxc/org/apache/geronimo/components/jaspi/model/ObjectFactoryJAXB.java b/geronimo-jaspi/src/main/java/sxc/org/apache/geronimo/components/jaspi/model/ObjectFactoryJAXB.java
deleted file mode 100644
index cb5d68f..0000000
--- a/geronimo-jaspi/src/main/java/sxc/org/apache/geronimo/components/jaspi/model/ObjectFactoryJAXB.java
+++ /dev/null
@@ -1,47 +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 sxc.org.apache.geronimo.components.jaspi.model;
-
-import java.util.HashMap;
-import java.util.Map;
-import javax.xml.namespace.QName;
-import com.envoisolutions.sxc.jaxb.JAXBObject;
-import com.envoisolutions.sxc.jaxb.JAXBObjectFactory;
-import org.apache.geronimo.components.jaspi.model.ObjectFactory;
-
-/**
- * @version $Rev$ $Date$
- */
-
-public class ObjectFactoryJAXB
-    extends JAXBObjectFactory<ObjectFactory>
-{
-
-    public final static ObjectFactoryJAXB INSTANCE = new ObjectFactoryJAXB();
-    private final Map<QName, Class<? extends JAXBObject>> rootElements = new HashMap<QName, Class<? extends JAXBObject>>();
-
-    public ObjectFactoryJAXB() {
-        super(ObjectFactory.class, JaspiTypeJAXB.class, ServerAuthContextTypeJAXB.class, AuthModuleTypeJAXB.class, ServerAuthConfigTypeJAXB.class, TargetTypeJAXB.class, MessagePolicyTypeJAXB.class, ClientAuthContextTypeJAXB.class, ConfigProviderTypeJAXB.class, TargetPolicyTypeJAXB.class, ClientAuthConfigTypeJAXB.class, ProtectionPolicyTypeJAXB.class);
-        rootElements.put(new QName("http://geronimo.apache.org/xml/ns/geronimo-jaspi".intern(), "jaspi".intern()), JaspiTypeJAXB.class);
-    }
-
-    public Map<QName, Class<? extends JAXBObject>> getRootElements() {
-        return rootElements;
-    }
-
-}
diff --git a/geronimo-jaspi/src/main/java/sxc/org/apache/geronimo/components/jaspi/model/ProtectionPolicyTypeJAXB.java b/geronimo-jaspi/src/main/java/sxc/org/apache/geronimo/components/jaspi/model/ProtectionPolicyTypeJAXB.java
deleted file mode 100644
index 1a1ae3d..0000000
--- a/geronimo-jaspi/src/main/java/sxc/org/apache/geronimo/components/jaspi/model/ProtectionPolicyTypeJAXB.java
+++ /dev/null
@@ -1,143 +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 sxc.org.apache.geronimo.components.jaspi.model;
-
-import javax.xml.XMLConstants;
-import javax.xml.namespace.QName;
-import com.envoisolutions.sxc.jaxb.FieldAccessor;
-import com.envoisolutions.sxc.jaxb.JAXBObject;
-import com.envoisolutions.sxc.jaxb.LifecycleCallback;
-import com.envoisolutions.sxc.jaxb.RuntimeContext;
-import com.envoisolutions.sxc.util.Attribute;
-import com.envoisolutions.sxc.util.XoXMLStreamReader;
-import com.envoisolutions.sxc.util.XoXMLStreamWriter;
-import org.apache.geronimo.components.jaspi.model.ProtectionPolicyType;
-
-/**
- * @version $Rev$ $Date$
- */
-
-@SuppressWarnings({
-    "StringEquality"
-})
-public class ProtectionPolicyTypeJAXB
-    extends JAXBObject<ProtectionPolicyType>
-{
-
-    public final static ProtectionPolicyTypeJAXB INSTANCE = new ProtectionPolicyTypeJAXB();
-    private final static LifecycleCallback lifecycleCallback = new LifecycleCallback(ProtectionPolicyType.class);
-    private final static FieldAccessor<ProtectionPolicyType, String> protectionPolicyTypeClassName = new FieldAccessor<ProtectionPolicyType, String>(ProtectionPolicyType.class, "className");
-
-    public ProtectionPolicyTypeJAXB() {
-        super(ProtectionPolicyType.class, null, new QName("http://geronimo.apache.org/xml/ns/geronimo-jaspi".intern(), "protectionPolicyType".intern()));
-    }
-
-    public static ProtectionPolicyType readProtectionPolicyType(XoXMLStreamReader reader, RuntimeContext context)
-        throws Exception
-    {
-        return INSTANCE.read(reader, context);
-    }
-
-    public static void writeProtectionPolicyType(XoXMLStreamWriter writer, ProtectionPolicyType protectionPolicyType, RuntimeContext context)
-        throws Exception
-    {
-        INSTANCE.write(writer, protectionPolicyType, context);
-    }
-
-    public final ProtectionPolicyType read(XoXMLStreamReader reader, RuntimeContext context)
-        throws Exception
-    {
-
-        // Check for xsi:nil
-        if (reader.isXsiNil()) {
-            return null;
-        }
-
-        if (context == null) {
-            context = new RuntimeContext();
-        }
-
-        ProtectionPolicyType protectionPolicyType = new ProtectionPolicyType();
-        context.beforeUnmarshal(protectionPolicyType, lifecycleCallback);
-
-
-        // Check xsi:type
-        QName xsiType = reader.getXsiType();
-        if (xsiType!= null) {
-            if (("protectionPolicyType"!= xsiType.getLocalPart())||("http://geronimo.apache.org/xml/ns/geronimo-jaspi"!= xsiType.getNamespaceURI())) {
-                return context.unexpectedXsiType(reader, ProtectionPolicyType.class);
-            }
-        }
-
-        // Read attributes
-        for (Attribute attribute: reader.getAttributes()) {
-            if (XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI!= attribute.getNamespace()) {
-                context.unexpectedAttribute(attribute);
-            }
-        }
-
-        // Read elements
-        for (XoXMLStreamReader elementReader: reader.getChildElements()) {
-            if (("className" == elementReader.getLocalName())&&("http://geronimo.apache.org/xml/ns/geronimo-jaspi" == elementReader.getNamespaceURI())) {
-                // ELEMENT: className
-                String className = elementReader.getElementAsString();
-                protectionPolicyTypeClassName.setObject(reader, context, protectionPolicyType, className);
-            } else {
-                context.unexpectedElement(elementReader, new QName("http://geronimo.apache.org/xml/ns/geronimo-jaspi", "className"));
-            }
-        }
-
-        context.afterUnmarshal(protectionPolicyType, lifecycleCallback);
-
-        return protectionPolicyType;
-    }
-
-    public final void write(XoXMLStreamWriter writer, ProtectionPolicyType protectionPolicyType, RuntimeContext context)
-        throws Exception
-    {
-        if (protectionPolicyType == null) {
-            writer.writeXsiNil();
-            return ;
-        }
-
-        if (context == null) {
-            context = new RuntimeContext();
-        }
-
-        if (ProtectionPolicyType.class!= protectionPolicyType.getClass()) {
-            context.unexpectedSubclass(writer, protectionPolicyType, ProtectionPolicyType.class);
-            return ;
-        }
-
-        context.beforeMarshal(protectionPolicyType, lifecycleCallback);
-
-
-        // ELEMENT: className
-        String className = protectionPolicyTypeClassName.getObject(protectionPolicyType, context, protectionPolicyType);
-        if (className!= null) {
-            writer.writeStartElementWithAutoPrefix("http://geronimo.apache.org/xml/ns/geronimo-jaspi", "className");
-            writer.writeCharacters(className);
-            writer.writeEndElement();
-        } else {
-            context.unexpectedNullValue(protectionPolicyType, "className");
-        }
-
-        context.afterMarshal(protectionPolicyType, lifecycleCallback);
-    }
-
-}
diff --git a/geronimo-jaspi/src/main/java/sxc/org/apache/geronimo/components/jaspi/model/ServerAuthConfigTypeJAXB.java b/geronimo-jaspi/src/main/java/sxc/org/apache/geronimo/components/jaspi/model/ServerAuthConfigTypeJAXB.java
deleted file mode 100644
index ef5afd1..0000000
--- a/geronimo-jaspi/src/main/java/sxc/org/apache/geronimo/components/jaspi/model/ServerAuthConfigTypeJAXB.java
+++ /dev/null
@@ -1,225 +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 sxc.org.apache.geronimo.components.jaspi.model;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-import javax.xml.XMLConstants;
-import javax.xml.namespace.QName;
-import com.envoisolutions.sxc.jaxb.FieldAccessor;
-import com.envoisolutions.sxc.jaxb.JAXBObject;
-import com.envoisolutions.sxc.jaxb.LifecycleCallback;
-import com.envoisolutions.sxc.jaxb.RuntimeContext;
-import com.envoisolutions.sxc.util.Attribute;
-import com.envoisolutions.sxc.util.XoXMLStreamReader;
-import com.envoisolutions.sxc.util.XoXMLStreamWriter;
-import org.apache.geronimo.components.jaspi.model.ServerAuthConfigType;
-import org.apache.geronimo.components.jaspi.model.ServerAuthContextType;
-import org.apache.geronimo.components.jaspi.model.KeyedObjectMapAdapter;
-
-
-import static sxc.org.apache.geronimo.components.jaspi.model.ServerAuthContextTypeJAXB.readServerAuthContextType;
-import static sxc.org.apache.geronimo.components.jaspi.model.ServerAuthContextTypeJAXB.writeServerAuthContextType;
-
-/**
- * @version $Rev$ $Date$
- */
-
-@SuppressWarnings({
-    "StringEquality"
-})
-public class ServerAuthConfigTypeJAXB
-    extends JAXBObject<ServerAuthConfigType>
-{
-
-    public final static ServerAuthConfigTypeJAXB INSTANCE = new ServerAuthConfigTypeJAXB();
-    private final static LifecycleCallback lifecycleCallback = new LifecycleCallback(ServerAuthConfigType.class);
-    private final static FieldAccessor<ServerAuthConfigType, String> serverAuthConfigTypeMessageLayer = new FieldAccessor<ServerAuthConfigType, String>(ServerAuthConfigType.class, "messageLayer");
-    private final static FieldAccessor<ServerAuthConfigType, String> serverAuthConfigTypeAppContext = new FieldAccessor<ServerAuthConfigType, String>(ServerAuthConfigType.class, "appContext");
-    private final static FieldAccessor<ServerAuthConfigType, String> serverAuthConfigTypeAuthenticationContextID = new FieldAccessor<ServerAuthConfigType, String>(ServerAuthConfigType.class, "authenticationContextID");
-    private final static FieldAccessor<ServerAuthConfigType, Boolean> serverAuthConfigType_protected = new FieldAccessor<ServerAuthConfigType, Boolean>(ServerAuthConfigType.class, "_protected");
-    private final static FieldAccessor<ServerAuthConfigType, Map<String, ServerAuthContextType>> serverAuthConfigTypeServerAuthContext = new FieldAccessor<ServerAuthConfigType, Map<String, ServerAuthContextType>>(ServerAuthConfigType.class, "serverAuthContext");
-    private final static KeyedObjectMapAdapter<ServerAuthContextType> serverAuthContextMapAdapter = new KeyedObjectMapAdapter<ServerAuthContextType>(ServerAuthContextType.class);
-
-    public ServerAuthConfigTypeJAXB() {
-        super(ServerAuthConfigType.class, null, new QName("http://geronimo.apache.org/xml/ns/geronimo-jaspi".intern(), "serverAuthConfigType".intern()), ServerAuthContextTypeJAXB.class);
-    }
-
-    public static ServerAuthConfigType readServerAuthConfigType(XoXMLStreamReader reader, RuntimeContext context)
-        throws Exception
-    {
-        return INSTANCE.read(reader, context);
-    }
-
-    public static void writeServerAuthConfigType(XoXMLStreamWriter writer, ServerAuthConfigType serverAuthConfigType, RuntimeContext context)
-        throws Exception
-    {
-        INSTANCE.write(writer, serverAuthConfigType, context);
-    }
-
-    public final ServerAuthConfigType read(XoXMLStreamReader reader, RuntimeContext context)
-        throws Exception
-    {
-
-        // Check for xsi:nil
-        if (reader.isXsiNil()) {
-            return null;
-        }
-
-        if (context == null) {
-            context = new RuntimeContext();
-        }
-
-        ServerAuthConfigType serverAuthConfigType = new ServerAuthConfigType();
-        context.beforeUnmarshal(serverAuthConfigType, lifecycleCallback);
-
-        List<ServerAuthContextType> serverAuthContextRaw = new ArrayList<ServerAuthContextType>();
-
-        // Check xsi:type
-        QName xsiType = reader.getXsiType();
-        if (xsiType!= null) {
-            if (("serverAuthConfigType"!= xsiType.getLocalPart())||("http://geronimo.apache.org/xml/ns/geronimo-jaspi"!= xsiType.getNamespaceURI())) {
-                return context.unexpectedXsiType(reader, ServerAuthConfigType.class);
-            }
-        }
-
-        // Read attributes
-        for (Attribute attribute: reader.getAttributes()) {
-            if (XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI!= attribute.getNamespace()) {
-                context.unexpectedAttribute(attribute);
-            }
-        }
-
-        // Read elements
-        for (XoXMLStreamReader elementReader: reader.getChildElements()) {
-            if (("messageLayer" == elementReader.getLocalName())&&("http://geronimo.apache.org/xml/ns/geronimo-jaspi" == elementReader.getNamespaceURI())) {
-                // ELEMENT: messageLayer
-                String messageLayer = elementReader.getElementAsString();
-                serverAuthConfigTypeMessageLayer.setObject(reader, context, serverAuthConfigType, messageLayer);
-            } else if (("appContext" == elementReader.getLocalName())&&("http://geronimo.apache.org/xml/ns/geronimo-jaspi" == elementReader.getNamespaceURI())) {
-                // ELEMENT: appContext
-                String appContext = elementReader.getElementAsString();
-                serverAuthConfigTypeAppContext.setObject(reader, context, serverAuthConfigType, appContext);
-            } else if (("authenticationContextID" == elementReader.getLocalName())&&("http://geronimo.apache.org/xml/ns/geronimo-jaspi" == elementReader.getNamespaceURI())) {
-                // ELEMENT: authenticationContextID
-                String authenticationContextID = elementReader.getElementAsString();
-                serverAuthConfigTypeAuthenticationContextID.setObject(reader, context, serverAuthConfigType, authenticationContextID);
-            } else if (("protected" == elementReader.getLocalName())&&("http://geronimo.apache.org/xml/ns/geronimo-jaspi" == elementReader.getNamespaceURI())) {
-                // ELEMENT: _protected
-                Boolean _protected = ("1".equals(elementReader.getElementAsString())||"true".equals(elementReader.getElementAsString()));
-                serverAuthConfigType_protected.setBoolean(reader, context, serverAuthConfigType, _protected);
-            } else if (("serverAuthContext" == elementReader.getLocalName())&&("http://geronimo.apache.org/xml/ns/geronimo-jaspi" == elementReader.getNamespaceURI())) {
-                // ELEMENT: serverAuthContext
-                ServerAuthContextType serverAuthContextItem = readServerAuthContextType(elementReader, context);
-//                if (serverAuthContextRaw == null) {
-//                    serverAuthContextRaw = serverAuthConfigTypeServerAuthContext.getObject(reader, context, serverAuthConfigType);
-//                    if (serverAuthContextRaw != null) {
-//                        serverAuthContextRaw.clear();
-//                    } else {
-//                        serverAuthContextRaw = new ArrayList<ServerAuthContextType>();
-//                    }
-//                }
-                serverAuthContextRaw.add(serverAuthContextItem);
-            } else {
-                context.unexpectedElement(elementReader, new QName("http://geronimo.apache.org/xml/ns/geronimo-jaspi", "messageLayer"), new QName("http://geronimo.apache.org/xml/ns/geronimo-jaspi", "appContext"), new QName("http://geronimo.apache.org/xml/ns/geronimo-jaspi", "authenticationContextID"), new QName("http://geronimo.apache.org/xml/ns/geronimo-jaspi", "protected"), new QName("http://geronimo.apache.org/xml/ns/geronimo-jaspi", "serverAuthContext"));
-            }
-        }
-        if (serverAuthContextRaw != null) {
-            Map<String, ServerAuthContextType> serverAuthContext = serverAuthContextMapAdapter.unmarshal(serverAuthContextRaw.toArray(new ServerAuthContextType[serverAuthContextRaw.size()]));
-            serverAuthConfigTypeServerAuthContext.setObject(reader, context, serverAuthConfigType, serverAuthContext);
-        }
-
-        context.afterUnmarshal(serverAuthConfigType, lifecycleCallback);
-
-        return serverAuthConfigType;
-    }
-
-    public final void write(XoXMLStreamWriter writer, ServerAuthConfigType serverAuthConfigType, RuntimeContext context)
-        throws Exception
-    {
-        if (serverAuthConfigType == null) {
-            writer.writeXsiNil();
-            return ;
-        }
-
-        if (context == null) {
-            context = new RuntimeContext();
-        }
-
-        String prefix = writer.getUniquePrefix("http://geronimo.apache.org/xml/ns/geronimo-jaspi");
-        if (ServerAuthConfigType.class!= serverAuthConfigType.getClass()) {
-            context.unexpectedSubclass(writer, serverAuthConfigType, ServerAuthConfigType.class);
-            return ;
-        }
-
-        context.beforeMarshal(serverAuthConfigType, lifecycleCallback);
-
-
-        // ELEMENT: messageLayer
-        String messageLayer = serverAuthConfigTypeMessageLayer.getObject(serverAuthConfigType, context, serverAuthConfigType);
-        if (messageLayer!= null) {
-            writer.writeStartElement(prefix, "messageLayer", "http://geronimo.apache.org/xml/ns/geronimo-jaspi");
-            writer.writeCharacters(messageLayer);
-            writer.writeEndElement();
-        }
-
-        // ELEMENT: appContext
-        String appContext = serverAuthConfigTypeAppContext.getObject(serverAuthConfigType, context, serverAuthConfigType);
-        if (appContext!= null) {
-            writer.writeStartElement(prefix, "appContext", "http://geronimo.apache.org/xml/ns/geronimo-jaspi");
-            writer.writeCharacters(appContext);
-            writer.writeEndElement();
-        }
-
-        // ELEMENT: authenticationContextID
-        String authenticationContextID = serverAuthConfigTypeAuthenticationContextID.getObject(serverAuthConfigType, context, serverAuthConfigType);
-        if (authenticationContextID!= null) {
-            writer.writeStartElement(prefix, "authenticationContextID", "http://geronimo.apache.org/xml/ns/geronimo-jaspi");
-            writer.writeCharacters(authenticationContextID);
-            writer.writeEndElement();
-        } else {
-            context.unexpectedNullValue(serverAuthConfigType, "authenticationContextID");
-        }
-
-        // ELEMENT: _protected
-        Boolean _protected = serverAuthConfigType_protected.getBoolean(serverAuthConfigType, context, serverAuthConfigType);
-        writer.writeStartElement(prefix, "protected", "http://geronimo.apache.org/xml/ns/geronimo-jaspi");
-        writer.writeCharacters(Boolean.toString(_protected));
-        writer.writeEndElement();
-
-        // ELEMENT: serverAuthContext
-        Map<String, ServerAuthContextType> serverAuthContextMap = serverAuthConfigTypeServerAuthContext.getObject(serverAuthConfigType, context, serverAuthConfigType);
-        ServerAuthContextType[] serverAuthContext = serverAuthContextMapAdapter.marshal(serverAuthContextMap);
-        if (serverAuthContext!= null) {
-            for (ServerAuthContextType serverAuthContextItem: serverAuthContext) {
-                writer.writeStartElement(prefix, "serverAuthContext", "http://geronimo.apache.org/xml/ns/geronimo-jaspi");
-                if (serverAuthContextItem!= null) {
-                    writeServerAuthContextType(writer, serverAuthContextItem, context);
-                } else {
-                    writer.writeXsiNil();
-                }
-                writer.writeEndElement();
-            }
-        }
-
-        context.afterMarshal(serverAuthConfigType, lifecycleCallback);
-    }
-
-}
diff --git a/geronimo-jaspi/src/main/java/sxc/org/apache/geronimo/components/jaspi/model/ServerAuthContextTypeJAXB.java b/geronimo-jaspi/src/main/java/sxc/org/apache/geronimo/components/jaspi/model/ServerAuthContextTypeJAXB.java
deleted file mode 100644
index c81f73f..0000000
--- a/geronimo-jaspi/src/main/java/sxc/org/apache/geronimo/components/jaspi/model/ServerAuthContextTypeJAXB.java
+++ /dev/null
@@ -1,208 +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 sxc.org.apache.geronimo.components.jaspi.model;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.xml.XMLConstants;
-import javax.xml.namespace.QName;
-
-import com.envoisolutions.sxc.jaxb.FieldAccessor;
-import com.envoisolutions.sxc.jaxb.JAXBObject;
-import com.envoisolutions.sxc.jaxb.LifecycleCallback;
-import com.envoisolutions.sxc.jaxb.RuntimeContext;
-import com.envoisolutions.sxc.util.Attribute;
-import com.envoisolutions.sxc.util.XoXMLStreamReader;
-import com.envoisolutions.sxc.util.XoXMLStreamWriter;
-import org.apache.geronimo.components.jaspi.model.ServerAuthContextType;
-import org.apache.geronimo.components.jaspi.model.AuthModuleType;
-import static sxc.org.apache.geronimo.components.jaspi.model.AuthModuleTypeJAXB.readServerAuthModuleType;
-import static sxc.org.apache.geronimo.components.jaspi.model.AuthModuleTypeJAXB.writeServerAuthModuleType;
-
-/**
- * @version $Rev$ $Date$
- */
-
-@SuppressWarnings({
-    "StringEquality"
-})
-public class ServerAuthContextTypeJAXB
-    extends JAXBObject<ServerAuthContextType>
-{
-
-    public final static ServerAuthContextTypeJAXB INSTANCE = new ServerAuthContextTypeJAXB();
-    private final static LifecycleCallback lifecycleCallback = new LifecycleCallback(ServerAuthContextType.class);
-    private final static FieldAccessor<ServerAuthContextType, String> serverAuthContextTypeMessageLayer = new FieldAccessor<ServerAuthContextType, String>(ServerAuthContextType.class, "messageLayer");
-    private final static FieldAccessor<ServerAuthContextType, String> serverAuthContextTypeAppContext = new FieldAccessor<ServerAuthContextType, String>(ServerAuthContextType.class, "appContext");
-    private final static FieldAccessor<ServerAuthContextType, String> serverAuthContextTypeAuthenticationContextID = new FieldAccessor<ServerAuthContextType, String>(ServerAuthContextType.class, "authenticationContextID");
-    private final static FieldAccessor<ServerAuthContextType, List<AuthModuleType>> serverAuthContextTypeServerAuthModule = new FieldAccessor<ServerAuthContextType, List<AuthModuleType>>(ServerAuthContextType.class, "serverAuthModule");
-
-    public ServerAuthContextTypeJAXB() {
-        super(ServerAuthContextType.class, null, new QName("http://geronimo.apache.org/xml/ns/geronimo-jaspi".intern(), "serverAuthContextType".intern()), AuthModuleTypeJAXB.class);
-    }
-
-    public static ServerAuthContextType readServerAuthContextType(XoXMLStreamReader reader, RuntimeContext context)
-        throws Exception
-    {
-        return INSTANCE.read(reader, context);
-    }
-
-    public static void writeServerAuthContextType(XoXMLStreamWriter writer, ServerAuthContextType serverAuthContextType, RuntimeContext context)
-        throws Exception
-    {
-        INSTANCE.write(writer, serverAuthContextType, context);
-    }
-
-    public final ServerAuthContextType read(XoXMLStreamReader reader, RuntimeContext context)
-        throws Exception
-    {
-
-        // Check for xsi:nil
-        if (reader.isXsiNil()) {
-            return null;
-        }
-
-        if (context == null) {
-            context = new RuntimeContext();
-        }
-
-        ServerAuthContextType serverAuthContextType = new ServerAuthContextType();
-        context.beforeUnmarshal(serverAuthContextType, lifecycleCallback);
-
-        List<AuthModuleType> serverAuthModule = null;
-
-        // Check xsi:type
-        QName xsiType = reader.getXsiType();
-        if (xsiType!= null) {
-            if (("serverAuthContextType"!= xsiType.getLocalPart())||("http://geronimo.apache.org/xml/ns/geronimo-jaspi"!= xsiType.getNamespaceURI())) {
-                return context.unexpectedXsiType(reader, ServerAuthContextType.class);
-            }
-        }
-
-        // Read attributes
-        for (Attribute attribute: reader.getAttributes()) {
-            if (XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI!= attribute.getNamespace()) {
-                context.unexpectedAttribute(attribute);
-            }
-        }
-
-        // Read elements
-        for (XoXMLStreamReader elementReader: reader.getChildElements()) {
-            if (("messageLayer" == elementReader.getLocalName())&&("http://geronimo.apache.org/xml/ns/geronimo-jaspi" == elementReader.getNamespaceURI())) {
-                // ELEMENT: messageLayer
-                String messageLayer = elementReader.getElementAsString();
-                serverAuthContextTypeMessageLayer.setObject(reader, context, serverAuthContextType, messageLayer);
-            } else if (("appContext" == elementReader.getLocalName())&&("http://geronimo.apache.org/xml/ns/geronimo-jaspi" == elementReader.getNamespaceURI())) {
-                // ELEMENT: appContext
-                String appContext = elementReader.getElementAsString();
-                serverAuthContextTypeAppContext.setObject(reader, context, serverAuthContextType, appContext);
-            } else if (("authenticationContextID" == elementReader.getLocalName())&&("http://geronimo.apache.org/xml/ns/geronimo-jaspi" == elementReader.getNamespaceURI())) {
-                // ELEMENT: authenticationContextID
-                String authenticationContextID = elementReader.getElementAsString();
-                serverAuthContextTypeAuthenticationContextID.setObject(reader, context, serverAuthContextType, authenticationContextID);
-            } else if (("serverAuthModule" == elementReader.getLocalName())&&("http://geronimo.apache.org/xml/ns/geronimo-jaspi" == elementReader.getNamespaceURI())) {
-                // ELEMENT: serverAuthModule
-                AuthModuleType serverAuthModuleItem = readServerAuthModuleType(elementReader, context);
-                if (serverAuthModule == null) {
-                    serverAuthModule = serverAuthContextTypeServerAuthModule.getObject(reader, context, serverAuthContextType);
-                    if (serverAuthModule!= null) {
-                        serverAuthModule.clear();
-                    } else {
-                        serverAuthModule = new ArrayList<AuthModuleType>();
-                    }
-                }
-                serverAuthModule.add(serverAuthModuleItem);
-            } else {
-                context.unexpectedElement(elementReader, new QName("http://geronimo.apache.org/xml/ns/geronimo-jaspi", "messageLayer"), new QName("http://geronimo.apache.org/xml/ns/geronimo-jaspi", "appContext"), new QName("http://geronimo.apache.org/xml/ns/geronimo-jaspi", "authenticationContextID"), new QName("http://geronimo.apache.org/xml/ns/geronimo-jaspi", "serverAuthModule"));
-            }
-        }
-        if (serverAuthModule!= null) {
-            serverAuthContextTypeServerAuthModule.setObject(reader, context, serverAuthContextType, serverAuthModule);
-        }
-
-        context.afterUnmarshal(serverAuthContextType, lifecycleCallback);
-
-        return serverAuthContextType;
-    }
-
-    public final void write(XoXMLStreamWriter writer, ServerAuthContextType serverAuthContextType, RuntimeContext context)
-        throws Exception
-    {
-        if (serverAuthContextType == null) {
-            writer.writeXsiNil();
-            return ;
-        }
-
-        if (context == null) {
-            context = new RuntimeContext();
-        }
-
-        String prefix = writer.getUniquePrefix("http://geronimo.apache.org/xml/ns/geronimo-jaspi");
-        if (ServerAuthContextType.class!= serverAuthContextType.getClass()) {
-            context.unexpectedSubclass(writer, serverAuthContextType, ServerAuthContextType.class);
-            return ;
-        }
-
-        context.beforeMarshal(serverAuthContextType, lifecycleCallback);
-
-
-        // ELEMENT: messageLayer
-        String messageLayer = serverAuthContextTypeMessageLayer.getObject(serverAuthContextType, context, serverAuthContextType);
-        if (messageLayer!= null) {
-            writer.writeStartElement(prefix, "messageLayer", "http://geronimo.apache.org/xml/ns/geronimo-jaspi");
-            writer.writeCharacters(messageLayer);
-            writer.writeEndElement();
-        }
-
-        // ELEMENT: appContext
-        String appContext = serverAuthContextTypeAppContext.getObject(serverAuthContextType, context, serverAuthContextType);
-        if (appContext!= null) {
-            writer.writeStartElement(prefix, "appContext", "http://geronimo.apache.org/xml/ns/geronimo-jaspi");
-            writer.writeCharacters(appContext);
-            writer.writeEndElement();
-        }
-
-        // ELEMENT: authenticationContextID
-        String authenticationContextID = serverAuthContextTypeAuthenticationContextID.getObject(serverAuthContextType, context, serverAuthContextType);
-        if (authenticationContextID!= null) {
-            writer.writeStartElement(prefix, "authenticationContextID", "http://geronimo.apache.org/xml/ns/geronimo-jaspi");
-            writer.writeCharacters(authenticationContextID);
-            writer.writeEndElement();
-        } else {
-            context.unexpectedNullValue(serverAuthContextType, "authenticationContextID");
-        }
-
-        // ELEMENT: serverAuthModule
-        List<AuthModuleType> serverAuthModule = serverAuthContextTypeServerAuthModule.getObject(serverAuthContextType, context, serverAuthContextType);
-        if (serverAuthModule!= null) {
-            for (AuthModuleType serverAuthModuleItem: serverAuthModule) {
-                writer.writeStartElement(prefix, "serverAuthModule", "http://geronimo.apache.org/xml/ns/geronimo-jaspi");
-                if (serverAuthModuleItem!= null) {
-                    writeServerAuthModuleType(writer, serverAuthModuleItem, context);
-                } else {
-                    writer.writeXsiNil();
-                }
-                writer.writeEndElement();
-            }
-        }
-
-        context.afterMarshal(serverAuthContextType, lifecycleCallback);
-    }
-
-}
diff --git a/geronimo-jaspi/src/main/java/sxc/org/apache/geronimo/components/jaspi/model/TargetPolicyTypeJAXB.java b/geronimo-jaspi/src/main/java/sxc/org/apache/geronimo/components/jaspi/model/TargetPolicyTypeJAXB.java
deleted file mode 100644
index dd6957a..0000000
--- a/geronimo-jaspi/src/main/java/sxc/org/apache/geronimo/components/jaspi/model/TargetPolicyTypeJAXB.java
+++ /dev/null
@@ -1,185 +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 sxc.org.apache.geronimo.components.jaspi.model;
-
-import java.util.ArrayList;
-import java.util.List;
-import javax.xml.XMLConstants;
-import javax.xml.namespace.QName;
-import com.envoisolutions.sxc.jaxb.FieldAccessor;
-import com.envoisolutions.sxc.jaxb.JAXBObject;
-import com.envoisolutions.sxc.jaxb.LifecycleCallback;
-import com.envoisolutions.sxc.jaxb.RuntimeContext;
-import com.envoisolutions.sxc.util.Attribute;
-import com.envoisolutions.sxc.util.XoXMLStreamReader;
-import com.envoisolutions.sxc.util.XoXMLStreamWriter;
-import org.apache.geronimo.components.jaspi.model.ProtectionPolicyType;
-import org.apache.geronimo.components.jaspi.model.TargetPolicyType;
-import org.apache.geronimo.components.jaspi.model.TargetType;
-
-
-import static sxc.org.apache.geronimo.components.jaspi.model.ProtectionPolicyTypeJAXB.readProtectionPolicyType;
-import static sxc.org.apache.geronimo.components.jaspi.model.ProtectionPolicyTypeJAXB.writeProtectionPolicyType;
-import static sxc.org.apache.geronimo.components.jaspi.model.TargetTypeJAXB.readTargetType;
-import static sxc.org.apache.geronimo.components.jaspi.model.TargetTypeJAXB.writeTargetType;
-
-/**
- * @version $Rev$ $Date$
- */
-
-@SuppressWarnings({
-    "StringEquality"
-})
-public class TargetPolicyTypeJAXB
-    extends JAXBObject<TargetPolicyType>
-{
-
-    public final static TargetPolicyTypeJAXB INSTANCE = new TargetPolicyTypeJAXB();
-    private final static LifecycleCallback lifecycleCallback = new LifecycleCallback(TargetPolicyType.class);
-    private final static FieldAccessor<TargetPolicyType, ProtectionPolicyType> targetPolicyTypeProtectionPolicy = new FieldAccessor<TargetPolicyType, ProtectionPolicyType>(TargetPolicyType.class, "protectionPolicy");
-    private final static FieldAccessor<TargetPolicyType, List<TargetType>> targetPolicyTypeTarget = new FieldAccessor<TargetPolicyType, List<TargetType>>(TargetPolicyType.class, "target");
-
-    public TargetPolicyTypeJAXB() {
-        super(TargetPolicyType.class, null, new QName("http://geronimo.apache.org/xml/ns/geronimo-jaspi".intern(), "targetPolicyType".intern()), ProtectionPolicyTypeJAXB.class, TargetTypeJAXB.class);
-    }
-
-    public static TargetPolicyType readTargetPolicyType(XoXMLStreamReader reader, RuntimeContext context)
-        throws Exception
-    {
-        return INSTANCE.read(reader, context);
-    }
-
-    public static void writeTargetPolicyType(XoXMLStreamWriter writer, TargetPolicyType targetPolicyType, RuntimeContext context)
-        throws Exception
-    {
-        INSTANCE.write(writer, targetPolicyType, context);
-    }
-
-    public final TargetPolicyType read(XoXMLStreamReader reader, RuntimeContext context)
-        throws Exception
-    {
-
-        // Check for xsi:nil
-        if (reader.isXsiNil()) {
-            return null;
-        }
-
-        if (context == null) {
-            context = new RuntimeContext();
-        }
-
-        TargetPolicyType targetPolicyType = new TargetPolicyType();
-        context.beforeUnmarshal(targetPolicyType, lifecycleCallback);
-
-        List<TargetType> target = null;
-
-        // Check xsi:type
-        QName xsiType = reader.getXsiType();
-        if (xsiType!= null) {
-            if (("targetPolicyType"!= xsiType.getLocalPart())||("http://geronimo.apache.org/xml/ns/geronimo-jaspi"!= xsiType.getNamespaceURI())) {
-                return context.unexpectedXsiType(reader, TargetPolicyType.class);
-            }
-        }
-
-        // Read attributes
-        for (Attribute attribute: reader.getAttributes()) {
-            if (XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI!= attribute.getNamespace()) {
-                context.unexpectedAttribute(attribute);
-            }
-        }
-
-        // Read elements
-        for (XoXMLStreamReader elementReader: reader.getChildElements()) {
-            if (("protectionPolicy" == elementReader.getLocalName())&&("http://geronimo.apache.org/xml/ns/geronimo-jaspi" == elementReader.getNamespaceURI())) {
-                // ELEMENT: protectionPolicy
-                ProtectionPolicyType protectionPolicy = readProtectionPolicyType(elementReader, context);
-                targetPolicyTypeProtectionPolicy.setObject(reader, context, targetPolicyType, protectionPolicy);
-            } else if (("target" == elementReader.getLocalName())&&("http://geronimo.apache.org/xml/ns/geronimo-jaspi" == elementReader.getNamespaceURI())) {
-                // ELEMENT: target
-                TargetType targetItem = readTargetType(elementReader, context);
-                if (target == null) {
-                    target = targetPolicyTypeTarget.getObject(reader, context, targetPolicyType);
-                    if (target!= null) {
-                        target.clear();
-                    } else {
-                        target = new ArrayList<TargetType>();
-                    }
-                }
-                target.add(targetItem);
-            } else {
-                context.unexpectedElement(elementReader, new QName("http://geronimo.apache.org/xml/ns/geronimo-jaspi", "protectionPolicy"), new QName("http://geronimo.apache.org/xml/ns/geronimo-jaspi", "target"));
-            }
-        }
-        if (target!= null) {
-            targetPolicyTypeTarget.setObject(reader, context, targetPolicyType, target);
-        }
-
-        context.afterUnmarshal(targetPolicyType, lifecycleCallback);
-
-        return targetPolicyType;
-    }
-
-    public final void write(XoXMLStreamWriter writer, TargetPolicyType targetPolicyType, RuntimeContext context)
-        throws Exception
-    {
-        if (targetPolicyType == null) {
-            writer.writeXsiNil();
-            return ;
-        }
-
-        if (context == null) {
-            context = new RuntimeContext();
-        }
-
-        String prefix = writer.getUniquePrefix("http://geronimo.apache.org/xml/ns/geronimo-jaspi");
-        if (TargetPolicyType.class!= targetPolicyType.getClass()) {
-            context.unexpectedSubclass(writer, targetPolicyType, TargetPolicyType.class);
-            return ;
-        }
-
-        context.beforeMarshal(targetPolicyType, lifecycleCallback);
-
-
-        // ELEMENT: protectionPolicy
-        ProtectionPolicyType protectionPolicy = targetPolicyTypeProtectionPolicy.getObject(targetPolicyType, context, targetPolicyType);
-        if (protectionPolicy!= null) {
-            writer.writeStartElement(prefix, "protectionPolicy", "http://geronimo.apache.org/xml/ns/geronimo-jaspi");
-            writeProtectionPolicyType(writer, protectionPolicy, context);
-            writer.writeEndElement();
-        } else {
-            context.unexpectedNullValue(targetPolicyType, "protectionPolicy");
-        }
-
-        // ELEMENT: target
-        List<TargetType> target = targetPolicyTypeTarget.getObject(targetPolicyType, context, targetPolicyType);
-        if (target!= null) {
-            for (TargetType targetItem: target) {
-                writer.writeStartElement(prefix, "target", "http://geronimo.apache.org/xml/ns/geronimo-jaspi");
-                if (targetItem!= null) {
-                    writeTargetType(writer, targetItem, context);
-                } else {
-                    writer.writeXsiNil();
-                }
-                writer.writeEndElement();
-            }
-        }
-
-        context.afterMarshal(targetPolicyType, lifecycleCallback);
-    }
-
-}
diff --git a/geronimo-jaspi/src/main/java/sxc/org/apache/geronimo/components/jaspi/model/TargetTypeJAXB.java b/geronimo-jaspi/src/main/java/sxc/org/apache/geronimo/components/jaspi/model/TargetTypeJAXB.java
deleted file mode 100644
index 430494a..0000000
--- a/geronimo-jaspi/src/main/java/sxc/org/apache/geronimo/components/jaspi/model/TargetTypeJAXB.java
+++ /dev/null
@@ -1,143 +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 sxc.org.apache.geronimo.components.jaspi.model;
-
-import javax.xml.XMLConstants;
-import javax.xml.namespace.QName;
-import com.envoisolutions.sxc.jaxb.FieldAccessor;
-import com.envoisolutions.sxc.jaxb.JAXBObject;
-import com.envoisolutions.sxc.jaxb.LifecycleCallback;
-import com.envoisolutions.sxc.jaxb.RuntimeContext;
-import com.envoisolutions.sxc.util.Attribute;
-import com.envoisolutions.sxc.util.XoXMLStreamReader;
-import com.envoisolutions.sxc.util.XoXMLStreamWriter;
-import org.apache.geronimo.components.jaspi.model.TargetType;
-
-/**
- * @version $Rev$ $Date$
- */
-
-@SuppressWarnings({
-    "StringEquality"
-})
-public class TargetTypeJAXB
-    extends JAXBObject<TargetType>
-{
-
-    public final static TargetTypeJAXB INSTANCE = new TargetTypeJAXB();
-    private final static LifecycleCallback lifecycleCallback = new LifecycleCallback(TargetType.class);
-    private final static FieldAccessor<TargetType, String> targetTypeClassName = new FieldAccessor<TargetType, String>(TargetType.class, "className");
-
-    public TargetTypeJAXB() {
-        super(TargetType.class, null, new QName("http://geronimo.apache.org/xml/ns/geronimo-jaspi".intern(), "targetType".intern()));
-    }
-
-    public static TargetType readTargetType(XoXMLStreamReader reader, RuntimeContext context)
-        throws Exception
-    {
-        return INSTANCE.read(reader, context);
-    }
-
-    public static void writeTargetType(XoXMLStreamWriter writer, TargetType targetType, RuntimeContext context)
-        throws Exception
-    {
-        INSTANCE.write(writer, targetType, context);
-    }
-
-    public final TargetType read(XoXMLStreamReader reader, RuntimeContext context)
-        throws Exception
-    {
-
-        // Check for xsi:nil
-        if (reader.isXsiNil()) {
-            return null;
-        }
-
-        if (context == null) {
-            context = new RuntimeContext();
-        }
-
-        TargetType targetType = new TargetType();
-        context.beforeUnmarshal(targetType, lifecycleCallback);
-
-
-        // Check xsi:type
-        QName xsiType = reader.getXsiType();
-        if (xsiType!= null) {
-            if (("targetType"!= xsiType.getLocalPart())||("http://geronimo.apache.org/xml/ns/geronimo-jaspi"!= xsiType.getNamespaceURI())) {
-                return context.unexpectedXsiType(reader, TargetType.class);
-            }
-        }
-
-        // Read attributes
-        for (Attribute attribute: reader.getAttributes()) {
-            if (XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI!= attribute.getNamespace()) {
-                context.unexpectedAttribute(attribute);
-            }
-        }
-
-        // Read elements
-        for (XoXMLStreamReader elementReader: reader.getChildElements()) {
-            if (("className" == elementReader.getLocalName())&&("http://geronimo.apache.org/xml/ns/geronimo-jaspi" == elementReader.getNamespaceURI())) {
-                // ELEMENT: className
-                String className = elementReader.getElementAsString();
-                targetTypeClassName.setObject(reader, context, targetType, className);
-            } else {
-                context.unexpectedElement(elementReader, new QName("http://geronimo.apache.org/xml/ns/geronimo-jaspi", "className"));
-            }
-        }
-
-        context.afterUnmarshal(targetType, lifecycleCallback);
-
-        return targetType;
-    }
-
-    public final void write(XoXMLStreamWriter writer, TargetType targetType, RuntimeContext context)
-        throws Exception
-    {
-        if (targetType == null) {
-            writer.writeXsiNil();
-            return ;
-        }
-
-        if (context == null) {
-            context = new RuntimeContext();
-        }
-
-        if (TargetType.class!= targetType.getClass()) {
-            context.unexpectedSubclass(writer, targetType, TargetType.class);
-            return ;
-        }
-
-        context.beforeMarshal(targetType, lifecycleCallback);
-
-
-        // ELEMENT: className
-        String className = targetTypeClassName.getObject(targetType, context, targetType);
-        if (className!= null) {
-            writer.writeStartElementWithAutoPrefix("http://geronimo.apache.org/xml/ns/geronimo-jaspi", "className");
-            writer.writeCharacters(className);
-            writer.writeEndElement();
-        } else {
-            context.unexpectedNullValue(targetType, "className");
-        }
-
-        context.afterMarshal(targetType, lifecycleCallback);
-    }
-
-}
diff --git a/geronimo-jaspi/src/main/resources/META-INF/sun-jaxb.episode b/geronimo-jaspi/src/main/resources/META-INF/sun-jaxb.episode
index b0649d1..cee9d72 100644
--- a/geronimo-jaspi/src/main/resources/META-INF/sun-jaxb.episode
+++ b/geronimo-jaspi/src/main/resources/META-INF/sun-jaxb.episode
@@ -1,36 +1,47 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-    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.
--->
 <bindings version="2.1" xmlns="http://java.sun.com/xml/ns/jaxb">
   <!--
 
-This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.1.5-b01-fcs
-See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
-Any modifications to this file will be lost upon recompilation of the source schema.
-Generated on: 2008.07.12 at 02:26:00 PM PDT
+This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vhudson-jaxb-ri-2.1-833 
+See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
+Any modifications to this file will be lost upon recompilation of the source schema. 
+Generated on: 2011.05.01 at 12:30:10 AM PDT 
 
   -->
   <bindings scd="x-schema::tns" xmlns:tns="http://geronimo.apache.org/xml/ns/geronimo-jaspi">
     <schemaBindings map="false"/>
-    <bindings scd="~tns:configProviderType">
-      <class ref="org.apache.geronimo.components.jaspi.ConfigProviderType"/>
+    <bindings scd="~tns:serverAuthConfigType">
+      <class ref="org.apache.geronimo.components.jaspi.model.ServerAuthConfigType"/>
     </bindings>
     <bindings scd="~tns:jaspiType">
-      <class ref="org.apache.geronimo.components.jaspi.JaspiType"/>
+      <class ref="org.apache.geronimo.components.jaspi.model.JaspiType"/>
+    </bindings>
+    <bindings scd="~tns:configProviderType">
+      <class ref="org.apache.geronimo.components.jaspi.model.ConfigProviderType"/>
+    </bindings>
+    <bindings scd="~tns:authModuleType">
+      <class ref="org.apache.geronimo.components.jaspi.model.AuthModuleType"/>
+    </bindings>
+    <bindings scd="~tns:targetPolicyType">
+      <class ref="org.apache.geronimo.components.jaspi.model.TargetPolicyType"/>
+    </bindings>
+    <bindings scd="~tns:clientAuthConfigType">
+      <class ref="org.apache.geronimo.components.jaspi.model.ClientAuthConfigType"/>
+    </bindings>
+    <bindings scd="~tns:messagePolicyType">
+      <class ref="org.apache.geronimo.components.jaspi.model.MessagePolicyType"/>
+    </bindings>
+    <bindings scd="~tns:clientAuthContextType">
+      <class ref="org.apache.geronimo.components.jaspi.model.ClientAuthContextType"/>
+    </bindings>
+    <bindings scd="~tns:protectionPolicyType">
+      <class ref="org.apache.geronimo.components.jaspi.model.ProtectionPolicyType"/>
+    </bindings>
+    <bindings scd="~tns:targetType">
+      <class ref="org.apache.geronimo.components.jaspi.model.TargetType"/>
+    </bindings>
+    <bindings scd="~tns:serverAuthContextType">
+      <class ref="org.apache.geronimo.components.jaspi.model.ServerAuthContextType"/>
     </bindings>
   </bindings>
 </bindings>
diff --git a/geronimo-jaspi/src/main/xsd/geronimo-jaspi.xsd b/geronimo-jaspi/src/main/resources/geronimo-jaspi.xsd
similarity index 100%
rename from geronimo-jaspi/src/main/xsd/geronimo-jaspi.xsd
rename to geronimo-jaspi/src/main/resources/geronimo-jaspi.xsd
diff --git a/geronimo-jaspi/src/test/java/org/apache/geronimo/components/jaspi/model/JaxbTest.java b/geronimo-jaspi/src/test/java/org/apache/geronimo/components/jaspi/impl/JaxbTest.java
similarity index 78%
rename from geronimo-jaspi/src/test/java/org/apache/geronimo/components/jaspi/model/JaxbTest.java
rename to geronimo-jaspi/src/test/java/org/apache/geronimo/components/jaspi/impl/JaxbTest.java
index 5da55f3..ecae64f 100644
--- a/geronimo-jaspi/src/test/java/org/apache/geronimo/components/jaspi/model/JaxbTest.java
+++ b/geronimo-jaspi/src/test/java/org/apache/geronimo/components/jaspi/impl/JaxbTest.java
@@ -18,16 +18,13 @@
  */
 
 
-package org.apache.geronimo.components.jaspi.model;
+package org.apache.geronimo.components.jaspi.impl;
 
-import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
-import java.io.OutputStreamWriter;
 import java.io.Reader;
 import java.io.File;
-import java.io.UnsupportedEncodingException;
 import java.io.Writer;
 import java.io.FileWriter;
 import java.io.FileReader;
@@ -46,11 +43,18 @@
 import javax.security.auth.message.module.ClientAuthModule;
 import javax.security.auth.callback.CallbackHandler;
 
+import org.apache.geronimo.components.jaspi.AuthConfigFactoryImpl;
+import org.apache.geronimo.components.jaspi.model.AuthModuleType;
+import org.apache.geronimo.components.jaspi.model.ClientAuthConfigType;
+import org.apache.geronimo.components.jaspi.model.ClientAuthContextType;
+import org.apache.geronimo.components.jaspi.model.ConfigProviderType;
+import org.apache.geronimo.components.jaspi.model.JaspiType;
+import org.apache.geronimo.components.jaspi.model.JaspiXmlUtil;
 import org.testng.annotations.Test;
 import org.xml.sax.SAXException;
 
 /**
- * @version $Rev$ $Date$
+ * @version $Rev: 939768 $ $Date: 2010-04-30 11:26:46 -0700 (Fri, 30 Apr 2010) $
  */
 
 public class JaxbTest {
@@ -66,7 +70,7 @@
         JaspiType jaspi1 = loadJaspi(file);
         if (jaspi1.getConfigProvider().size() != count) throw new Exception("expected " + count + " configprovider, not this: " + jaspi1.getConfigProvider());
         File newFile = getWriteFile(file);
-        Writer writer = getWriter(newFile);
+        Writer writer = new FileWriter(newFile);
         JaspiXmlUtil.writeJaspi(jaspi1, writer);
         JaspiType jaspi2 = JaspiXmlUtil.loadJaspi(new FileReader(newFile));
         if (jaspi2.getConfigProvider().size() != count) throw new Exception("expected " + count + " configprovider, not this: " + jaspi2.getConfigProvider());
@@ -78,12 +82,15 @@
         JaspiType jaspi1 = loadJaspi(file);
         if (jaspi1.getConfigProvider().size() != count) throw new Exception("expected " + count + " configprovider, not this: " + jaspi1.getConfigProvider());
         File newFile = getWriteFile(file);
-        Writer writer = getWriter(newFile);
+        Writer writer = new FileWriter(newFile);
         JaspiXmlUtil.writeJaspi(jaspi1, writer);
         JaspiType jaspi2 = JaspiXmlUtil.loadJaspi(new FileReader(newFile));
         if (jaspi2.getConfigProvider().size() != count) throw new Exception("expected " + count + " configprovider, not this: " + jaspi2.getConfigProvider());
 
-        AuthConfigProvider configProvider = jaspi1.getConfigProvider().get(ConfigProviderType.getRegistrationKey("Http", "test-app1")).getProvider();
+        AuthConfigFactoryImpl authConfigFactory = new AuthConfigFactoryImpl(jaspi1, callbackHandler);
+
+        AuthConfigProvider configProvider = authConfigFactory.getConfigProvider("Http", "test-app1", null);
+//                adapter.unmarshal(jaspi1.getConfigProvider()).get(ConfigProviderType.getRegistrationKey("Http", "test-app1")).getProvider();
         checkConfigProvider(configProvider);
     }
 
@@ -93,9 +100,9 @@
         return rbac;
     }
 
-    private Reader getReader(String file) throws UnsupportedEncodingException {
+    private Reader getReader(String file) {
         InputStream in = getClass().getClassLoader().getResourceAsStream("test-" + file + ".xml");
-        Reader reader = new InputStreamReader(in, "UTF-8");
+        Reader reader = new InputStreamReader(in);
         return reader;
     }
 
@@ -110,13 +117,13 @@
         String file = "config-provider";
         Reader reader = getReader(file);
         ConfigProviderType jaspi1 = JaspiXmlUtil.loadConfigProvider(reader);
-        jaspi1.initialize(callbackHandler);
+//        jaspi1.initialize(callbackHandler);
         File newFile = getWriteFile(file);
-        Writer writer = getWriter(newFile);
+        Writer writer = new FileWriter(newFile);
         JaspiXmlUtil.writeConfigProvider(jaspi1, writer);
         ConfigProviderType jaspi2 = JaspiXmlUtil.loadConfigProvider(new FileReader(newFile));
 
-        AuthConfigProvider configProvider = jaspi1.getProvider();
+        AuthConfigProvider configProvider = ConfigProviderImpl.newConfigProvider(null, jaspi1);
         checkConfigProvider(configProvider);
     }
 
@@ -125,13 +132,13 @@
         String file = "client-auth-config";
         Reader reader = getReader(file);
         ClientAuthConfigType jaspi1 = JaspiXmlUtil.loadClientAuthConfig(reader);
-        jaspi1.initialize(callbackHandler);
+//        jaspi1.initialize(callbackHandler);
         File newFile = getWriteFile(file);
-        Writer writer = getWriter(newFile);
+        Writer writer = new FileWriter(newFile);
         JaspiXmlUtil.writeClientAuthConfig(jaspi1, writer);
         ClientAuthConfigType jaspi2 = JaspiXmlUtil.loadClientAuthConfig(new FileReader(newFile));
 
-        ClientAuthConfig clientAuthConfig = jaspi1.newClientAuthConfig("Http", "app", callbackHandler);
+        ClientAuthConfig clientAuthConfig = ConfigProviderImpl.newClientAuthConfig(jaspi1, "Http", "app", callbackHandler);
         checkClientAuthConfig(clientAuthConfig);
     }
 
@@ -141,30 +148,25 @@
         Reader reader = getReader(file);
         ClientAuthContextType jaspi1 = JaspiXmlUtil.loadClientAuthContext(reader);
         File newFile = getWriteFile(file);
-        Writer writer = getWriter(newFile);
+        Writer writer = new FileWriter(newFile);
         JaspiXmlUtil.writeClientAuthContext(jaspi1, writer);
         ClientAuthContextType jaspi2 = JaspiXmlUtil.loadClientAuthContext(new FileReader(newFile));
 
-        ClientAuthContext clientAuthConfig = jaspi1.newClientAuthContext(callbackHandler);
+        ClientAuthContext clientAuthConfig = ConfigProviderImpl.newClientAuthContext(jaspi1, callbackHandler);
         clientAuthConfig.secureRequest(null, null);
     }
 
-    private Writer getWriter(File newFile) throws IOException {
-        FileOutputStream out = new FileOutputStream(newFile);
-        return new OutputStreamWriter(out, "UTF-8");//new FileWriter(newFile);
-    }
-
     @Test
     public void testClientAuthModule() throws Exception {
         String file = "client-auth-module";
         Reader reader = getReader(file);
         AuthModuleType<ClientAuthModule> jaspi1 = JaspiXmlUtil.loadClientAuthModule(reader);
         File newFile = getWriteFile(file);
-        Writer writer = getWriter(newFile);
+        Writer writer = new FileWriter(newFile);
         JaspiXmlUtil.writeClientAuthModule(jaspi1, writer);
         AuthModuleType jaspi2 = JaspiXmlUtil.loadClientAuthModule(new FileReader(newFile));
 
-        ClientAuthModule clientAuthConfig = jaspi1.newAuthModule(callbackHandler);
+        ClientAuthModule clientAuthConfig =ConfigProviderImpl.newAuthModule(jaspi1, callbackHandler);
         clientAuthConfig.secureRequest(null, null);
     }
 
