Index: src/NUnitCore/core/TestMethod.cs
===================================================================
RCS file: /cvsroot/nunit/nunit20/src/NUnitCore/core/TestMethod.cs,v
retrieving revision 1.50
diff -u -r1.50 TestMethod.cs
--- src/NUnitCore/core/TestMethod.cs	6 Jul 2009 05:27:46 -0000	1.50
+++ src/NUnitCore/core/TestMethod.cs	10 Aug 2009 16:40:21 -0000
@@ -280,7 +280,7 @@
                 {
                     int index = tearDownMethods.Length;
                     while (--index >= 0)
-                        tearDownMethods[index].Invoke(tearDownMethods[index].IsStatic ? null : this.Fixture, new object[0]);
+                        Reflect.InvokeMethod(tearDownMethods[index], tearDownMethods[index].IsStatic ? null : this.Fixture);
                 }
 			}
 			catch(Exception ex)
Index: src/NUnitCore/tests/SetUpTest.cs
===================================================================
RCS file: /cvsroot/nunit/nunit20/src/NUnitCore/tests/SetUpTest.cs,v
retrieving revision 1.5
diff -u -r1.5 SetUpTest.cs
--- src/NUnitCore/tests/SetUpTest.cs	18 Apr 2009 02:26:14 -0000	1.5
+++ src/NUnitCore/tests/SetUpTest.cs	10 Aug 2009 16:40:21 -0000
@@ -4,6 +4,7 @@
 // copyright ownership at http://nunit.org.
 // ****************************************************************
 
+using System;
 using NUnit.Framework;
 using NUnit.Core.Builders;
 using NUnit.TestUtilities;
@@ -83,5 +84,36 @@
             Assert.IsTrue(fixture.wasBaseSetUpCalledFirst, "SetUp Order");
             Assert.IsTrue(fixture.wasBaseTearDownCalledLast, "TearDown Order");
         }
+
+        [Test]
+        public void SetupRecordsOriginalExceptionThownByTestCase()
+        {
+            Exception e = new Exception("Test message for exception thrown from setup");
+            SetupAndTearDownExceptionFixture fixture = new SetupAndTearDownExceptionFixture();
+            fixture.setupException = e;
+            TestResult result = TestBuilder.RunTestFixture(fixture);
+            Assert.IsTrue(result.HasResults, "Fixture test should have child result.");
+            result = (TestResult)result.Results[0];
+            Assert.AreEqual(result.ResultState, ResultState.Error, "Test should be in error state");
+            //TODO: below assert fails now, a bug?
+            //Assert.AreEqual(result.FailureSite, FailureSite.SetUp, "Test should be failed at setup site");
+            string expected = string.Format("{0} : {1}", e.GetType().FullName, e.Message);
+            Assert.AreEqual(expected, result.Message);
+        }
+
+        [Test]
+        public void TearDownRecordsOriginalExceptionThownByTestCase()
+        {
+            Exception e = new Exception("Test message for exception thrown from tear down");
+            SetupAndTearDownExceptionFixture fixture = new SetupAndTearDownExceptionFixture();
+            fixture.tearDownException = e;
+            TestResult result = TestBuilder.RunTestFixture(fixture);
+            Assert.IsTrue(result.HasResults, "Fixture test should have child result.");
+            result = (TestResult)result.Results[0];
+            Assert.AreEqual(result.ResultState, ResultState.Error, "Test should be in error state");
+            Assert.AreEqual(result.FailureSite, FailureSite.TearDown, "Test should be failed at tear down site");
+            string expected = string.Format("TearDown : {0} : {1}", e.GetType().FullName, e.Message);
+            Assert.AreEqual(expected, result.Message);
+        }
 	}
 }
Index: src/tests/test-assembly/SetUpTest.cs
===================================================================
RCS file: /cvsroot/nunit/nunit20/src/tests/test-assembly/SetUpTest.cs,v
retrieving revision 1.4
diff -u -r1.4 SetUpTest.cs
--- src/tests/test-assembly/SetUpTest.cs	18 Apr 2009 20:44:16 -0000	1.4
+++ src/tests/test-assembly/SetUpTest.cs	10 Aug 2009 16:40:22 -0000
@@ -150,4 +150,26 @@
             wasBaseTearDownCalledLast = !wasTearDownCalled;
         }
     }
+
+    [TestFixture]
+    public class SetupAndTearDownExceptionFixture
+    {
+        public Exception setupException;
+        public Exception tearDownException;
+
+        [SetUp] 
+        public void SetUp()
+        {
+            if (setupException != null) throw setupException;
+        }
+
+        [TearDown]
+        public void TearDown()
+        {
+            if (tearDownException!=null) throw tearDownException;
+        }
+
+        [Test]
+        public void TestOne() {}
+    }
 }
