diff --git a/geronimo-transaction/src/main/java/org/apache/geronimo/transaction/manager/CommitTask.java b/geronimo-transaction/src/main/java/org/apache/geronimo/transaction/manager/CommitTask.java
index ea8dda6..af245ec 100644
--- a/geronimo-transaction/src/main/java/org/apache/geronimo/transaction/manager/CommitTask.java
+++ b/geronimo-transaction/src/main/java/org/apache/geronimo/transaction/manager/CommitTask.java
@@ -68,6 +68,7 @@
             try {
                 try {
                     manager.getCommitter().commit(manager.getBranchId(), false);
+                    evercommit = true;
                     i.remove();
                 } catch (XAException e) {
                     log.error("Unexpected exception committing " + manager.getCommitter() + "; continuing to commit other RMs", e);
diff --git a/geronimo-transaction/src/main/java/org/apache/geronimo/transaction/manager/TransactionImpl.java b/geronimo-transaction/src/main/java/org/apache/geronimo/transaction/manager/TransactionImpl.java
index f5c4403..6811227 100644
--- a/geronimo-transaction/src/main/java/org/apache/geronimo/transaction/manager/TransactionImpl.java
+++ b/geronimo-transaction/src/main/java/org/apache/geronimo/transaction/manager/TransactionImpl.java
@@ -757,7 +757,7 @@
         XAException cause = commitTask.getCause();
         boolean evercommit = commitTask.isEvercommit();
         if (cause != null) {
-            if (cause.errorCode == XAException.XA_HEURRB&& !evercommit) {
+            if (cause.errorCode == XAException.XA_HEURRB && !evercommit) {
                 throw (HeuristicRollbackException) new HeuristicRollbackException("Error during two phase commit").initCause(cause);
             } else if (cause.errorCode == XAException.XA_HEURRB && evercommit) {
                 throw (HeuristicMixedException) new HeuristicMixedException("Error during two phase commit").initCause(cause);
diff --git a/geronimo-transaction/src/test/java/org/apache/geronimo/transaction/manager/HeuristicTest.java b/geronimo-transaction/src/test/java/org/apache/geronimo/transaction/manager/HeuristicTest.java
new file mode 100644
index 0000000..b0e2683
--- /dev/null
+++ b/geronimo-transaction/src/test/java/org/apache/geronimo/transaction/manager/HeuristicTest.java
@@ -0,0 +1,130 @@
+/*
+ * 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.transaction.manager;
+
+import javax.transaction.HeuristicMixedException;
+import javax.transaction.HeuristicRollbackException;
+import javax.transaction.xa.XAException;
+import junit.framework.TestCase;
+
+/**
+ * Test all combinations of heuristic error codes except XA_HEURHAZ
+ * @version $Rev$ $Date$
+ */
+public class HeuristicTest extends TestCase {
+
+    TransactionLog transactionLog = new MockLog();
+
+    TransactionManagerImpl tm;
+
+    protected void setUp() throws Exception {
+        tm = new TransactionManagerImpl(10,
+                new XidFactoryImpl("WHAT DO WE CALL IT?".getBytes()), transactionLog);
+    }
+
+    protected void tearDown() throws Exception {
+        tm = null;
+    }
+
+    public void test_C_C() throws Exception {
+        expectSuccess(0,0);
+    }
+    public void test_C_HC() throws Exception {
+        expectSuccess(0,XAException.XA_HEURCOM);
+    }
+    public void test_C_HM() throws Exception {
+        expectHeuristicMixedException(0, XAException.XA_HEURMIX);
+    }
+    public void test_C_HR() throws Exception {
+        expectHeuristicMixedException(0, XAException.XA_HEURRB);
+    }
+
+    public void test_HC_C() throws Exception {
+        expectSuccess(XAException.XA_HEURCOM,0);
+    }
+    public void test_HC_HC() throws Exception {
+        expectSuccess(XAException.XA_HEURCOM, XAException.XA_HEURCOM);
+    }
+    public void test_HC_HM() throws Exception {
+        expectHeuristicMixedException(XAException.XA_HEURCOM, XAException.XA_HEURMIX);
+    }
+    public void test_HC_HR() throws Exception {
+        expectHeuristicMixedException(XAException.XA_HEURCOM, XAException.XA_HEURRB);
+    }
+
+    public void test_HM_C() throws Exception {
+        expectHeuristicMixedException(XAException.XA_HEURMIX, 0);
+    }
+    public void test_HM_HC() throws Exception {
+        expectHeuristicMixedException(XAException.XA_HEURMIX, XAException.XA_HEURCOM);
+    }
+    public void test_HM_HM() throws Exception {
+        expectHeuristicMixedException(XAException.XA_HEURMIX, XAException.XA_HEURMIX);
+    }
+    public void test_HM_HR() throws Exception {
+        expectHeuristicMixedException(XAException.XA_HEURMIX, XAException.XA_HEURRB);
+    }
+
+
+    public void test_HR_C() throws Exception {
+        expectHeuristicMixedException(XAException.XA_HEURRB, 0);
+    }
+    public void test_HR_HC() throws Exception {
+        expectHeuristicMixedException(XAException.XA_HEURRB, XAException.XA_HEURCOM);
+    }
+    public void test_HR_HM() throws Exception {
+        expectHeuristicMixedException(XAException.XA_HEURRB, XAException.XA_HEURMIX);
+    }
+    public void test_HR_HR() throws Exception {
+        expectHeuristicRollbackException(XAException.XA_HEURRB, XAException.XA_HEURRB);
+    }
+
+
+    public void expectSuccess(int first, int second) throws Exception {
+        tm.begin();
+        tm.getTransaction().enlistResource(new MockResource("1", first));
+        tm.getTransaction().enlistResource(new MockResource("2", second));
+        tm.commit();
+    }
+    public void expectHeuristicMixedException(int first, int second) throws Exception {
+        tm.begin();
+        tm.getTransaction().enlistResource(new MockResource("1", first));
+        tm.getTransaction().enlistResource(new MockResource("2", second));
+        try {
+            tm.commit();
+            fail();
+        } catch (HeuristicMixedException e) {
+            //expected
+        }
+    }
+    public void expectHeuristicRollbackException(int first, int second) throws Exception {
+        tm.begin();
+        tm.getTransaction().enlistResource(new MockResource("1", first));
+        tm.getTransaction().enlistResource(new MockResource("2", second));
+        try {
+            tm.commit();
+            fail();
+        } catch (HeuristicRollbackException e) {
+            //expected
+        }
+    }
+
+}
diff --git a/geronimo-transaction/src/test/java/org/apache/geronimo/transaction/manager/MockResource.java b/geronimo-transaction/src/test/java/org/apache/geronimo/transaction/manager/MockResource.java
index f9baf9d..0152d57 100644
--- a/geronimo-transaction/src/test/java/org/apache/geronimo/transaction/manager/MockResource.java
+++ b/geronimo-transaction/src/test/java/org/apache/geronimo/transaction/manager/MockResource.java
@@ -36,15 +36,22 @@
     private boolean prepared;
     private boolean committed;
     private boolean rolledback;
-    private Set preparedXids = new HashSet();
-    private Set knownXids = new HashSet();
-    private Set finishedXids = new HashSet();//end was called with TMSUCCESS or TMFAIL
+    private Set<Xid> preparedXids = new HashSet<Xid>();
+    private Set<Xid> knownXids = new HashSet<Xid>();
+    private Set<Xid> finishedXids = new HashSet<Xid>();//end was called with TMSUCCESS or TMFAIL
+    private int errorStatus;
 
     public MockResource(MockResourceManager manager, String xaResourceName) {
         this.manager = manager;
         this.xaResourceName = xaResourceName;
     }
 
+    public MockResource(String xaResourceName, int errorStatus) {
+        this.manager = new MockResourceManager();
+        this.xaResourceName = xaResourceName;
+        this.errorStatus = errorStatus;
+    }
+
     public int getTransactionTimeout() throws XAException {
         return timeout;
     }
@@ -110,6 +117,9 @@
         if (!finishedXids.contains(xid)) {
             throw new XAException(XAException.XAER_PROTO);
         }
+        if (errorStatus != 0) {
+            throw new XAException(errorStatus);
+        }
         preparedXids.remove(xid);
         committed = true;
     }
@@ -131,11 +141,11 @@
     }
 
     public void forget(Xid xid) throws XAException {
-        throw new UnsupportedOperationException();
+//        throw new UnsupportedOperationException();
     }
 
     public Xid[] recover(int flag) throws XAException {
-        return (Xid[]) preparedXids.toArray(new Xid[preparedXids.size()]);
+        return preparedXids.toArray(new Xid[preparedXids.size()]);
     }
 
     public boolean isPrepared() {
diff --git a/geronimo-transaction/src/test/java/org/apache/geronimo/transaction/manager/MockResourceManager.java b/geronimo-transaction/src/test/java/org/apache/geronimo/transaction/manager/MockResourceManager.java
index 82a5050..78a96eb 100644
--- a/geronimo-transaction/src/test/java/org/apache/geronimo/transaction/manager/MockResourceManager.java
+++ b/geronimo-transaction/src/test/java/org/apache/geronimo/transaction/manager/MockResourceManager.java
@@ -22,7 +22,6 @@
 import java.util.Map;
 import java.util.Set;
 
-import javax.transaction.SystemException;
 import javax.transaction.xa.XAException;
 import javax.transaction.xa.XAResource;
 import javax.transaction.xa.Xid;
@@ -33,20 +32,17 @@
  * @version $Rev$ $Date$
  */
 public class MockResourceManager {
-    private boolean willCommit;
-    private Map xids = new HashMap();
+    private Map<Xid, Set<XAResource>> xids = new HashMap<Xid, Set<XAResource>>();
 
-    public MockResourceManager(boolean willCommit) {
-        this.willCommit = willCommit;
+    public MockResourceManager() {
     }
 
     public MockResource getResource(String xaResourceName) {
-        MockResource mockResource =  new MockResource(this, xaResourceName);
-        return mockResource;
+        return new MockResource(this, xaResourceName);
     }
 
     public void join(Xid xid, XAResource xaRes) throws XAException {
-        Set resSet = (Set) xids.get(xid);
+        Set<XAResource> resSet = xids.get(xid);
         if (resSet == null) {
             throw new XAException(XAException.XAER_NOTA);
         }
@@ -57,7 +53,7 @@
         if (xids.containsKey(xid)) {
             throw new XAException(XAException.XAER_DUPID);
         }
-        Set resSet = new HashSet();
+        Set<XAResource> resSet = new HashSet<XAResource>();
         resSet.add(xaRes);
         xids.put(xid, resSet);
     }
diff --git a/geronimo-transaction/src/test/java/org/apache/geronimo/transaction/manager/ProtocolTest.java b/geronimo-transaction/src/test/java/org/apache/geronimo/transaction/manager/ProtocolTest.java
index 122b4a3..7624ca7 100644
--- a/geronimo-transaction/src/test/java/org/apache/geronimo/transaction/manager/ProtocolTest.java
+++ b/geronimo-transaction/src/test/java/org/apache/geronimo/transaction/manager/ProtocolTest.java
@@ -32,8 +32,8 @@
 
     protected void setUp() throws Exception {
         tm = new TransactionManagerImpl();
-        mrm1 = new MockResourceManager(true);
-        mrm2 = new MockResourceManager(true);
+        mrm1 = new MockResourceManager();
+        mrm2 = new MockResourceManager();
         mr11 = new MockResource(mrm1, "mr11");
         mr12 = new MockResource(mrm1, "mr12");
         mr21 = new MockResource(mrm2, "mr21");
diff --git a/geronimo-transaction/src/test/java/org/apache/geronimo/transaction/manager/TransactionManagerImplTest.java b/geronimo-transaction/src/test/java/org/apache/geronimo/transaction/manager/TransactionManagerImplTest.java
index f79f4e9..372a29f 100644
--- a/geronimo-transaction/src/test/java/org/apache/geronimo/transaction/manager/TransactionManagerImplTest.java
+++ b/geronimo-transaction/src/test/java/org/apache/geronimo/transaction/manager/TransactionManagerImplTest.java
@@ -33,10 +33,10 @@
  */
 public class TransactionManagerImplTest extends TestCase {
 
-    MockResourceManager rm1 = new MockResourceManager(true);
+    MockResourceManager rm1 = new MockResourceManager();
     MockResource r1_1 = rm1.getResource("rm1_1");
     MockResource r1_2 = rm1.getResource("rm1_2");
-    MockResourceManager rm2 = new MockResourceManager(true);
+    MockResourceManager rm2 = new MockResourceManager();
     MockResource r2_1 = rm2.getResource("rm2_1");
     MockResource r2_2 = rm2.getResource("rm2_2");
 
diff --git a/geronimo-transaction/src/test/java/org/apache/geronimo/transaction/manager/TestTransactionManager.java b/geronimo-transaction/src/test/java/org/apache/geronimo/transaction/manager/TransactionManagerTest.java
similarity index 94%
rename from geronimo-transaction/src/test/java/org/apache/geronimo/transaction/manager/TestTransactionManager.java
rename to geronimo-transaction/src/test/java/org/apache/geronimo/transaction/manager/TransactionManagerTest.java
index 558b183..ae6b03c 100644
--- a/geronimo-transaction/src/test/java/org/apache/geronimo/transaction/manager/TestTransactionManager.java
+++ b/geronimo-transaction/src/test/java/org/apache/geronimo/transaction/manager/TransactionManagerTest.java
@@ -29,7 +29,7 @@
  *
  * @version $Rev$ $Date$
  */
-public class TestTransactionManager extends TestCase {
+public class TransactionManagerTest extends TestCase {
     TransactionManager tm;
     MockResourceManager rm1, rm2, rm3;
 
@@ -113,8 +113,8 @@
 
     protected void setUp() throws Exception {
         tm = new TransactionManagerImpl();
-        rm1 = new MockResourceManager(true);
-        rm2 = new MockResourceManager(true);
-        rm3 = new MockResourceManager(false);
+        rm1 = new MockResourceManager();
+        rm2 = new MockResourceManager();
+        rm3 = new MockResourceManager();
     }
 }
diff --git a/geronimo-transaction/src/test/java/org/apache/geronimo/transaction/manager/XidImporterTest.java b/geronimo-transaction/src/test/java/org/apache/geronimo/transaction/manager/XidImporterTest.java
index 8f447bb..72c51c0 100644
--- a/geronimo-transaction/src/test/java/org/apache/geronimo/transaction/manager/XidImporterTest.java
+++ b/geronimo-transaction/src/test/java/org/apache/geronimo/transaction/manager/XidImporterTest.java
@@ -33,10 +33,10 @@
  * */
 public class XidImporterTest extends TestCase{
 
-    MockResourceManager rm1 = new MockResourceManager(true);
+    MockResourceManager rm1 = new MockResourceManager();
     MockResource r1_1 = new MockResource(rm1, "rm1");
     MockResource r1_2 = new MockResource(rm1, "rm1");
-    MockResourceManager rm2 = new MockResourceManager(true);
+    MockResourceManager rm2 = new MockResourceManager();
     MockResource r2_1 = new MockResource(rm2, "rm2");
     MockResource r2_2 = new MockResource(rm2, "rm2");
 
diff --git a/geronimo-transaction/src/test/resources/META-INF/NOTICE.txt b/geronimo-transaction/src/test/resources/META-INF/NOTICE.txt
index bb6397e..1bff2e3 100644
--- a/geronimo-transaction/src/test/resources/META-INF/NOTICE.txt
+++ b/geronimo-transaction/src/test/resources/META-INF/NOTICE.txt
@@ -1,5 +1,5 @@
 Apache Geronimo 
-Copyright 2003-2009 The Apache Software Foundation
+Copyright 2003-2010 The Apache Software Foundation
 
 This product includes software developed by
 The Apache Software Foundation (http://www.apache.org/).
