diff --git a/geronimo-connector/pom.xml b/geronimo-connector/pom.xml
index 584d0f6..253d26b 100644
--- a/geronimo-connector/pom.xml
+++ b/geronimo-connector/pom.xml
@@ -51,9 +51,9 @@
 
         <dependency>
             <groupId>org.apache.geronimo.specs</groupId>
-            <artifactId>geronimo-j2ee-connector_1.5_spec</artifactId>
+            <artifactId>geronimo-j2ee-connector_1.6_spec</artifactId>
         </dependency>
-        
+
         <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
diff --git a/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/AbstractConnectionManager.java b/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/AbstractConnectionManager.java
index 57f6f43..ca7007a 100644
--- a/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/AbstractConnectionManager.java
+++ b/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/AbstractConnectionManager.java
@@ -111,6 +111,11 @@
         getStack().getConnection(ci);
     }
 
+    public void inactiveConnectionClosed(Object connection, ManagedConnectionFactory managedConnectionFactory) {
+        //TODO If we are tracking connections, we need to stop tracking this one.
+        //I don't see why we don't get a connectionClosed event for it.
+    }
+
     ConnectionInterceptor getConnectionInterceptor() {
         return getStack();
     }
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 e597cca..f15d8bd 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
@@ -18,6 +18,8 @@
 package org.apache.geronimo.connector.work;
 
 import java.util.concurrent.Executor;
+import java.util.List;
+import java.util.Collections;
 
 import javax.resource.spi.work.ExecutionContext;
 import javax.resource.spi.work.Work;
@@ -30,7 +32,6 @@
 import org.apache.geronimo.connector.work.pool.StartWorkExecutor;
 import org.apache.geronimo.connector.work.pool.SyncWorkExecutor;
 import org.apache.geronimo.connector.work.pool.WorkExecutor;
-import org.apache.geronimo.transaction.manager.XAWork;
 
 /**
  * WorkManager implementation which uses under the cover three WorkExecutorPool
@@ -64,7 +65,8 @@
      */
     private Executor scheduledWorkExecutorPool;
 
-    private final XAWork transactionManager;
+    private final List<InflowContextHandler> inflowContextHandlers;
+
 
     private final WorkExecutor scheduleWorkExecutor = new ScheduleWorkExecutor();
     private final WorkExecutor startWorkExecutor = new StartWorkExecutor();
@@ -77,11 +79,11 @@
         this(null, null, null, null);
     }
 
-    public GeronimoWorkManager(Executor sync, Executor start, Executor sched, XAWork xaWork) {
+    public GeronimoWorkManager(Executor sync, Executor start, Executor sched, List<InflowContextHandler> inflowContextHandlers) {
         syncWorkExecutorPool = sync;
         startWorkExecutorPool = start;
         scheduledWorkExecutorPool = sched;
-        this.transactionManager = xaWork;
+        this.inflowContextHandlers = inflowContextHandlers == null? Collections.<InflowContextHandler>emptyList(): inflowContextHandlers;
     }
 
     public void doStart() throws Exception {
@@ -114,7 +116,7 @@
     * @see javax.resource.spi.work.WorkManager#doWork(javax.resource.spi.work.Work)
     */
     public void doWork(Work work) throws WorkException {
-        executeWork(new WorkerContext(work, transactionManager), syncWorkExecutor, syncWorkExecutorPool);
+        executeWork(new WorkerContext(work, inflowContextHandlers), syncWorkExecutor, syncWorkExecutorPool);
     }
 
     /* (non-Javadoc)
@@ -127,7 +129,7 @@
             WorkListener workListener)
             throws WorkException {
         WorkerContext workWrapper =
-                new WorkerContext(work, startTimeout, execContext, transactionManager, workListener);
+                new WorkerContext(work, startTimeout, execContext, workListener, inflowContextHandlers);
         workWrapper.setThreadPriority(Thread.currentThread().getPriority());
         executeWork(workWrapper, syncWorkExecutor, syncWorkExecutorPool);
     }
@@ -136,7 +138,7 @@
      * @see javax.resource.spi.work.WorkManager#startWork(javax.resource.spi.work.Work)
      */
     public long startWork(Work work) throws WorkException {
-        WorkerContext workWrapper = new WorkerContext(work, transactionManager);
+        WorkerContext workWrapper = new WorkerContext(work, inflowContextHandlers);
         workWrapper.setThreadPriority(Thread.currentThread().getPriority());
         executeWork(workWrapper, startWorkExecutor, startWorkExecutorPool);
         return System.currentTimeMillis() - workWrapper.getAcceptedTime();
@@ -152,7 +154,7 @@
             WorkListener workListener)
             throws WorkException {
         WorkerContext workWrapper =
-                new WorkerContext(work, startTimeout, execContext, transactionManager, workListener);
+                new WorkerContext(work, startTimeout, execContext, workListener, inflowContextHandlers);
         workWrapper.setThreadPriority(Thread.currentThread().getPriority());
         executeWork(workWrapper, startWorkExecutor, startWorkExecutorPool);
         return System.currentTimeMillis() - workWrapper.getAcceptedTime();
@@ -162,7 +164,7 @@
      * @see javax.resource.spi.work.WorkManager#scheduleWork(javax.resource.spi.work.Work)
      */
     public void scheduleWork(Work work) throws WorkException {
-        WorkerContext workWrapper = new WorkerContext(work, transactionManager);
+        WorkerContext workWrapper = new WorkerContext(work, inflowContextHandlers);
         workWrapper.setThreadPriority(Thread.currentThread().getPriority());
         executeWork(workWrapper, scheduleWorkExecutor, scheduledWorkExecutorPool);
     }
@@ -177,7 +179,7 @@
             WorkListener workListener)
             throws WorkException {
         WorkerContext workWrapper =
-                new WorkerContext(work, startTimeout, execContext, transactionManager, workListener);
+                new WorkerContext(work, startTimeout, execContext, workListener, inflowContextHandlers);
         workWrapper.setThreadPriority(Thread.currentThread().getPriority());
         executeWork(workWrapper, scheduleWorkExecutor, scheduledWorkExecutorPool);
     }
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
new file mode 100644
index 0000000..326fd71
--- /dev/null
+++ b/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/InflowContextHandler.java
@@ -0,0 +1,37 @@
+/*
+ * 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.connector.work;
+
+import javax.resource.spi.work.InflowContext;
+import javax.resource.spi.work.WorkCompletedException;
+
+/**
+ * @version $Rev:$ $Date:$
+ */
+public interface InflowContextHandler<E extends InflowContext> {
+
+    void before(E inflowContext) throws WorkCompletedException;
+
+    void after(E inflowContext) throws WorkCompletedException;
+
+    Class<E> getHandledClass(); 
+
+}
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
new file mode 100644
index 0000000..0623da2
--- /dev/null
+++ b/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/TransactionInflowContextHandler.java
@@ -0,0 +1,76 @@
+/*
+ * 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.connector.work;
+
+import javax.resource.spi.work.TransactionInflowContext;
+import javax.resource.spi.work.WorkCompletedException;
+import javax.transaction.xa.XAException;
+import javax.transaction.InvalidTransactionException;
+import javax.transaction.SystemException;
+
+import org.apache.geronimo.transaction.manager.XAWork;
+import org.apache.geronimo.transaction.manager.ImportedTransactionActiveException;
+
+/**
+ * @version $Rev:$ $Date:$
+ */
+public class TransactionInflowContextHandler implements InflowContextHandler<TransactionInflowContext>{
+
+    private final XAWork xaWork;
+
+    public TransactionInflowContextHandler(XAWork xaWork) {
+        this.xaWork = xaWork;
+    }
+
+    public void before(TransactionInflowContext inflowContext) throws WorkCompletedException {
+        if (inflowContext.getXid() != null) {
+            try {
+                long transactionTimeout = inflowContext.getTransactionTimeout();
+                //translate -1 value to 0 to indicate default transaction timeout.
+                xaWork.begin(inflowContext.getXid(), transactionTimeout < 0 ? 0 : transactionTimeout);
+            } catch (XAException e) {
+                throw (WorkCompletedException)new WorkCompletedException("Transaction import failed for xid " + inflowContext.getXid(), WorkCompletedException.TX_RECREATE_FAILED).initCause(e);
+            } catch (InvalidTransactionException e) {
+                throw (WorkCompletedException)new WorkCompletedException("Transaction import failed for xid " + inflowContext.getXid(), WorkCompletedException.TX_RECREATE_FAILED).initCause(e);
+            } catch (SystemException e) {
+                throw (WorkCompletedException)new WorkCompletedException("Transaction import failed for xid " + inflowContext.getXid(), WorkCompletedException.TX_RECREATE_FAILED).initCause(e);
+            } catch (ImportedTransactionActiveException e) {
+                throw (WorkCompletedException)new WorkCompletedException("Transaction already active for xid " + inflowContext.getXid(), WorkCompletedException.TX_CONCURRENT_WORK_DISALLOWED).initCause(e);
+            }
+        }
+    }
+
+    public void after(TransactionInflowContext inflowContext) throws WorkCompletedException {
+        if (inflowContext.getXid() != null) {
+            try {
+                xaWork.end(inflowContext.getXid());
+            } catch (XAException e) {
+                throw (WorkCompletedException)new WorkCompletedException("Transaction end failed for xid " + inflowContext.getXid(), WorkCompletedException.TX_RECREATE_FAILED).initCause(e);
+            } catch (SystemException e) {
+                throw (WorkCompletedException)new WorkCompletedException("Transaction end failed for xid " + inflowContext.getXid(), WorkCompletedException.TX_RECREATE_FAILED).initCause(e);
+            }
+        }
+    }
+
+    public Class<TransactionInflowContext> getHandledClass() {
+        return TransactionInflowContext.class;
+    }
+}
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 3a8a564..e1df22a 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
@@ -17,9 +17,17 @@
 
 package org.apache.geronimo.connector.work;
 
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
 import java.util.concurrent.CountDownLatch;
 
+import javax.resource.NotSupportedException;
 import javax.resource.spi.work.ExecutionContext;
+import javax.resource.spi.work.InflowContext;
+import javax.resource.spi.work.InflowContextProvider;
+import javax.resource.spi.work.TransactionInflowContext;
 import javax.resource.spi.work.Work;
 import javax.resource.spi.work.WorkAdapter;
 import javax.resource.spi.work.WorkCompletedException;
@@ -28,12 +36,7 @@
 import javax.resource.spi.work.WorkListener;
 import javax.resource.spi.work.WorkManager;
 import javax.resource.spi.work.WorkRejectedException;
-import javax.transaction.InvalidTransactionException;
-import javax.transaction.SystemException;
-import javax.transaction.xa.XAException;
 
-import org.apache.geronimo.transaction.manager.ImportedTransactionActiveException;
-import org.apache.geronimo.transaction.manager.XAWork;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -46,6 +49,8 @@
 
     private static final Logger log = LoggerFactory.getLogger(WorkerContext.class);
 
+    private static final List<InflowContext> NO_INFLOW_CONTEXT = Collections.emptyList();
+
     /**
      * Null WorkListener used as the default WorkListener.
      */
@@ -93,16 +98,9 @@
     private long startTimeOut;
 
     /**
-     * Execution context of the actual work to be executed.
-     */
-    private final ExecutionContext executionContext;
-
-    private final XAWork xaWork;
-
-    /**
      * Listener to be notified during the life-cycle of the work treatment.
      */
-    private WorkListener workListener = NULL_WORK_LISTENER;
+    private final WorkListener workListener;
 
     /**
      * Work exception, if any.
@@ -120,40 +118,59 @@
     private CountDownLatch endLatch = new CountDownLatch(1);
 
     /**
-     * Create a WorkWrapper.
-     *
-     * @param work                      Work to be wrapped.
-     * @param xaWork
+     * Execution context of the actual work to be executed.
      */
-    public WorkerContext(Work work, XAWork xaWork) {
+    private final ExecutionContext executionContext;
+
+    private final List<InflowContextHandler> inflowContextHandlers;
+
+
+    /**
+     * Create a WorkWrapper.
+     * TODO include a InflowContextLifecycleListener
+     * @param work   Work to be wrapped.
+     * @param inflowContextHandlers InflowContextHandlers supported by this work manager
+     */
+    public WorkerContext(Work work, List<InflowContextHandler> inflowContextHandlers) {
         adaptee = work;
+        this.inflowContextHandlers = inflowContextHandlers;
         executionContext = null;
-        this.xaWork = xaWork;
+        workListener = NULL_WORK_LISTENER;
     }
 
     /**
      * Create a WorkWrapper with the specified execution context.
      *
+     * TODO include a InflowContextLifecycleListener
      * @param aWork         Work to be wrapped.
      * @param aStartTimeout a time duration (in milliseconds) within which the
-     *                      execution of the Work instance must start.
+ *                      execution of the Work instance must start.
      * @param execContext   an object containing the execution context with which
-     *                      the submitted Work instance must be executed.
+*                      the submitted Work instance must be executed.
      * @param workListener  an object which would be notified when the various
-     *                      Work processing events (work accepted, work rejected, work started,
+     * @param inflowContextHandlers InflowContextHandlers supported by this work manager
+     * @throws javax.resource.spi.work.WorkRejectedException if executionContext supplied yet Work implements InflowContextProvider
      */
     public WorkerContext(Work aWork,
                          long aStartTimeout,
                          ExecutionContext execContext,
-                         XAWork xaWork,
-                         WorkListener workListener) {
+                         WorkListener workListener, List<InflowContextHandler> inflowContextHandlers) throws WorkRejectedException {
         adaptee = aWork;
         startTimeOut = aStartTimeout;
-        executionContext = execContext;
-        this.xaWork = xaWork;
-        if (null != workListener) {
+        if (null == workListener) {
+            this.workListener = NULL_WORK_LISTENER;
+        } else {
             this.workListener = workListener;
         }
+        if (aWork instanceof InflowContextProvider) {
+            if (execContext != null) {
+                throw new WorkRejectedException("Execution context provided but Work implements InflowContextProvider");
+            }
+            executionContext = null;
+        } else {
+            executionContext = execContext;
+        }
+        this.inflowContextHandlers = inflowContextHandlers;
     }
 
     /* (non-Javadoc)
@@ -229,7 +246,7 @@
      * @return true if the Work has timed out and false otherwise.
      */
     public synchronized boolean isTimedOut() {
-        assert isAccepted: "The work is not accepted.";
+        assert isAccepted : "The work is not accepted.";
         // A value of 0 means that the work never times out.
         //??? really?
         if (0 == startTimeOut || startTimeOut == WorkManager.INDEFINITE) {
@@ -278,6 +295,7 @@
             endLatch.countDown();
             return;
         }
+
         // Implementation note: the work listener is notified prior to release
         // the start lock. This behavior is intentional and seems to be the
         // more conservative.
@@ -286,29 +304,50 @@
         //Implementation note: we assume this is being called without an interesting TransactionContext,
         //and ignore/replace whatever is associated with the current thread.
         try {
-            if (executionContext == null || executionContext.getXid() == null) {
-                adaptee.run();
-            } else {
+            List<InflowContext> inflowContexts = NO_INFLOW_CONTEXT;
+            if (executionContext != null) {
+                TransactionInflowContext txInflowContext = new TransactionInflowContext();
                 try {
-                    long transactionTimeout = executionContext.getTransactionTimeout();
-                    //translate -1 value to 0 to indicate default transaction timeout.
-                    xaWork.begin(executionContext.getXid(), transactionTimeout < 0 ? 0 : transactionTimeout);
-                } catch (XAException e) {
-                    throw new WorkCompletedException("Transaction import failed for xid " + executionContext.getXid(), WorkCompletedException.TX_RECREATE_FAILED).initCause(e);
-                } catch (InvalidTransactionException e) {
-                    throw new WorkCompletedException("Transaction import failed for xid " + executionContext.getXid(), WorkCompletedException.TX_RECREATE_FAILED).initCause(e);
-                } catch (SystemException e) {
-                    throw new WorkCompletedException("Transaction import failed for xid " + executionContext.getXid(), WorkCompletedException.TX_RECREATE_FAILED).initCause(e);
-                } catch (ImportedTransactionActiveException e) {
-                    throw new WorkCompletedException("Transaction already active for xid " + executionContext.getXid(), WorkCompletedException.TX_CONCURRENT_WORK_DISALLOWED).initCause(e);
+                    txInflowContext.setTransactionTimeout(executionContext.getTransactionTimeout());
+                } catch (NotSupportedException e) {
+                    throw new WorkRejectedException("Could not read tx timeout");
                 }
-                try {
-                    adaptee.run();
-                } finally {
-                    xaWork.end(executionContext.getXid());
-                }
-
+                inflowContexts = Collections.<InflowContext>singletonList(txInflowContext);
+            } else if (adaptee instanceof InflowContextProvider) {
+                inflowContexts = ((InflowContextProvider) adaptee).getInflowContexts();
             }
+            List<InflowContextHandler> sortedHandlers = new ArrayList<InflowContextHandler>(inflowContexts.size());
+            for (InflowContext inflowContext : inflowContexts) {
+                boolean found = false;
+                for (Iterator<InflowContextHandler> it = inflowContextHandlers.iterator(); it.hasNext();) {
+                    InflowContextHandler inflowContextHandler = it.next();
+                    //TODO is this the right way around?
+                    if (inflowContext.getClass().isAssignableFrom(inflowContextHandler.getHandledClass())) {
+                        it.remove();
+                        sortedHandlers.add(inflowContextHandler);
+                        found = true;
+                        break;
+                    }
+                }
+                if (!found) {
+                    throw new WorkCompletedException("Duplicate or unhandled InflowContext: " + inflowContext);
+                }
+            }
+            // TODO use a InflowContextLifecycleListener
+
+            int i = 0;
+            for (InflowContext inflowContext : inflowContexts) {
+                inflowContextHandlers.get(i).before(inflowContext);
+            }
+            try {
+                adaptee.run();
+            } finally {
+                int j = 0;
+                for (InflowContext inflowContext : inflowContexts) {
+                    inflowContextHandlers.get(j).after(inflowContext);
+                }
+            }
+
             workListener.workCompleted(new WorkEvent(this, WorkEvent.WORK_COMPLETED, adaptee, null));
         } catch (Throwable e) {
             workException = (WorkException) (e instanceof WorkCompletedException ? e : new WorkCompletedException("Unknown error", WorkCompletedException.UNDEFINED).initCause(e));
diff --git a/geronimo-connector/src/test/java/org/apache/geronimo/connector/BootstrapContextTest.java b/geronimo-connector/src/test/java/org/apache/geronimo/connector/BootstrapContextTest.java
index 0900f7b..fc1446d 100644
--- a/geronimo-connector/src/test/java/org/apache/geronimo/connector/BootstrapContextTest.java
+++ b/geronimo-connector/src/test/java/org/apache/geronimo/connector/BootstrapContextTest.java
@@ -18,6 +18,7 @@
 package org.apache.geronimo.connector;
 
 import java.util.Timer;
+import java.util.Collections;
 import java.util.concurrent.RejectedExecutionException;
 import java.util.concurrent.RejectedExecutionHandler;
 import java.util.concurrent.SynchronousQueue;
@@ -30,6 +31,8 @@
 
 import junit.framework.TestCase;
 import org.apache.geronimo.connector.work.GeronimoWorkManager;
+import org.apache.geronimo.connector.work.TransactionInflowContextHandler;
+import org.apache.geronimo.connector.work.InflowContextHandler;
 import org.apache.geronimo.transaction.manager.GeronimoTransactionManager;
 import org.apache.geronimo.transaction.manager.XAWork;
 
@@ -94,7 +97,8 @@
      */
     public void testGetSetWorkManager() throws Exception {
         GeronimoTransactionManager transactionManager = new GeronimoTransactionManager();
-        GeronimoWorkManager manager = new GeronimoWorkManager(pool, pool, pool, transactionManager);
+        TransactionInflowContextHandler txInflowContextHandler = new TransactionInflowContextHandler(transactionManager);
+        GeronimoWorkManager manager = new GeronimoWorkManager(pool, pool, pool, Collections.<InflowContextHandler>singletonList(txInflowContextHandler));
         GeronimoBootstrapContext context = new GeronimoBootstrapContext(manager, transactionManager);
         WorkManager wm = context.getWorkManager();
 
@@ -106,7 +110,8 @@
      */
     public void testGetSetXATerminator() throws Exception {
         GeronimoTransactionManager transactionManager = new GeronimoTransactionManager();
-        GeronimoWorkManager manager = new GeronimoWorkManager(pool, pool, pool, transactionManager);
+        TransactionInflowContextHandler txInflowContextHandler = new TransactionInflowContextHandler(transactionManager);
+        GeronimoWorkManager manager = new GeronimoWorkManager(pool, pool, pool, Collections.<InflowContextHandler>singletonList(txInflowContextHandler));
         GeronimoBootstrapContext context = new GeronimoBootstrapContext(manager, transactionManager);
         XATerminator xat = context.getXATerminator();
 
diff --git a/geronimo-connector/src/test/java/org/apache/geronimo/connector/work/PooledWorkManagerTest.java b/geronimo-connector/src/test/java/org/apache/geronimo/connector/work/PooledWorkManagerTest.java
index 33eef15..258f737 100644
--- a/geronimo-connector/src/test/java/org/apache/geronimo/connector/work/PooledWorkManagerTest.java
+++ b/geronimo-connector/src/test/java/org/apache/geronimo/connector/work/PooledWorkManagerTest.java
@@ -24,6 +24,7 @@
 import java.util.concurrent.ThreadFactory;
 import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
+import java.util.Collections;
 
 import javax.resource.spi.work.ExecutionContext;
 import javax.resource.spi.work.Work;
@@ -51,6 +52,7 @@
         super.setUp();
         
         XAWork xaWork = new GeronimoTransactionManager();
+        TransactionInflowContextHandler txInflowContextHandler = new TransactionInflowContextHandler(xaWork);
         int poolSize = 1;
         int keepAliveTime = 30000;
         ThreadPoolExecutor pool = new ThreadPoolExecutor(
@@ -63,7 +65,7 @@
         pool.setThreadFactory(new ThreadPoolThreadFactory("Connector Test", getClass().getClassLoader()));
 
 
-        workManager = new GeronimoWorkManager(pool, pool, pool, xaWork);
+        workManager = new GeronimoWorkManager(pool, pool, pool, Collections.<InflowContextHandler>singletonList(txInflowContextHandler));
         workManager.doStart();
     }
 
diff --git a/geronimo-transaction/pom.xml b/geronimo-transaction/pom.xml
index 1ba41bf..877bcb3 100644
--- a/geronimo-transaction/pom.xml
+++ b/geronimo-transaction/pom.xml
@@ -54,10 +54,10 @@
             <artifactId>geronimo-jta_1.1_spec</artifactId>
         </dependency>
 
-        <dependency>
-            <groupId>org.apache.geronimo.specs</groupId>
-            <artifactId>geronimo-j2ee-connector_1.5_spec</artifactId>
-        </dependency>
+            <dependency>
+                <groupId>org.apache.geronimo.specs</groupId>
+                <artifactId>geronimo-j2ee-connector_1.6_spec</artifactId>
+            </dependency>
 
         <dependency>
             <groupId>org.objectweb.howl</groupId>
diff --git a/pom.xml b/pom.xml
index 9ba2058..4556559 100644
--- a/pom.xml
+++ b/pom.xml
@@ -85,8 +85,8 @@
 
             <dependency>
                 <groupId>org.apache.geronimo.specs</groupId>
-                <artifactId>geronimo-j2ee-connector_1.5_spec</artifactId>
-                <version>2.0.0</version>
+                <artifactId>geronimo-j2ee-connector_1.6_spec</artifactId>
+                <version>1.0-EA-SNAPSHOT</version>
             </dependency>
 
             <dependency>
