diff --git a/geronimo-connector/src/main/java/org/apache/geronimo/connector/GeronimoBootstrapContext.java b/geronimo-connector/src/main/java/org/apache/geronimo/connector/GeronimoBootstrapContext.java
index 8847a01..0687883 100644
--- a/geronimo-connector/src/main/java/org/apache/geronimo/connector/GeronimoBootstrapContext.java
+++ b/geronimo-connector/src/main/java/org/apache/geronimo/connector/GeronimoBootstrapContext.java
@@ -23,6 +23,7 @@
 import javax.resource.spi.work.WorkManager;
 import javax.resource.spi.work.WorkContext;
 import javax.transaction.TransactionSynchronizationRegistry;
+import org.apache.geronimo.connector.work.GeronimoWorkManager;
 
 /**
  * GBean BootstrapContext implementation that refers to externally configured WorkManager
@@ -31,8 +32,9 @@
  * @version $Rev$ $Date$
  */
 public class GeronimoBootstrapContext implements javax.resource.spi.BootstrapContext {
-    private final WorkManager workManager;
+    private final GeronimoWorkManager workManager;
     private final XATerminator xATerminator;
+    private final TransactionSynchronizationRegistry transactionSynchronizationRegistry;
 
     /**
      * Default constructor for use as a GBean Endpoint.
@@ -40,16 +42,19 @@
     public GeronimoBootstrapContext() {
         workManager = null;
         xATerminator = null;
+        transactionSynchronizationRegistry = null;
     }
 
     /**
      * Normal constructor for use as a GBean.
      * @param workManager
      * @param xaTerminator
+     * @param transactionSynchronizationRegistry
      */
-    public GeronimoBootstrapContext(WorkManager workManager, XATerminator xaTerminator) {
+    public GeronimoBootstrapContext(GeronimoWorkManager workManager, XATerminator xaTerminator, TransactionSynchronizationRegistry transactionSynchronizationRegistry) {
         this.workManager = workManager;
         this.xATerminator = xaTerminator;
+        this.transactionSynchronizationRegistry = transactionSynchronizationRegistry;
     }
 
 
@@ -75,11 +80,11 @@
     }
 
     public TransactionSynchronizationRegistry getTransactionSynchronizationRegistry() {
-        return null;
+        return transactionSynchronizationRegistry;
     }
 
     public boolean isContextSupported(Class<? extends WorkContext> aClass) {
-        return false;
+        return workManager.isContextSupported(aClass);
     }
 
 }
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 ca53282..22f8449 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
@@ -24,6 +24,7 @@
 import javax.resource.spi.work.ExecutionContext;
 import javax.resource.spi.work.Work;
 import javax.resource.spi.work.WorkCompletedException;
+import javax.resource.spi.work.WorkContext;
 import javax.resource.spi.work.WorkException;
 import javax.resource.spi.work.WorkListener;
 import javax.resource.spi.work.WorkManager;
@@ -207,4 +208,13 @@
         }
     }
 
+    public boolean isContextSupported(Class<? extends WorkContext> aClass) {
+        for (WorkContextHandler workContextHandler: workContextHandlers) {
+            if (workContextHandler.supports(aClass)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
 }
diff --git a/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/HintsContextHandler.java b/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/HintsContextHandler.java
new file mode 100644
index 0000000..0a314f1
--- /dev/null
+++ b/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/HintsContextHandler.java
@@ -0,0 +1,46 @@
+/*
+ * 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.HintsContext;
+import javax.resource.spi.work.WorkCompletedException;
+import javax.resource.spi.work.WorkContext;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class HintsContextHandler implements WorkContextHandler<HintsContext> {
+
+    public void before(HintsContext workContext) throws WorkCompletedException {
+    }
+
+    public void after(HintsContext workContext) throws WorkCompletedException {
+    }
+
+    public boolean supports(Class<? extends WorkContext> clazz) {
+        return HintsContext.class.isAssignableFrom(clazz);
+    }
+
+    public boolean required() {
+        return false;
+    }
+
+}
diff --git a/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/TransactionContextHandler.java b/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/TransactionContextHandler.java
index 62ed49d..d7433d6 100644
--- a/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/TransactionContextHandler.java
+++ b/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/TransactionContextHandler.java
@@ -22,6 +22,7 @@
 
 import javax.resource.spi.work.TransactionContext;
 import javax.resource.spi.work.WorkCompletedException;
+import javax.resource.spi.work.WorkContext;
 import javax.transaction.xa.XAException;
 import javax.transaction.InvalidTransactionException;
 import javax.transaction.SystemException;
@@ -70,8 +71,8 @@
         }
     }
 
-    public Class<TransactionContext> getHandledClass() {
-        return TransactionContext.class;
+    public boolean supports(Class<? extends WorkContext> clazz) {
+        return TransactionContext.class.isAssignableFrom(clazz);
     }
 
     public boolean required() {
diff --git a/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/WorkContextHandler.java b/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/WorkContextHandler.java
index 431de6c..5ea8d18 100644
--- a/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/WorkContextHandler.java
+++ b/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/WorkContextHandler.java
@@ -32,7 +32,7 @@
 
     void after(E workContext) throws WorkCompletedException;
 
-    Class<E> getHandledClass(); 
+    boolean supports(Class<? extends WorkContext> clazz); 
 
     boolean required();
 
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 e8c44bb..39f2026 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
@@ -312,9 +312,11 @@
                 try {
                     txWorkContext.setTransactionTimeout(executionContext.getTransactionTimeout());
                 } catch (NotSupportedException e) {
-                    throw new WorkRejectedException("Could not read tx timeout");
+                    //not set, continue to not set it.
                 }
+                txWorkContext.setXid(executionContext.getXid());
                 workContexts = Collections.<WorkContext>singletonList(txWorkContext);
+                log.info("Translated ExecutionContext to TransactionContext");
             } else if (adaptee instanceof WorkContextProvider) {
                 workContexts = ((WorkContextProvider) adaptee).getWorkContexts();
             }
@@ -323,21 +325,28 @@
                 boolean found = false;
                 for (Iterator<WorkContextHandler> it = workContextHandlers.iterator(); it.hasNext();) {
                     WorkContextHandler workContextHandler = it.next();
-                    //TODO is this the right way around?
-                    if (workContext.getClass().isAssignableFrom(workContextHandler.getHandledClass())) {
+                    log.info("sorting WorkContextHandler: " + workContextHandler + " for work context: " + workContext);
+                    if (workContextHandler.supports(workContext.getClass())) {
                         it.remove();
+                        log.info("adding sorted WorkContextHandler: " + workContextHandler);
                         sortedHandlers.add(workContextHandler);
                         found = true;
                         break;
                     }
                 }
                 if (!found) {
-                    throw new WorkCompletedException("Duplicate or unhandled WorkContext: " + workContext, WorkContextErrorCodes.UNSUPPORTED_CONTEXT_TYPE);
+                    for (WorkContextHandler workContextHandler: sortedHandlers) {
+                        if (workContextHandler.supports(workContext.getClass())) {
+                            throw new WorkCompletedException("Duplicate WorkContext: " + workContext, WorkContextErrorCodes.DUPLICATE_CONTEXTS);
+                        }
+                    }
+                    throw new WorkCompletedException("Unhandled WorkContext: " + workContext, WorkContextErrorCodes.UNSUPPORTED_CONTEXT_TYPE);
                 }
             }
             for (Iterator<WorkContextHandler> it = workContextHandlers.iterator(); it.hasNext();) {
                 WorkContextHandler workContextHandler = it.next();
                 if (!workContextHandler.required()) {
+                    log.info("Removing non-required WorkContextHandler with no context: " + workContextHandler);
                     it.remove();
                 }
             }
@@ -345,9 +354,12 @@
 
             int i = 0;
             for (WorkContext workContext : workContexts) {
-                sortedHandlers.get(i++).before(workContext);
+                WorkContextHandler contextHandler = sortedHandlers.get(i++);
+                log.info("calling before on WorkContextHandler: " + contextHandler + " with workContext: " + workContext);
+                contextHandler.before(workContext);
             }
             for (WorkContextHandler workContextHandler: workContextHandlers) {
+                log.info("calling before on WorkContextHandler: " + workContextHandler + " with null workContext");
                 workContextHandler.before(null);
             }
             try {
@@ -355,9 +367,12 @@
             } finally {
                 int j = 0;
                 for (WorkContext workContext : workContexts) {
-                    sortedHandlers.get(j++).after(workContext);
+                    WorkContextHandler contextHandler = sortedHandlers.get(j++);
+                    log.info("calling after on WorkContextHandler: " + contextHandler + " with workContext: " + workContext);
+                    contextHandler.after(workContext);
                 }
                 for (WorkContextHandler workContextHandler: workContextHandlers) {
+                    log.info("calling after on WorkContextHandler: " + workContextHandler + " with null workContext");
                     workContextHandler.after(null);
                 }
             }
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 084f26e..e7bd1a2 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
@@ -99,7 +99,7 @@
         GeronimoTransactionManager transactionManager = new GeronimoTransactionManager();
         TransactionContextHandler txWorkContextHandler = new TransactionContextHandler(transactionManager);
         GeronimoWorkManager manager = new GeronimoWorkManager(pool, pool, pool, Collections.<WorkContextHandler>singletonList(txWorkContextHandler));
-        GeronimoBootstrapContext context = new GeronimoBootstrapContext(manager, transactionManager);
+        GeronimoBootstrapContext context = new GeronimoBootstrapContext(manager, transactionManager, transactionManager);
         WorkManager wm = context.getWorkManager();
 
         assertSame("Make sure it is the same object", manager, wm);
@@ -112,7 +112,7 @@
         GeronimoTransactionManager transactionManager = new GeronimoTransactionManager();
         TransactionContextHandler txWorkContextHandler = new TransactionContextHandler(transactionManager);
         GeronimoWorkManager manager = new GeronimoWorkManager(pool, pool, pool, Collections.<WorkContextHandler>singletonList(txWorkContextHandler));
-        GeronimoBootstrapContext context = new GeronimoBootstrapContext(manager, transactionManager);
+        GeronimoBootstrapContext context = new GeronimoBootstrapContext(manager, transactionManager, transactionManager);
         XATerminator xat = context.getXATerminator();
 
         assertSame("Make sure it is the same object", transactionManager, xat);
@@ -122,7 +122,7 @@
      * Tests getTimer
      */
     public void testGetTimer() throws Exception {
-        GeronimoBootstrapContext context = new GeronimoBootstrapContext(null, null);
+        GeronimoBootstrapContext context = new GeronimoBootstrapContext(null, null, null);
         Timer t = context.createTimer();
         assertNotNull("Object is not null", t);
     }
