diff --git a/geronimo-connector/pom.xml b/geronimo-connector/pom.xml
index 253d26b..52fd1fd 100644
--- a/geronimo-connector/pom.xml
+++ b/geronimo-connector/pom.xml
@@ -61,5 +61,28 @@
         </dependency>
     </dependencies>
 
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-jar-plugin</artifactId>
+                <configuration>
+                    <archive>
+                        <!-- Do not include META-INF/maven to avoid long file problems on windows -->
+                        <addMavenDescriptor>false</addMavenDescriptor>
+                    </archive>
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <!-- Build *test.jar files for modules -->
+                            <goal>test-jar</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            
+        </plugins>
+    </build>
 </project>
 
diff --git a/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/GeronimoWorkManager.java b/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/GeronimoWorkManager.java
index f15d8bd..c9ef362 100644
--- a/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/GeronimoWorkManager.java
+++ b/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/GeronimoWorkManager.java
@@ -17,9 +17,9 @@
 
 package org.apache.geronimo.connector.work;
 
-import java.util.concurrent.Executor;
-import java.util.List;
+import java.util.Collection;
 import java.util.Collections;
+import java.util.concurrent.Executor;
 
 import javax.resource.spi.work.ExecutionContext;
 import javax.resource.spi.work.Work;
@@ -37,7 +37,7 @@
  * WorkManager implementation which uses under the cover three WorkExecutorPool
  * - one for each synchronization policy - in order to dispatch the submitted
  * Work instances.
- * <P>
+ * <p/>
  * A WorkManager is a component of the JCA specifications, which allows a
  * Resource Adapter to submit tasks to an Application Server for execution.
  *
@@ -65,7 +65,7 @@
      */
     private Executor scheduledWorkExecutorPool;
 
-    private final List<InflowContextHandler> inflowContextHandlers;
+    private final Collection<InflowContextHandler> inflowContextHandlers;
 
 
     private final WorkExecutor scheduleWorkExecutor = new ScheduleWorkExecutor();
@@ -79,11 +79,11 @@
         this(null, null, null, null);
     }
 
-    public GeronimoWorkManager(Executor sync, Executor start, Executor sched, List<InflowContextHandler> inflowContextHandlers) {
+    public GeronimoWorkManager(Executor sync, Executor start, Executor sched, Collection<InflowContextHandler> inflowContextHandlers) {
         syncWorkExecutorPool = sync;
         startWorkExecutorPool = start;
         scheduledWorkExecutorPool = sched;
-        this.inflowContextHandlers = inflowContextHandlers == null? Collections.<InflowContextHandler>emptyList(): inflowContextHandlers;
+        this.inflowContextHandlers = inflowContextHandlers == null ? Collections.<InflowContextHandler>emptyList() : inflowContextHandlers;
     }
 
     public void doStart() throws Exception {
@@ -188,9 +188,8 @@
      * Execute the specified Work.
      *
      * @param work Work to be executed.
-     *
-     * @exception WorkException Indicates that the Work execution has been
-     * unsuccessful.
+     * @throws WorkException Indicates that the Work execution has been
+     *                       unsuccessful.
      */
     private void executeWork(WorkerContext work, WorkExecutor workExecutor, Executor pooledExecutor) throws WorkException {
         work.workAccepted(this);
diff --git a/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/InflowContextHandler.java b/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/InflowContextHandler.java
index 326fd71..5e0ad3c 100644
--- a/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/InflowContextHandler.java
+++ b/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/InflowContextHandler.java
@@ -24,7 +24,7 @@
 import javax.resource.spi.work.WorkCompletedException;
 
 /**
- * @version $Rev:$ $Date:$
+ * @version $Rev$ $Date$
  */
 public interface InflowContextHandler<E extends InflowContext> {
 
@@ -34,4 +34,6 @@
 
     Class<E> getHandledClass(); 
 
+    boolean required();
+
 }
diff --git a/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/TransactionInflowContextHandler.java b/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/TransactionInflowContextHandler.java
index 0623da2..5bcd0d1 100644
--- a/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/TransactionInflowContextHandler.java
+++ b/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/TransactionInflowContextHandler.java
@@ -30,7 +30,7 @@
 import org.apache.geronimo.transaction.manager.ImportedTransactionActiveException;
 
 /**
- * @version $Rev:$ $Date:$
+ * @version $Rev$ $Date$
  */
 public class TransactionInflowContextHandler implements InflowContextHandler<TransactionInflowContext>{
 
@@ -73,4 +73,8 @@
     public Class<TransactionInflowContext> getHandledClass() {
         return TransactionInflowContext.class;
     }
+
+    public boolean required() {
+        return false;
+    }
 }
diff --git a/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/WorkerContext.java b/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/WorkerContext.java
index e1df22a..4f5c2d7 100644
--- a/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/WorkerContext.java
+++ b/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/WorkerContext.java
@@ -21,6 +21,7 @@
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Collection;
 import java.util.concurrent.CountDownLatch;
 
 import javax.resource.NotSupportedException;
@@ -131,9 +132,9 @@
      * @param work   Work to be wrapped.
      * @param inflowContextHandlers InflowContextHandlers supported by this work manager
      */
-    public WorkerContext(Work work, List<InflowContextHandler> inflowContextHandlers) {
+    public WorkerContext(Work work, Collection<InflowContextHandler> inflowContextHandlers) {
         adaptee = work;
-        this.inflowContextHandlers = inflowContextHandlers;
+        this.inflowContextHandlers = new ArrayList<InflowContextHandler>(inflowContextHandlers);
         executionContext = null;
         workListener = NULL_WORK_LISTENER;
     }
@@ -154,7 +155,7 @@
     public WorkerContext(Work aWork,
                          long aStartTimeout,
                          ExecutionContext execContext,
-                         WorkListener workListener, List<InflowContextHandler> inflowContextHandlers) throws WorkRejectedException {
+                         WorkListener workListener, Collection<InflowContextHandler> inflowContextHandlers) throws WorkRejectedException {
         adaptee = aWork;
         startTimeOut = aStartTimeout;
         if (null == workListener) {
@@ -170,7 +171,7 @@
         } else {
             executionContext = execContext;
         }
-        this.inflowContextHandlers = inflowContextHandlers;
+        this.inflowContextHandlers = new ArrayList<InflowContextHandler>(inflowContextHandlers);
     }
 
     /* (non-Javadoc)
@@ -333,18 +334,30 @@
                     throw new WorkCompletedException("Duplicate or unhandled InflowContext: " + inflowContext);
                 }
             }
+            for (Iterator<InflowContextHandler> it = inflowContextHandlers.iterator(); it.hasNext();) {
+                InflowContextHandler inflowContextHandler = it.next();
+                if (!inflowContextHandler.required()) {
+                    it.remove();
+                }
+            }
             // TODO use a InflowContextLifecycleListener
 
             int i = 0;
             for (InflowContext inflowContext : inflowContexts) {
-                inflowContextHandlers.get(i).before(inflowContext);
+                sortedHandlers.get(i++).before(inflowContext);
+            }
+            for (InflowContextHandler inflowContextHandler: inflowContextHandlers) {
+                inflowContextHandler.before(null);
             }
             try {
                 adaptee.run();
             } finally {
                 int j = 0;
                 for (InflowContext inflowContext : inflowContexts) {
-                    inflowContextHandlers.get(j).after(inflowContext);
+                    sortedHandlers.get(j++).after(inflowContext);
+                }
+                for (InflowContextHandler inflowContextHandler: inflowContextHandlers) {
+                    inflowContextHandler.after(null);
                 }
             }
 
